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

FreeRTOS for STC32G12K128内核代码解读(二)任务调度(中下)

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

29

主题

722

回帖

2790

积分

荣誉版主

积分
2790
发表于 2024-3-5 11:44:29 | 显示全部楼层 |阅读模式
本帖最后由 gentleman 于 2024-3-5 12:06 编辑

FreeRTOS for STC32G12K128内核代码解读(二)任务调度(中下)
堵塞任务 图


截图202403051033001475.jpg


通过上一期,我们了解了 任务的轮询
但却发现,如果不在任务中进行挂起和延时
那么低优先级的 任务  永远不会运行
这显然是不行的
这一期,带大家看看,任务函数内部,做了哪些操作

1. 任务函数结构
         截图202403051038119236.jpg
       这是例程中的一个任务
     *** Init();
     任务初始化函数-- 只会运行一次
     ***Update();
     任务循环函数体-- 会多次运行
     和裸机一样,不多讲了
    vTaskDelay(2);
     FreeRTOS 提供过的延时函数
     今天的主角 -可以将任务 进入阻塞态
2.延时函数解析
    2.1 从就绪链表移除
截图202403051044147135.jpg
         截图202403051131378965.jpg    
        这里把任务调度先关了
        先判断延时 时间是否 > 0  
      如果>0
     prvAddCurrentTaskToDelayedList( xTicksToDelay, pdFALSE );
     添加任务到阻塞链表函数
    跳进去
      截图202403051048158028.jpg
      if( uxListRemove( &( pxCurrentTCB->xStateListItem ) ) == ( UBaseType_t ) 0 )
    先将 这个任务的状态链表,从任务就绪链表删除
            截图202403051050413770.jpg
         链表删除函数
      这一期看一下,以后就不看了
      先取出 被删除项所在的链表
      将该项的上一项 赋值给下一项的上一项  (看第一张图理解)
      将该项的下一项 赋值给上一项的下一项  (看第一张图理解)

      如果项索引指向的是被删除的项(回忆任务轮询内容)
      吧索引指向被删除项的前一项
      链表的 项总数成员(uxNumberOfItems)减1  (这个值记录链表有多少项的
      2.2 插入延迟任务链表/溢出延迟任务链表
listSET_LIST_ITEM_VALUE( &( pxCurrentTCB->xStateListItem ), xTimeToWake );
把延迟的值 放入任务 状态链表中,一会要用他排序
      if( xTimeToWake < xConstTickCount )
       判断一下 延迟时间是否 大于系统计时器
         如果小于
       那就要等 计时器溢出后才能执行
                          vListInsert( pxOverflowDelayedTaskList, &( pxCurrentTCB->xStateListItem ) );
      插入到计时器溢出链表
      
        插入的操作 也是只看一次
     下次插入链表的函数就不看了
       截图202403051111378285.jpg
           xItemValue 排序用的
       这里传入的是延时时间
       截图202403051115413036.jpg
         如果最大,就直接插链表尾部
       截图202403051116548920.jpg
            截图202403051119275701.jpg

           遍历链表 ,将新任务插入 比新任务延时时间小任务  的下一项
       截图202403051119096842.jpg
          插入链表后返回来
      
          截图202403051121498589.jpg
          如果延时时间 短
       那么下个待解锁任务时间 也设为新任务的延时时间
          截图202403051133074520.jpg
         xTaskResumeAll
   这个函数内关于 任务挂起的内容,我们后面再讲
2.总结   
   到此我门就清楚了
   高优先级的任务,会通过
    vTaskDelay(2);
     将自己从 任务就绪列表中移除
      移入阻塞任务链表
    这样当高优先级的几个任务移除后
    低优先级的任务可以运行
    关于高优先级任务的恢复,内容比较简单,在定时器中断函数内,读者自行阅读。(如果后面我想讲了,就补充在3L)
   
截图202403051036413896.jpg
截图202403051108005710.jpg
回复

使用道具 举报 送花

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

29

主题

722

回帖

2790

积分

荣誉版主

积分
2790
发表于 2024-3-5 12:12:16 | 显示全部楼层
回复 支持 反对

使用道具 举报 送花

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

29

主题

722

回帖

2790

积分

荣誉版主

积分
2790
发表于 2024-3-5 12:12:26 | 显示全部楼层
备用
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 08:46 , Processed in 0.139533 second(s), 57 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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