2.2 相关函数的修改
对OS_TCBInit()、OSTimeTick()、OSTimeDly()、OS_EventTaskWait()、OS_EventTaskRdy()这5个函数的修改,是在μC/OSII基础上实现时间片调度法的关键。下面将一一对这几个函数的修改部分进行说明。
在初始化任务控制块的函数OS_TCBInit()中,笔者添加以下代码让新创建的任务处于时间片就绪表中,并根据任务优先级对任务的时间片大小进行初始化。
![](http://embed.chinaitlab.com/UploadFiles_4615/200910/20091004093624519.jpg) OSTimeTick()函数在每个时钟滴答被调用,在时间片调度过程中起到了递减时间片计数器的作用。当计数器为0时,进行任务切换或是重新给各个任务分配时间片并开始新一轮调度。
OSTimeDly()函数的作用是将任务延时一定的时间。这种情况下,应该把该任务从时间片调度表中清除。
当某个任务须等待一个事件的发生时,信号量、互斥型信号量、邮箱及消息队列会通过相应的PEND函数调用函数OS_EventTaskWait(),使当前任务从就绪任务表中脱离就绪态,此时还需把当前任务从时间片调度表中清除。笔者在OS_EventTaskWait()函数中添加了以下代码:
![](http://embed.chinaitlab.com/UploadFiles_4615/200910/20091004093624255.jpg) 相应地,当某个事件发生了,信号量、互斥型信号量、邮箱及消息队列会通过相应的POST函数调用OS_EventTaskRdy(),从等待任务队列中使最高优先级任务脱离等待状态,此时还需要把该任务添加到时间片调度表中。笔者在OS_EventTaskRdy()函数中添加了以下代码:
OSTSSGrp |= bity;
OSTSSTbl[y] |= bitx; |