FreeRTOS for STC32G12K128内核代码解读(二)任务调度(中下)
本帖最后由 gentleman 于 2024-3-5 12:06 编辑FreeRTOS for STC32G12K128内核代码解读(二)任务调度(中下)
堵塞任务 图
通过上一期,我们了解了 任务的轮询
但却发现,如果不在任务中进行挂起和延时
那么低优先级的 任务永远不会运行
这显然是不行的
这一期,带大家看看,任务函数内部,做了哪些操作
1. 任务函数结构
这是例程中的一个任务
*** Init();
任务初始化函数-- 只会运行一次
***Update();
任务循环函数体-- 会多次运行
和裸机一样,不多讲了
vTaskDelay(2);
FreeRTOS 提供过的延时函数
今天的主角 -可以将任务 进入阻塞态
2.延时函数解析
2.1 从就绪链表移除
这里把任务调度先关了
先判断延时 时间是否 > 0
如果>0
prvAddCurrentTaskToDelayedList( xTicksToDelay, pdFALSE );
添加任务到阻塞链表函数
跳进去
if( uxListRemove( &( pxCurrentTCB->xStateListItem ) ) == ( UBaseType_t ) 0 )
先将 这个任务的状态链表,从任务就绪链表删除
链表删除函数
这一期看一下,以后就不看了
先取出 被删除项所在的链表
将该项的上一项 赋值给下一项的上一项(看第一张图理解)
将该项的下一项 赋值给上一项的下一项(看第一张图理解)
如果项索引指向的是被删除的项(回忆任务轮询内容)
吧索引指向被删除项的前一项
链表的 项总数成员(uxNumberOfItems)减1(这个值记录链表有多少项的)
2.2 插入延迟任务链表/溢出延迟任务链表
listSET_LIST_ITEM_VALUE( &( pxCurrentTCB->xStateListItem ), xTimeToWake );
把延迟的值 放入任务 状态链表中,一会要用他排序
if( xTimeToWake < xConstTickCount )
判断一下 延迟时间是否 大于系统计时器
如果小于
那就要等 计时器溢出后才能执行
vListInsert( pxOverflowDelayedTaskList, &( pxCurrentTCB->xStateListItem ) );
插入到计时器溢出链表
插入的操作 也是只看一次
下次插入链表的函数就不看了
xItemValue 排序用的
这里传入的是延时时间
如果最大,就直接插链表尾部
遍历链表 ,将新任务插入 比新任务延时时间小任务的下一项
插入链表后返回来
如果延时时间 短
那么下个待解锁任务时间 也设为新任务的延时时间
xTaskResumeAll
这个函数内关于 任务挂起的内容,我们后面再讲
2.总结
到此我门就清楚了
高优先级的任务,会通过
vTaskDelay(2);
将自己从 任务就绪列表中移除
移入阻塞任务链表
这样当高优先级的几个任务移除后
低优先级的任务可以运行
关于高优先级任务的恢复,内容比较简单,在定时器中断函数内,读者自行阅读。(如果后面我想讲了,就补充在3L)
本帖最后由 gentleman 于 2024-3-28 10:51 编辑
上期:任务调度(中) FreeRTOS for STC32G12K128内核代码解读(二)任务调度(中) - FreeRTOS/实时操作系统/文件系统/嵌入式系统软件,TFT-GUI/uGFX - 国芯论坛-STC全球32位8051爱好者互助交流社区 - STC全球32位8051爱好者互助交流社区 (stcaimcu.com)
下期:任务调度 (下)FreeRTOS for STC32G12K128内核代码解读(二)任务调度(下) - FreeRTOS/实时操作系统/文件系统/嵌入式系统软件,TFT-GUI/uGFX - 国芯论坛-STC全球32位8051爱好者互助交流社区 - STC全球32位8051爱好者互助交流社区 (stcaimcu.com)
备用
页:
[1]