主题:为uCOS2添加时间片轮转的功能
简介
ucos2最多可以支持64个任务,每个任务的优先级必须不同,而时间片轮转是针对相同的优先级上的任务而言,保证每一个任务都有机会执行,所以,要添加时间片轮转功能,首先要允许多个任务的优先级相同,然后再实现轮转算法。
数据结构
OS_EXT OS_TCB *OSTCBPrioTbl[OS_LOWEST_PRIO + 1];//每个优先级任务链表的数组
OS_EXT OS_TCB *OSTCBPrioActiveTbl[OS_LOWEST_PRIO+1];//每个优先级链表中的活跃任务
OS_EXT INT16U UniqueNum;//产生唯一的任务ID
基本思路
把同一个优先级的任务用双向链表连接在一起,表头放置全局数组中
把每个优先级中的活跃任务的TCB保存在全局数组中
创建任务时,每个任务的ID由操作系统内部分配,而不是用户指定
初始化
在调用OSTaskCreateExt创建任务时,初始化优先级链表
然后初始化优先级中的活跃任务表
if(OSTCBPrioActiveTbl[prio]==0)
OSTCBPrioActiveTbl[prio]=ptcb;
调度方式
1.任务级调度
在OS_Sched中,首先调用OS_SchedNew获取就绪表中的最高优先级,然后取得该优先级中的活跃任务,然后调用OSCtxSw
2.时钟中断调度
当时钟中断来时,会将当前活跃任务的ticks递减,如果ticks==0,则表示当前任务的时间片已经用光,当前优先级的活跃任务向后移动,
如果在OSIntExit调用,即时钟中断退出时发现当前任务和最高优先级活跃任务不一致,则调用OSIntCtxSw进行任务切换,实际上,该函数的实现和OSCtxSw几乎一样
OSTimeDly的实现
在该函数中应当注意,只有当属于该优先级的所有任务都没有处于就绪态时,才可以从就绪表中清除该优先级。
实现时间片轮转