找回密码
 立即注册
查看: 1110|回复: 2

FreeRTOS for STC32G12K128内核代码解读(一)任务建立(下)

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:217
  • 最近打卡:2024-11-15 09:12:27

29

主题

722

回帖

2790

积分

荣誉版主

积分
2790
发表于 2024-2-29 10:24:44 | 显示全部楼层 |阅读模式
本帖最后由 gentleman 于 2024-2-29 13:51 编辑

FreeRTOS for STC32G12K128内核代码解读(一)任务建立(下)

     接上回
         截图202402290905159032.jpg


    for( uxPriority = ( UBaseType_t ) 0U; uxPriority < ( UBaseType_t ) configMAX_PRIORITIES; uxPriority++ )
    {
        vListInitialise( &( pxReadyTasksLists[ uxPriority ] ) );
    }

    初始化 以优先级为索引的 就绪链表数组 pxReadyTasksLists[]
    这几段代码 涉及到了 几个链表/链表数组
    这里跳过去看一下

       截图202402290909568998.jpg

      这几个链表 /链表数组 与FreeRTOS 的几种任务状态有关
    这里补充一下,知道的可以跳到后面代码解读部分
        FreeRTOS中有4种状态
           1.运行Runing            -当前cpu正在执行的任务
           2.阻塞Blocked           -任务等待一些事件,事件完成或超时后能够被执行
                                           比如常见的  vTaskDelay() FreeRTOS提供的延时函数
           3.就绪Ready              -准备就绪,等待被cpu执行的任务
           4.挂起Suspended       - 不会被运行的任务
                                            只能通过调用指定函数 进入或退出这种状态
           下图为几个状态直接的关系,之后会详细讲解相关函数


                           截图202402290932085657.jpg      

    继续阅读代码
      346行 pxReadyTasksLists[ configMAX_PRIORITIES ]


    其中configMAX_PRIORITIES 为最高优先级  默认32 可在头文件中修改
    这个就是任务就绪链表,之后我们会把任务TCB 放在对应优先级为索引的链表中
    例:假设 任务A 优先级1   
    那么任务A 的TCB  就会被放在 pxReadyTasksLists[1]

  这个一会讲到
      xDelayedTaskList1  xDelayedTaskList2
  这两个 是任务阻塞链表
      pxDelayedTaskList  pxOverflowDelayedTaskList

  两个指针指向对应的 阻塞链表
  xSuspendedTaskList
   任务挂起链表
  xPendingReadyList
   这个是 当任务调度器停止时, 如果有任务从挂起状态恢复了(一般是在中断中),任务会被放在这个链表。
  相关状态切换函数,在任务调度时再展开
  返回到函数体

       截图202402290949473281.jpg

    如果当前任务不为空
    判断 新任务 与当前任务优先级
     保证当前任务为最高优先级
      继续

       截图202402290953303604.jpg    
      prvAddTaskToReadyList( pxNewTCB );
  添加新任务到就绪链表函数
  跳进去

   截图202402290954435251.jpg      
   截图202402290955358231.jpg
     查看第223行的宏定义
     保证uxTopReadyPriority 最高优先级
   展开224行
      截图202402290958054203.jpg

     这个函数是 插入链表尾项
     吧参数2插入  参数1链表尾部
    listINSERT_END( &( pxReadyTasksLists[ ( pxTCB )->uxPriority ] ), &( ( pxTCB )->xStateListItem ) ); \

     就是刚刚提到过的
     将新任务控制块的状态链表  插入 优先级索引 的任务就绪链表数组
     即 新任务TCB的 xStateListItem   插入  pxReadyTasksLists[新任务的优先级] 数组尾部

    截图202402291008456420.jpg
      退出/进入临近区    -   就是开启/关闭  总中断
      避免中断函数干扰任务的建立

      截图202402291019104541.jpg
   目前任务调度器还没有开启
   这部分也没运行,先跳过
到此,任务建立函数的内容解读完毕
    下一篇 从

       截图202402291024117727.jpg

      vTaskStartScheduler();启动任务调度函数
   开始 解读任务调过程
     
  






回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:217
  • 最近打卡:2024-11-15 09:12:27

29

主题

722

回帖

2790

积分

荣誉版主

积分
2790
发表于 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)
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:217
  • 最近打卡:2024-11-15 09:12:27

29

主题

722

回帖

2790

积分

荣誉版主

积分
2790
发表于 2024-2-29 10:30:44 | 显示全部楼层
占楼
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 13:03 , Processed in 0.108910 second(s), 57 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表