当前位置:网站首页>FreeRTOS个人笔记-任务延时列表的实现
FreeRTOS个人笔记-任务延时列表的实现
2022-07-19 05:55:00 【Couvrir洪荒猛兽】
根据个人的学习方向,学习FreeRTOS。由于野火小哥把FreeRTOS讲得比较含蓄,打算在本专栏尽量细化一点。作为个人笔记,仅供参考或查阅。
配套资料:FreeRTOS内核实现与应用开发实战指南、野火FreeRTOS配套视频源码、b站野火FreeRTOS视频。搭配来看更佳哟!!!
任务延时列表的实现
在本节之前,为了实现任务的堵塞延时,在任务控制块中内置了一个延时变量,xTickToDelay。
每当任务需要延时时,就初始化xTickToDelay需要延时的时间,然后将任务挂起(只是将任务在优先级位图表uxTopReadyPriority中对应的位清零),并不会将任务从就绪列表中删除。
当每次时基中断(SysTick中断)来临时,就扫描就绪列表中每个任务的xTickToDelay。如果xTickToDelay大于0就递减一次,然后判断xTickToDelay是否为0,如果为0则表示延时时间到,将该任务就绪(将任务在优先级位图表uxTopReadyPriority中对应的位置1),然后进行任务切换。
这种延时的缺点是,在每个时基中断(SysTick中断)中需要对所有任务都扫描一遍,费时。优点是容易理解。
任务延时列表的工作原理
在FreeRTOS中,有两个任务延时列表。
当任务需要延时时,则先将任务挂起,即先将任务从就绪列表删除,然后插入到任务延时列表,同时更新下一个任务的解锁时刻变量:xNextTaskUnblockTime的值。
xNextTaskUnblockTime的值等于系统时基计数器的值xTickCount加上任务需要延时的值xTicksToDelay。即xNextTaskUnblockTime=xTickCount+xTicksToDelay。
当系统时基计数器xTickCount=xNextTaskUnblockTime时,就表示有任务延时到期了,需要将该任务就绪。与RT-Thread和uC/OS在解锁延时任务时要扫描定时器列表这种时间不确定性的方法相比,FreeRTOS这个xNextTaskUnblockTime全局变量设计的非常巧妙。
任务延时列表维护着一条双向链表,每个节点代表了正在延时的任务,节点按照延时时间大小做升序排列。当每次时基中断(SysTick中断)来临时,就拿系统时基计数器的值xTickCount与下一个任务的解锁时刻变量xNextTaskUnblockTime的值相比较,如果相等,则表示有任务延时到期,需要将该任务就绪,否则只是单纯地更新xTickCount的值,然后进行任务切换。
实现任务延时列表
边栏推荐
猜你喜欢
随机推荐
MySQL InnoDB engine (4)
.NET下IN关键字下多个并列参数的参数化
GC tuning principle of JVM (10)
Design of a simple DDS signal generator based on FPGA
ikbc键盘win键失效的解决方法
Impala 2.x的新patch -- IMPALA-6812 Kudu Read Mode
GC tuning principle of JVM (11)
Impala's question answer about a code of valuetransfergraph
19day
二叉树的链式存储结构
A simple voltmeter design based on FPGA
动态调整Impala日志级别
ROS海龟跟随(坐标变换)
6 jours
FPGA buzzer plays the music "sea of flowers"
js优化双层for循环的方法
解决报错:Do not access Object.prototype method ‘hasOwnProperty‘ from target object no
Flink内核源码(六)状态容错与两阶段提交
3. Editors (vim)
11day