-
在]中寻找到emc datadomain 2500存储设备的维护手册
资源介绍
为了启动任务,OSStartHighRdy()从任务控制块(OS_TCB)[程序清单L9.3(1)]中找到指向
堆栈的指针,然后运行POP DS [程序清单L9.3(2)], POP ES [程序清单L9.3(3)], POPA [程序
清单L9.3(4)], 和 IRET [程序清单L9.3(5)]指令。此处笔者将任务堆栈指针保存在任务控制块
的开头,这样使得堆栈指针的存取在汇编语言中更容易操作。
当执行了IRET指令后,CPU会从(SS:SP)指向的堆栈中恢复各个寄存器的值并执行中断前的指
令。SS:SP+4指向传递给任务的参数pdata。
程序清单L 9.3 OSStartHighRdy().
_OSStartHighRdy PROC FAR
MOV AX, SEG _OSTCBHighRdy ; 载入 DS
MOV DS, AX ;
LES BX, DWORD PTR DS:_OSTCBHighRdy ; SS:SP = OSTCBHighRdy->OSTCBStkPtr
(1)
MOV SS, ES:[BX+2] ;
MOV SP, ES:[BX+0] ;
;
POP DS ; 恢复任务环境 (2)
POP ES ; (3)
POPA ; (4)
;
IRET ; 运行任务 (5)
_OSStartHighRdy ENDP
9.04.02 OSCtxSw()
OSCtxSw()是一个任务级的任务切换函数(在任务中调用,区别于在中断程序中调用的
OSIntCtxSw())。在80x86系统上,它通过执行一条软中断的指令来实现任务切换。软中断向量
指向OSCtxSw()。在µC/OS-II中,如果任务调用了某个函数,而该函数的执行结果可能造成系统
任务重新调度(例如试图唤醒了一个优先级更高的任务),则在函数的末尾会调用OSSched(),
如果OSSched()判断需要进行任务调度,会找到该任务控制块OS_TCB的地址,并将该地址拷贝到
OSTCBHighRdy,然后通过宏OS_TASK_SW()执行软中断进行任务切换。注意到在此过程中,变量
OSTCBCur始终包含一个指向当前运行任务OS_TCB的指针。程序清单L9.4为OSCtxSw()的代码。
图F9.4是任务被挂起或被唤醒时的堆栈结构。在80x86处理器上,任务调用OS_TASK_SW()执
行软中断指令后[图F9.4/程序清单L9.4(1)],先向堆栈中压入返回地址(段地址和偏移量),
然后是状态字寄存器SW。紧接着用PUSHA [图F9.4/程序清单L9.4(2)], PUSH ES [图F9.4/程序
清单L9.4(3)],和 PUSH DS [图F9.4/程序清单L9.4(4)]保存任务运行环境。最后用OSCtxSw()在
任务OS_TCB中保存SS和SP寄存器。
任务环境保存完后,将调用用户定义的对外接口函数OSTaskSwHook()[程序清单L9.4(6)]。
请注意,此时 OSTCBCur指向当前任务 OS_TCB, OSTCBHighRdy指向新任务的 OS_TCB。在
OSTaskSwHook()中,用户可以访问这两个任务的OS_TCB。如果不使用对外接口函数,请在头文
件中把相应的开关选项关闭,加快任务切换的速度。