任务挂起和中断

今天看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);当子程序运行完毕后,系统会根据情况返回到被中止的任务继续运行,或者转而运行一个更高优先级的就绪任务。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值