ucosii任务调度
ucosii任务调度 A) 任务调度发生的时间
a)系统刚启动,完成初始化和至少建立了一个任务后,通过OSStart()函数调用__OSStartHighRdy函数将OSRunning=TRUE后,通过任务切换函数OSCtxSw来启动。
b) 系统运行过程中,新建任务的时需要启动任务调度器OSSched(),进行任务调度。
c) 任务被挂起或者等待延时或者等待其他时间发生时,需要进行任务调度。
d) 任务在运行过程中,有更高优先级任务处于就绪状态时,需要进行任务的调度(通过定时器中断服务程序,查询和更新所有任务状态时发现其是否有更高优先级任务处于就绪态)。
e) 中断服务程序运行过程中(ISR中需要使用任务)或者运行完之后需要进行任务的调度。
B) 怎样找到任务并运行
第一步:通过任务调度器或其他的方式,获得任务中的最高优先级prio;
第二步:通过prio在OSTCBPrioTbl[]中查找与prio相应的任务控制块,因为OSTCBPrioTbl[prio]中存放的就是与prio对应的OS_TCB,所以很容易就知道找到该OS_TCB。
第三步:获得任务的OS_TCB后,通过任务控制块中存放的有关堆栈信息来找到任务的私有堆栈。在堆栈中,将任务私有堆栈存放的有关处理器寄存器的内容恢复,则开始运行该任务。
在这过程中,有几个地方要记住:
1) 运行任务前,应该将其优先级在任务就绪表中相应的为清零;
2) 必须保存前一任务的信息;
查看评论 回复
" ucosii任务调度"的相关文章
- 上一篇: ucosii任务的创建过程
- 下一篇:ucos ii优先级继承实验