UCOSII原理与应用----任务调度

任务调度:
UCOSII任务调度思想:“近似地每时每刻让优先级最高的就绪任务处于运行状态”。具体上,采用系统或用户任务调用系统函数及执行中断服务程序结束时来调用调度器,以确定应该运行的任务并运行它。
在多任务系统中,令CPU中止当前正在运行的任务转而去运行另一个任务的工作叫任务切换,而按照某种规则进行任务切换的工作叫任务的调度。
UCOSII中调度器有两种,一是任务级的调度器,二是中断级的调度器。任务调度器主要是完成任务调度,主要工作是寻找最高优先级就绪任务和实现任务切换,由函数OSSched()来实现。中断级的调度器由OSIntExt()实现。主要介绍任务级的调度器OSSched()。
调度器把任务切换的工作分成两个步骤:
1、获得待运行任务的TCB指针;2、进行断点数据的切换。
操作系统通过任务的任务控制块TCB来管理任务,因此调度器真正试试任务切换之前的主要工作就是获得待运行任务的任务控制块指针和当前任务的任务控制块指针。
因为被中止的任务控制块指针存在在全局变量OSTCBCur中,因此调度器这部分主要任务就是获取待运行任务的任务控制指针。

void OSSched(void)
{
#if OS_CRITICAL_METHOD == 3

OS_CPU_SR cpu_sr;

#endif

INT8U y;
OS_ENTER_CRITICAL();
if((OSLockNesting | OSIntNesting) == 0)
{
    y = OSUnMapTbl[OSRdyGrp];
OSPrioHighRdy			//得到最高级优先任务
	= (INT8U)((y << 3) + UnMapTbl[OSRdyTbl[y]]);
if(OSPrioHighRdy != OSPrioCur)
{
	OSTCBHighRdy		//得到任务控制块指针
		= OSTCBPrioTbl[OSPrioHighRdy];
				//统计任务切换次数的计数器加1
	OSCtxSwCtr++;
	OS_TASK_SW();
}
}
OS_EXIT_CRITICAK();

}

UCOSII运行应用程序调用函数OSSchedLock()和OSSchedUnlock()给调度器上锁和解锁,并用OSLockNesting变量来记录上锁(+1)和解锁(-1)。因此可以通过OSLockNesting来确定嵌套次数。
调度器OSSched()在确认未被上锁并不是中断服务函数时,首先从任务就绪表中查得最高优先级别就绪的优先级别OSPrioHighRdy;然后在确实就绪任务不是当前任务时,OSPrioHighRdy作为下标去访问数组OSTCBPrioTbl[],把数组元素OSTCBPrioTbl[OSPrioHighRdy]的值赋值给指针变量OSTCBHighRdy。依照上述函数获取到的指向待运行任务控制块和当前任务块的指OSTCBHighRdy和OSTCBCur,并在宏OS_TASK_SW()中实施任务切换。

切换的工作主要是靠OSCtxSw()来完成。
任务切换就是中止正在运行的任务,转去运行另外一个任务的操作。这个任务应该是就绪任务中优先级别最高的任务。

为了了解如何切换任务,首先看一下中止任务,将来恢复运行需要什么条件。
如果把任务中止运行的位置叫做断点,当时存放在CPU的PC和PSW和通用寄存器等各种寄存器的数据叫做断点数据。当任务恢复必须以断点数据作为初始数据接着运行。因此在任务中止时我们需要把该任务的断点数据保存在堆栈中。
所以,一个被中止的任务能否正确的在断点处恢复运行,关键在于是否能正确的在CPU各寄存器中恢复断点,而能够正确恢复断点数据的关键在于CPU的堆栈指针SP是否有正确的指向。因此,系统的多任务,如果恢复断点数据时用另一个任务堆栈指针来改变CPU的堆栈SP,那么CPU运行就不是刚刚中止任务,而是另外一个任务,也就实现了任务切换。
综上,任务切换就是断点数据切换,断点数据切换就是CPU堆栈指针的切换。被中止运行任务的任务堆栈指针要保护到该任务的任务控制块中,待运行任务的任务堆栈置要由该任务控制块转存到CPU的SP中。调度器切换任务的工作过程下图
在这里插入图片描述

为了完成上述操作,OSCtxSw()要依次完成7个工作
1、把被中止任务的断点指针保存到任务堆栈中
2、把CPU通用寄存器内容保存到任务堆栈中
3、把被中止任务的任务堆栈指针当前值保存到该任务的任务控制块的OSTCBStkPtr中
4、获得待运行任务的任务控制块、
5、使CPU通过任务控制块获得待运行任务的任务堆栈指针
6、待运行任务堆栈通用寄存器内容恢复到CPU通用寄存器
7、CPU获得待运行任务的蹲点指针(上一次被调度器中止运行保留在任务堆栈中的)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值