UCOSIII中的任务调度和任务切换

  1. 基本概念

         任务调度的思想是,几乎每时每刻让优先级别最高的就绪任务处于运行状态,它由任务调度器来完成这个工作。(任务级调度器OSShed()和中断级调度器OSIntExit())

        任务切换,令CPU中止当前正在运行的任务转而去运行另一个任务的过程叫任务切换。(任务级切换OSCtxSw()和中断级切换OSIntCtxSw())。它和任务调度之间的关系是:任务调度按照某种规则进行任务切换。所以,任务切换的过程最终还是取决于任务调度器的工作。

         其中,任务调度器的主要工作有两项:一是在任务就绪表中查找出具有最高级别的就绪任务,通过函数OS_PrioGetHighest()完成;二是实现任务切换,这个过程又分为两步:第一步是获得待运行任务的任务控制块指针,第二步进行断点数据的切换。

2.获得待运行就绪任务控制块的指针                                                                                                               由于UCOSIII是通过任务(任务由任务堆栈、任务控制块和任务函数组成)的任务控制块TCB来管理任务的,因此调度器真正完成任务切换之前的主要工作就是获取待运行任务的任务控制块指针和当前任务的任务控制块指针。                                                                                                          调度器OSSched()在确认未被上锁(OSSchedLock())且不是中断服务程序调用调度器的情况下,首先从任务就绪表中查得就绪任务中的最高优先级别OSPrioHighRdy;然后在确认这个任务不是当前正在运行的任务的条件下,可获得待运行任务的任务控制块指针OSTCBHighRdyPtr和当前任务的任务控制块指针OSTCBCurPtr。

3.OSCtxSw()                                                                                                                                                  其实任务切换最终主要靠OSCtxSw()。为了方便讨论,把任务被中止运行时的位置叫做断点,把当时存放在CPU的PC、PSW和通用寄存器中的数据叫做断点数据,那么当任务恢复运行时,必须在断点处以断电数据作为初始数据接着运行。因此,要实现这个无缝连接的运行,则必须在任务中止时将其断点数据存入堆栈中,在任务重新运行时再将断点数据恢复到CPU的各寄存器中。                                                                                                                                                            那么,一个被中止的任务能否正确的恢复运行,关键在于断点数据能否准确恢复。准确恢复断点数据的关键又在于CPU的堆栈指针SP是否有正确的指向。因此,在恢复断点数据时用了另一个任务的堆栈指针(存放在控制块成员OSTCBStkPtr中)来改变CPU的堆栈指针,则实现了任务的切换。所以,被中止任务的堆栈指针要保护到该任务的任务控制块中,待运行任务的堆栈指针要由该任务的控制块转存到CPU的SP中。                                                                                                     

为完成上述操作,OSCtxSw()   要依次做如下7项工作:

①把中止任务的断点指针保存到任务堆栈;                                                                                   

②把CPU通用寄存器的内容保存到任务堆栈;                                                                               

③把被中止任务的任务堆栈指针当前值保存到该任务的任务控制块的OSTCBStkPtr中;             

④获得待运行任务的任务控制块;                                                                                                

⑤使CPU通过任务控制块获得待运行任务的任务堆栈指针;                                                         

⑥把待运行任务的任务堆栈中的通用寄存器值恢复到CPU的通用寄存器中;                               

⑦使CPU获得待运行任务的断点指针;(该指针是待运行任务在上一次被调度器中止运行时保存在任务堆栈中的)。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值