FeeRTOS 第九章 任务延时列表

在上一章中,当某个任务主动提出阻塞延时的时候,只是把在一个叫做uxTopReadyPriority的32位变量中把相应的位清0,那样子其实也可以实现多任务切换(只能用优化算法实现切换,普通算法还是不会切换任务的,毕竟没有从就绪列表中移除)。在这章中,专门加入了一个列表叫做延时列表,把提出阻塞的任务从就绪列表中移除并加入到这个列表中

在这个prvInitialiseTaskLists()函数下实现了就绪列表的初始化以及空闲列表(之前这个函数下只有就绪列表的初始化)的初始化。

可以发现,这个函数不断内嵌到

xTaskCreateStatic--->prvAddNewTaskToReadyList---->prvInitialiseTaskLists()函数中,用户不可见。

在开启调度函数下,vTaskStartScheduler有这两个变量,其是全局变量

xNextTaskUnblockTime = portMAX_DELAY;  //下一个最快延时到期的任务的计数时间
xTickCount = ( TickType_t ) 0U;//当前计数Tick

当前在vTaskStartScheduler函数下已经内嵌了多个东西了,比如空闲任务的创建,还有Systick的初始化配置函数。

修改一下各函数。

1 vTaskDelay()函数

上一章这只是在这个函数中把uxTopReadyPriority相应的位清除,而没有把阻塞任务从就绪列表移除。因为加入了新的延时列表,过去那个在TCB中设置延时时间xTicksToDelay的方法就不管用了。第七章和第八章任务延时使用了两种方法,但是都需要xTicksToDelay这个值。再回想一下,任务主动提出阻塞的时候,把uxTopReadyPriority相应的位清除,给需要阻塞的任务TCB的xTicksToDelay传递阻塞时间,在Systick中断中不断把每个需要延时任务的TCB中的xTicksToDelay减1,如果减到0就把任务的优先级加入uxTopReadyPriority,再去调用任务切换函数,再执行优化算法,计算前导0个数,获得当前的最高优先级TCB。

这章中就不用这个xTicksToDelay了,直接在vTaskDelay()中调用函数

prvAddCurrentTaskToDelayedList(xTicksToDelay);

这个函数的参数是xTicksToDelay,延时时间,其具体做了1;把uxTopReadyPriority位清除,以及把任务的从就绪列表删除,2;获得系统时基xTickCount,然后获得需要延时的任务到期的时总的Tick是多少,根据根据这个计数到期的Tick在延时列表做节点的升序排列,再比较这个新插入的TCB的时间和xNextTaskUnblockTime这个变量时间的大小,如果新插入的值更小,则xNextTaskUnblockTime的值等于这个新插入的到期时间。说白了xNextTaskUnblockTime其只是一个最快到期的时间,后面的到期时间暂时不用管,毕竟最先到期的任务都还没有到,后面更久的就更不可能到了。可想而知,当xNextTaskUnblockTime这个时间到了的时候,其值又会变成下一个最快到期的任务的时间。

在Systick中断的时基函数改动多,可以发现,其中的for循环无限循环,当延时列表不为空的时候,只有一个break才能退出这个循环。首先当延时到期后,才进入那个个for循环,当延时列表不为空时,调用一个获取延时列表头部的TCB的函数,再获取辅助排序值也就是该TCB计数到期的Tick,最开始并不会进入if判断,而是直接把任务移除阻塞列表再添加就绪列表(当然还做了在uxTopReadyPriority中置相应的位),经过不断地for循环,把所有到期地任务移除(在一个计时Tick下有多个任务),直到辅助排序值的时间大于当前总的计时Tick,说明不能再移除了,把下个最快到期任务的时间给xNextTaskUnblockTime,并跳出循环。然后执行一次任务切换。(此时的寻找当前优先级的算法是前导0优化算法或者for循环遍历就绪列表的普通算法)

上一章中只是为了实现多优先级,而没有管在那个主动提出阻塞的优先级下是不是还有其他的任务存在,当时只是调用了一个叫做taskRESET_READY_PRIORITY()函数,把uxTopReadyPriority相应位置0,这样就直接隔绝了当前的优先级下的所有任务。因此这章中做了修改,当当前优先级下还有任务,uxTopReadyPriority就不要清0.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值