uocs实时操作系统学习 5

  • 陌路绝途
  • LV5工程师
  • |      2014-06-18 18:03:23
  • 浏览量 1080
  • 回复:6


今天看uc/os分不清任务挂起和中断的概念,于是猛找资料,终于有了点心得。

挂起:

所谓挂起一个任务,就是暂停这个任务运行,它仍然占用一定的内存空间,有可能对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; //在中止任务控制块中保存SP

OSTCBCur = OSTCBHighRdy; //任务控制块的切换

OSPrioCur = OSPrioHighRdy;

SP = OSTCBCur->OSTCBStkPtr;

用出栈指令把R1,R2..弹入CPU的通用寄存器;

IRET; //中断返回,使PC指向待运行的任务

}

当然OSSemPend()等待信号量等一系列函数也使任务进入等待状态,但是任务挂起函数OSTaskSuspend()可以挂起当前任务,也可以挂起其他任务;而等待信号量OSSemPend()只能挂起当前任务,而且可以多个任务等待同一个信号量,实现任务的同步;

OSSemPend()主要是判断待要挂起的任务是否调用这个函数任务本身。

(1) 如果是任务本身是,则必须删除就绪表中的就绪标志,并在任务控制成员OSTCBStat中做挂起记录,然后引发一次任务调度,以使CPU去运行就绪的其他任务;

(2) 如果不是本身,那么只要删除任务就绪表中被挂起任务的就绪标志,并在任务控制块成员OSTCBStat中做挂起标志。

任务中断

系统接收到中断请求后,如果这是CPU处于中断允许状态(即中断是开放的),系统就会终止正在运行的当前任务,而按照中断向量(中断服务子程序的入口地址)的指向转而去运行中断服务子程序(ISR);当子程序运行完毕后,系统会根据情况返回到被中止的任务继续运行,或者转而运行一个更高优先级的就绪任务

 

  • 0
  • 收藏
  • 举报
  • 分享
我来回复

登录后可评论,请 登录注册

所有回答 数量:6
我在164 2015-02-11
谢谢分享!
0   回复
举报
发布
凤凰息梧桐 2014-09-14
好谢谢分享
0   回复
举报
发布
霹雳之火 2014-08-06
谢谢分享
0   回复
举报
发布
小宝 2014-06-19
谢谢分享
0   回复
举报
发布
空中翱翔的老虎 2014-06-19
看看 顶顶
0   回复
举报
发布
冰山一角 2014-06-19
顶起。。。。
0   回复
举报
发布
x
收藏成功!点击 我的收藏 查看收藏的全部帖子