任务的调度

本文深入探讨了uC/OS-II操作系统中的任务调度机制,包括任务级和中断级的调度器,重点解析了OSSched()如何找到并运行最高优先级任务,以及任务切换的过程。文中详细阐述了任务上下文的保存与恢复,强调了任务控制块在调度过程中的关键作用,并指出调度的触发时机。
摘要由CSDN通过智能技术生成

看了书,对uC/OS-II的任务调度又重新认识了,好书啊。

uC/OS-II有两种任务调度器:任务级的调度器OSSched(),中断级的调度器OSIntExt()。

OSSched()的任务调度部分

调度首先要做的就是找到当前最高优先级的任务并运行它,在uC/OS-II中,我们在任务就绪表中找到最高优先级任务标识(即它的优先级),进而获得该任务的依据——任务控制块。

因为找到最高优先级别并不难,所以调度器OSSched()的算法也简单。如下:

y = OSUnMapTbl[OSRdyGrp];

OSPrioHighRdy = (INT8U)((y<<3) + OSUnMapTbl[OSRdyTbl[y]]);

通过上面两行代码将当前最高优先级的任务的优先级存放在OSPrioHighRdy变量中。然后通过此变量从存放任务控制块指针的数组OSTCBPrioTbl[]中获得该任务的任务控制块指针,并存放在指针变量OSTCBHighRdy中。代码如下:

OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];

只要获得了最高就绪任务的任务控制块指针,再加上存放在指针变量OSTCBCur中的当前运行任务的任务控制块,就可以进行任务切换的工作了。

OSSched()代码如下:

void  OS_Sched (void)
{
#if OS_CRITICAL_METHOD == 3                            /* Allocate storage for CPU status register     */
    OS_CPU_SR  cpu_sr;
#endif    
    I
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值