垫层厚度不够:任务挂起和中断

来源:百度文库 编辑:偶看新闻 时间:2024/04/28 11:55:09
挂起: 所谓挂起一个任务,就是暂停这个任务运行,它仍然占用一定的内存空间,有可能对CPU也在占用着.示意如图
任务切换宏OS_TASK_SW()任务切换的工作主要是靠OSCtxSw()来完成的。它需要做7项工作:(1) 把被终止任务的断点指针保存到任务堆栈中;(2) 把CPU通用寄存器的内容保存到任务堆栈中;(3) 把被终止任务的任务堆栈指针当前值保存到该任务的任务控制块的OSTCBStkPt中(4) 获得待运行任务的任务控制块;(5) 使CPU通过任务控制获得待运行任务的堆栈指针;(6) 把待运行任务堆栈中通用寄存器的内容恢复到CPU的通用寄存器中;(7) 使CPU获得待运行任务的断点指针。示意代码:viod OSCtxSw(void){用压栈指令把CPU通用寄存器R1,R2..压入堆栈;OSTCBCur->OSTCBStkPtr = SP; //在中止任务控制块中保存SPOSTCBCur = OSTCBHighRdy; //任务控制块的切换OSPrioCur = OSPrioHighRdy;SP = OSTCBCur->OSTCBStkPtr;用出栈指令把R1,R2..弹入CPU的通用寄存器;IRET; //中断返回,使PC指向待运行的任务}当然OSSemPend()等待信号量等一系列函数也使任务进入等待状态,但是任务挂起函数OSTaskSuspend()可以挂起当前任务,也可以挂起其他任务;而等待信号量OSSemPend()只能挂起当前任务,而且可以多个任务等待同一个信号量,实现任务的同步;OSSemPend()主要是判断待要挂起的任务是否调用这个函数任务本身。(1) 如果是任务本身是,则必须删除就绪表中的就绪标志,并在任务控制成员OSTCBStat中做挂起记录,然后引发一次任务调度,以使CPU去运行就绪的其他任务;(2) 如果不是本身,那么只要删除任务就绪表中被挂起任务的就绪标志,并在任务控制块成员OSTCBStat中做挂起标志。任务中断 : 系统接收到中断请求后,如果这是CPU处于中断允许状态(即中断是开放的),系统就会终止正在运行的当前任务,而按照中断向量(中断服务子程序的入口地址)的指向转而去运行中断服务子程序(ISR);当子程序运行完毕后,系统会根据情况返回到被中止的任务继续运行,或者转而运行一个更高优先级的就绪任务。 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/chengocean/archive/2010/12/28/6103421.aspx