FreeRTOS for STC32G12K128内核代码解读(一)任务建立(下)
本帖最后由 gentleman 于 2024-2-29 13:51 编辑FreeRTOS for STC32G12K128内核代码解读(一)任务建立(下)
接上回
for( uxPriority = ( UBaseType_t ) 0U; uxPriority < ( UBaseType_t ) configMAX_PRIORITIES; uxPriority++ )
{
vListInitialise( &( pxReadyTasksLists[ uxPriority ] ) );
}
初始化 以优先级为索引的 就绪链表数组 pxReadyTasksLists[]
这几段代码 涉及到了 几个链表/链表数组
这里跳过去看一下
这几个链表 /链表数组 与FreeRTOS 的几种任务状态有关
这里补充一下,知道的可以跳到后面代码解读部分
FreeRTOS中有4种状态
1.运行Runing -当前cpu正在执行的任务
2.阻塞Blocked -任务等待一些事件,事件完成或超时后能够被执行
比如常见的vTaskDelay() FreeRTOS提供的延时函数
3.就绪Ready -准备就绪,等待被cpu执行的任务
4.挂起Suspended - 不会被运行的任务
只能通过调用指定函数 进入或退出这种状态
下图为几个状态直接的关系,之后会详细讲解相关函数
继续阅读代码
346行 pxReadyTasksLists[ configMAX_PRIORITIES ]
其中configMAX_PRIORITIES 为最高优先级默认32 可在头文件中修改
这个就是任务就绪链表,之后我们会把任务TCB 放在对应优先级为索引的链表中
例:假设 任务A 优先级1
那么任务A 的TCB就会被放在 pxReadyTasksLists中
这个一会讲到
xDelayedTaskList1xDelayedTaskList2
这两个 是任务阻塞链表
pxDelayedTaskListpxOverflowDelayedTaskList
两个指针指向对应的 阻塞链表
xSuspendedTaskList
任务挂起链表
xPendingReadyList
这个是 当任务调度器停止时, 如果有任务从挂起状态恢复了(一般是在中断中),任务会被放在这个链表。
相关状态切换函数,在任务调度时再展开
返回到函数体
如果当前任务不为空
判断 新任务 与当前任务优先级
保证当前任务为最高优先级
继续
prvAddTaskToReadyList( pxNewTCB );
添加新任务到就绪链表函数
跳进去
查看第223行的宏定义
保证uxTopReadyPriority 最高优先级
展开224行
这个函数是 插入链表尾项
吧参数2插入参数1链表尾部
listINSERT_END( &( pxReadyTasksLists[ ( pxTCB )->uxPriority ] ), &( ( pxTCB )->xStateListItem ) ); \
就是刚刚提到过的
将新任务控制块的状态链表插入 优先级索引 的任务就绪链表数组
即 新任务TCB的 xStateListItem 插入pxReadyTasksLists[新任务的优先级] 数组尾部
退出/进入临近区 - 就是开启/关闭总中断
避免中断函数干扰任务的建立
目前任务调度器还没有开启
这部分也没运行,先跳过
到此,任务建立函数的内容解读完毕
下一篇 从
vTaskStartScheduler();启动任务调度函数
开始 解读任务调过程
本帖最后由 gentleman 于 2024-3-9 10:32 编辑
目录
1.任务创建(上) FreeRTOS内核代码解读(一)任务建立(上) - FreeRTOS/实时操作系统/文件系统/嵌入式系统软件,TFT-GUI/uGFX - 国芯论坛-STC全球32位8051爱好者互助交流社区 - STC全球32位8051爱好者互助交流社区 (stcaimcu.com)
2. 任务建立(下)FreeRTOS for STC32G12K128内核代码解读(一)任务建立(下) - FreeRTOS/实时操作系统/文件系统/嵌入式系统软件,TFT-GUI/uGFX - 国芯论坛-STC全球32位8051爱好者互助交流社区 - STC全球32位8051爱好者互助交流社区 (stcaimcu.com)
3. 任务调度 (上) FreeRTOS for STC32G12K128内核代码解读(二)任务调度(上) - FreeRTOS/实时操作系统/文件系统/嵌入式系统软件,TFT-GUI/uGFX - 国芯论坛-STC全球32位8051爱好者互助交流社区 - STC全球32位8051爱好者互助交流社区 (stcaimcu.com)
4.任务调度(中) FreeRTOS for STC32G12K128内核代码解读(二)任务调度(中) - FreeRTOS/实时操作系统/文件系统/嵌入式系统软件,TFT-GUI/uGFX - 国芯论坛-STC全球32位8051爱好者互助交流社区 - STC全球32位8051爱好者互助交流社区 (stcaimcu.com)
5.任务调度(中下)FreeRTOS for STC32G12K128内核代码解读(二)任务调度(中下) - FreeRTOS/实时操作系统/文件系统/嵌入式系统软件,TFT-GUI/uGFX - 国芯论坛-STC全球32位8051爱好者互助交流社区 - STC全球32位8051爱好者互助交流社区 (stcaimcu.com)
6.任务调度 (下)FreeRTOS for STC32G12K128内核代码解读(二)任务调度(下) - FreeRTOS/实时操作系统/文件系统/嵌入式系统软件,TFT-GUI/uGFX - 国芯论坛-STC全球32位8051爱好者互助交流社区 - STC全球32位8051爱好者互助交流社区 (stcaimcu.com)
占楼
页:
[1]