gentleman 发表于 2024-3-5 11:44:29

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-5 12:12:16

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

gentleman 发表于 2024-3-5 12:12:26

备用
页: [1]
查看完整版本: FreeRTOS for STC32G12K128内核代码解读(二)任务调度(中下)