×

FreeRTOS学习之旅(九) -----任务延时列表

zxjy辉 zxjy辉 发表于2022-09-07 16:44:43 浏览249 评论0

抢沙发发表评论

丰收的麦田风景.jpeg

任务延时所需要的列表,可以将对应的任务从就绪列表中删除,并且将对应uxTopReadyPriority对应优先级的位清零

  1. 概念

    1. 是一条双向的链表,每个节点都代表着一个正在延时的任务,节点按照延时的时间升序排列

    2. 在FreeRTOS中有两条任务延时列表,在系统时基计数器xTickCount,这个值是SysTick中断的次数,在没有溢出的时候,采用的是其中的一条,当计数溢出的时候,采用的是另一条,通过指针进行切换。这两个表的作用是一样的。

  2. 流程

    1. 在任务需要延时的时候,就会先将任务挂起,即将任务从就绪列表中删除,清除对应的uxTopReadyPriority的位1(前提是这个优先级下没有其他任务了,如果有则不清除,清除会导致其他任务无法执行,相当于不在就绪列表中),最后插入到任务延时列表中,同时解锁一个变量:xNextTaskUnblockTime的值,这个值等于系统时基计数器xTickCount+任务需要延时的值。此时任务就绪的条件就是:当xNextTaskUnblockTime等于系统时基计数器的值xTickCount;当值相等的时候,就表示任务延时结束了,任务准备就绪了。(每次比较都是在SysTick中断中比较的)

  3. 函数调用大致流程

    1. 在vTaskDelay()函数中,调用prvAddCurrenTaskDelayedList()在这个函数中实现了任务从就绪列表中删除,并将uxTopReadyPriority对应优先级的位清零,最后将任务插入到延时任务书延时列表中。

#好好学习!

群贤毕至

访客