FreeRTOS任务延时列表

之前的阻塞延时实现

之前为了实现任务阻塞延时,在任务控制块TCB中添加了个成员xTicksToDelay,当任务需要延时时就设置xTicksToDelay,然后把该任务挂起,这里挂起只是将uxTopReadyPriority中对应的位清0(注意此时还不支持时间片,即同一优先级下只有一个任务,所以能直接清0,如果支持时间片还需判断该优先级列表上是否还有其它节点即是否还有其它任务,有就不能清0),

并没有把该任务从任务就绪列表中删除,每次时基来临时(SysTick中断),就扫描各个任务的xTicksToDelay,大于0就减一操作,然后判断是否为0,为0表示延时时间到,再把该任务添加到任务就绪列表中(就是把uxTopReadyPriority中对应的位置1)然后进行任务切换。缺点是每个时基都要扫描所有任务费时,优点是理解简单。

任务延时列表原理

在 FreeRTOS 中, 还有任务延时列表,当任务需要延时时,先把任务挂起,这里是先把任务从就绪列表中删除,然后插入到延时列表中,将uxTopReadyPriority中对应的位清0(注意此时还不支持时间片,即同一优先级下只有一个任务,所以能直接清0,如果支持时间片还需判断该优先级列表上是否还有其它节点即是否还有其它任务,有就不能清0)
同时更新下一个任务的解锁时间变量xNextTaskUnblockTime的值。

xNextTaskUnblockTime 的值等于系统时基计数器的值 xTickCount加上任务需要延时的值 xTicksToDelay。 当系统时基计数器 xTickCount 的值与 xNextTaskUnblockTime 相等时,就表示有任务延时到期了,需要将该任务就绪。

任务延时列表表维护着一条双向链表,每个节点代表了正在延时的任务,节点按照延时时间大小做升序排列。 当每次时基中断(SysTick 中断)来临时, 就拿系统时基计数器的值 xTickCount与下一个任务的解锁时刻变量 xNextTaskUnblockTime 的值相比较, 如果相等, 则表示有任务延时到期, 需要将该任务就绪, 否则只是单纯地更新系统时基计数器xTickCount 的值, 然后进行任务切换。

这样就不用像之前那样扫描所有任务判断是否延时时间到达。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章