标题:
OS_CPU_C.c
[打印本页]
作者:
hongniu
时间:
2015-6-24 21:22
标题:
OS_CPU_C.c
/******************************************************/
/********** OS_CPU_C.c*********************************/
/******************************************************/
#include <avr/io.h>
#include "os_cpu.h"
#include "os_cfg.h"
#include "ucos_ii.h"
/* changed by dragontorch on 2009.11.10 */
/*1: 任务的堆栈初始化函数,这里是要模拟一次中断发生以后任务的各种数据入栈的过程,其中最*/
/* 开始先要入栈的是任务的首地址即该函数的第一个参数task,是个指向该任务函数的一个指针*/
/* ,因为后面在任务级的任务切换函数OSCtxSw()和中断级的任务切换函数OSintCtxSw()切换任务*/
/* 的时候最后要利用任务返回指令ret将最开始入栈的任务的地址装入PC,从而使要启动的任务开*/
/* 始运行. */
/* */
/*2: 然后开始入栈的是cpu的各个寄存器,这里对于AVRmage128来说就是R0~R31,但是里面还要注意*/
/* 的一点就是这里根据编译器的不同把将要传递给任务的参数的地址p_arg传递给任务,UCOS里面*/
/* 所有的任务的参数只有一个就是p_arg,比如建立一个任务void mytask(*p_arg);这里传递*/
/* 给任务的参数就是一个指针,它是指向传递给任务参数的一个指针,任务得到这一个大小为两个*/
/* 字节的参数就可以在这个地址处取到需要的不同数量的参数,这里的这个指针在该函数编译的*/
/* 的存放在R25和R24里面的,这是WINAVR编译器的编译规则所决定的,对于ICCAVR就是R16和R17*/
/* 了,在任务切换以后,这个放在R25和R24里面的参数就正好被传递给了任务。 */
/* */
/*3: 这里的类似于 */
/* *stk--=0x31; */
/* *stk--=0x30; */
/* *stk--=0x29; */
/* 这样的语句里面的数字0x31,0x29是示意性的或者说象征性的给赋得值,就是为了说明以后出栈*/
/* 入栈的寄存器的顺序而已,当然除了给R25和R24以外,对于ICCAVR就是R16和R17,其他的所付*/
/* 的值是没有实际意义的,因为后面任务被切换开始运行的时候就会被新的值覆盖了。所以我也*/
/* 可以这样做,*stk--=0x00;//R31除R25和R24以外,全部赋0,然后在后面的注释里面写明是哪个*/
/* 寄存器的栈位。 */
/* */
/*4: 最后将SREG入栈,并返回这个初始化好了的堆栈,事实上这里应该叫任务堆栈,但这个是用软*/
/* 件模拟的堆栈,后面等任务切换的时候将这个软件堆栈的指针付给了SP就相当于是硬件堆栈了*/
OS_STK *OSTaskStkInit(void (*task)(void *pd),void *p_arg,OS_STK *ptos,INT16U opt)
{
OS_STK *stk=ptos;
*stk--=((unsigned int)task)&0xff;
*stk--=((unsigned int)task)>>8;
/*任务的首地址最先入栈,因为ret指令即自动将这个地址装入PC,开始运行任务*/
/*
*stk--=(INT8U)(task)
*stk--=(INT8U)(task>>8);
*/
*stk--=0x31;//R31入栈
*stk--=0x30;//R30入栈
*stk--=0x29;//R29入栈
*stk--=0x28;//R28入栈
*stk--=0x27;//R27入栈
*stk--=0x26;//R26入栈
*stk--=((unsigned int)p_arg)&0xff; //R25入栈
*stk--=((unsigned int)p_arg)>>8; //R24入栈
/*R25和R24存放任务的首地址*/
*stk--=0x23;//R23入栈
*stk--=0x22;//R22入栈
*stk--=0x21;//R21入栈
*stk--=0x20;//R20入栈
*stk--=0x19;//R19入栈
*stk--=0x18;//R18入栈
*stk--=0x17;//R17入栈
*stk--=0x16;//R16入栈
*stk--=0x15;//R15入栈
*stk--=0x14;//R14入栈
*stk--=0x13;//R13入栈
*stk--=0x12;//R12入栈
*stk--=0x11;//R11入栈
*stk--=0x10;//R10入栈
*stk--=0x09;//R9入栈
*stk--=0x08;//R8入栈
*stk--=0x07;//R7入栈
*stk--=0x06;//R6入栈
*stk--=0x05;//R5入栈
*stk--=0x04;//R4入栈
*stk--=0x03;//R3入栈
*stk--=0x02;//R2入栈
*stk--=0x01;//R1入栈
*stk--=0x00;//R0入栈
*stk--=0x80;//SREG入栈
return stk;//可以看到这个函数的返回类型就是堆栈指针类型,所以返回这个栈指针,以后这个指针就要装入SP以将任务的数据恢复到CPU当中
}
void OSDebugInit(void)
{
}
void OSTaskCreateHook(OS_TCB *ptcb)
{
ptcb=ptcb;
}
void OSTaskDelHook(OS_TCB *ptcb)
{
ptcb=ptcb;
}
void OSTaskIdleHook(void)
{
}
void OSTaskStatHook(void)
{
}
void OSTaskSwHook(void)
{
}
void OSTCBInitHook(OS_TCB *ptcb)
{
ptcb=ptcb;
}
void OSTimeTickHook(OS_TCB *ptcb)
{
}
void OSInitHookBegin(void)
{
}
void OSInitHookEnd(void)
{
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1