- /******************************************************/
- /********** 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)
- {
-
- }
-
复制代码
|