首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

任务挂起和中断

任务挂起和中断

今天看uc/os分不清任务挂起和中断的概念,于是猛找资料,终于有了点心得。
挂起:
所谓挂起一个任务,就是暂停这个任务运行,它仍然占用一定的内存空间,有可能对CPU也在占用着.
[url=]示意如图[/url]
任务切换宏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; //在中止任务控制块中保存SP
OSTCBCur = OSTCBHighRdy; //任务控制块的切换
OSPrioCur = OSPrioHighRdy;
SP = OSTCBCur->OSTCBStkPtr;
用出栈指令把R1,R2..弹入CPU的通用寄存器;
IRET; //中断返回,使PC指向待运行的任务
}
当然OSSemPend()等待信号量等一系列函数也使任务进入等待状态,但是任务挂起函数OSTaskSuspend()可以挂起当前任务,也可以挂起其他任务;而等待信号量OSSemPend()只能挂起当前任务,而且可以多个任务等待同一个信号量,实现任务的同步;
OSSemPend()主要是判断待要挂起的任务是否调用这个函数任务本身。
(1) 如果是任务本身是,则必须删除就绪表中的就绪标志,并在任务控制成员OSTCBStat中做挂起记录,然后引发一次任务调度,以使CPU去运行就绪的其他任务;
(2) 如果不是本身,那么只要删除任务就绪表中被挂起任务的就绪标志,并在任务控制块成员OSTCBStat中做挂起标志。
任务中断
系统接收到中断请求后,如果这是CPU处于中断允许状态(即中断是开放的),系统就会终止正在运行的当前任务,而按照中断向量(中断服务子程序的入口地址)的指向转而去运行中断服务子程序(ISR);当子程序运行完毕后,系统会根据情况返回到被中止的任务继续运行,或者转而运行一个更高优先级的就绪任务。
继承事业,薪火相传
返回列表