论文首页哲学论文经济论文法学论文教育论文文学论文历史论文理学论文工学论文医学论文管理论文艺术论文 |
比如,在其ex21.c文件中定义的任务堆栈语句为:
OS_STK TaskStartStk[TASK_STK_SIZE]; /*启动任务堆栈*/
OS_STK TaskClkStk[TASK_STK_SIZE]; /*时钟任务堆栈*/
OS_STK TasklStk[TASK_STK_SIZE]; /*任务1#,任务堆栈*/
……
以上各任务堆栈数组变量在初始化函数OSTCBInit()中被会给了任务控制块OS_TCB的OSTCBStkPtr变量。在任务切换时,μC/OS-II调用OSCtxSw汇编过程(OS_CPU_A.ASM文件),将CPU的SP指针指向该变量,从而使每个任务使用独立的任务堆栈。
LES BX,DWORD PTR DS:_OSTCBCur
;保存挂起任务的堆栈指针SP
MOV ES:[BX 2],SS
MOV ES:[BX 0],SP
……
LESB X,DWORD PTR DS:_OSTCBHighRdy ;切换SP到要运行任务的堆栈空间
MOV SS,ES:[BX 2]
MOV SP,ES:[BX]
……
在代码中,变量OSTCBHighRdy(OSTCBCur)和堆栈指针变量OSTCBStkPtr的数值是同同的,因为OSTCBStkPtr是结构OSTCBHighRdy的第一个变量。
这种任务栈处理方法的缺点是可能造成空间的浪费。因为一个任务如果堆栈满了,该任务也就无法运行,即使其它任务的堆栈还有空间可用。当然,这种方法的好处是任务栈切换的时间非常短,只需要几条指令。
4