gentleman 发表于 2024-2-29 10:24:44

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-2-29 10:30:35

本帖最后由 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)

gentleman 发表于 2024-2-29 10:30:44

占楼
页: [1]
查看完整版本: FreeRTOS for STC32G12K128内核代码解读(一)任务建立(下)