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

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

[复制链接]
  • TA的每日心情
    奋斗
    2024-5-5 08:35
  • 签到天数: 143 天

    [LV.7]常住居民III

    29

    主题

    558

    回帖

    2138

    积分

    荣誉版主

    积分
    2138
    发表于 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
    回复 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-5-5 08:35
  • 签到天数: 143 天

    [LV.7]常住居民III

    29

    主题

    558

    回帖

    2138

    积分

    荣誉版主

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

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-5-5 08:35
  • 签到天数: 143 天

    [LV.7]常住居民III

    29

    主题

    558

    回帖

    2138

    积分

    荣誉版主

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

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-15 17:36 , Processed in 0.064041 second(s), 40 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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