找回密码
 立即注册
查看: 478|回复: 7

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

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

    [LV.7]常住居民III

    29

    主题

    558

    回帖

    2138

    积分

    荣誉版主

    积分
    2138
    发表于 2024-3-2 11:49:37 | 显示全部楼层 |阅读模式
    本帖最后由 gentleman 于 2024-3-3 07:24 编辑

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

    还是先放张图
    了解下图过程的就不必看了



    截图202403021143074817.jpg

    1.第一个任务 是如何开启的

    1.1建立空闲任务
           截图202403020959586695.jpg

        建立好任务之后
        就调用vTaskStartScheduler(); 开启任务调度了
      跳进去
           截图202403020958477626.jpg

       xReturn = xTaskCreate( prvIdleTask,

         这里建立里个空闲任务
       空闲任务优先级为0
       cpu空闲时调用(无其他高优先级任务运行)
       具体内容在调用时在看
       
    1.2 配置tick 定时器
       截图202403021006461433.jpg
       初始化一些变量
      开启任务调度标志
      Tick计数置0  --默认1Tick是1ms  FreeRTOS的调度离不开这个Tick计数器
       截图202403021014355738.jpg
        跳进去xPortStartScheduler() 开启任务调度的接口函数
        截图202403021015235627.jpg
        再跳 prvPortSetupTimerInterrupt() 配置定时器接口函数
        截图202403021015484090.jpg    
       这部分是特别熟悉的代码了
       开启定时器0
       1T模式
       1ms自动重载
       这个定时器 也被称为滴答定时器, FreeRTOS 的轮询,延时操作 等都是通过这个定时器中断实现的
    1.3修改SP指针

       返回到xPortStartScheduler() 开启任务调度的接口函数
        截图202403021025517915.jpg
         portRESTORE_SPX();
        截图202403021027115029.jpg
        发现这个是个宏
        包含一些汇编代码
           这里又要补充知识了
           下图为c251 寄存器结构
             截图202403021123031991.jpg
                原来的栈指针 spx 再寄存器DR60中

            这段代码 将pxCurrentTCB (由于TCB第一项为 RTOS 的(堆)栈指针,所以pxCurrentTCB 也是RTOS的(堆)栈指针 pxTopOfStack)
           通过一些MOV指令和中间的寄存器 将低2位赋值给单片机的栈指针(DR60)
           高位通过与操作置0(spx指针只有16位)
          
           现在 单片机级的栈 就被改成了  RTOS 的栈


            继续
             又是一段 宏
    1.4 出栈 恢复现场(第一次开启任务其实只有DR0存放任务参数,后面切换任务时才有其他寄存器的值)        


             截图202403021131346002.jpg
            这段就是出栈指令了
            POP 指令 将RTOS(堆)栈的内容
                           恢复到寄存器中
                           (SP指针 会移动 -被恢复寄存器空间的大小)
              截图202403021133114897.jpg
             
                看RTOS(堆)栈
                POP DR56 后 sp指针指向了PSW1
    1.5 ERET修改PC指针,开启任务

               继续看代码
                截图202403021138008418.jpg

               再展开
                截图202403021137451398.jpg
               恢复PSW1
               看ROTS(堆)栈
               那现在SP指针 可就指向任务函数入口了
              截图202403021141304068.jpg
               开启总中断
               最后的0AAH 是这条指令
                截图202403021139279486.jpg
                ERET
                截图202403021139491909.jpg
               将SP 指针指向的地址(函数入口) 给PC(24位)
                     上文说过,PC指针就是程序执行代码在存储器中的地址
               到此任务切换成功
                     


       

    回复 送花

    使用道具 举报

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

    [LV.7]常住居民III

    29

    主题

    558

    回帖

    2138

    积分

    荣誉版主

    积分
    2138
     楼主| 发表于 2024-3-2 11:58:37 | 显示全部楼层
    回复 支持 反对 送花

    使用道具 举报

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

    [LV.7]常住居民III

    29

    主题

    558

    回帖

    2138

    积分

    荣誉版主

    积分
    2138
     楼主| 发表于 2024-3-2 11:58:45 | 显示全部楼层
    占楼备用
    回复 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    15 小时前
  • 签到天数: 71 天

    [LV.6]常住居民II

    3

    主题

    617

    回帖

    922

    积分

    高级会员

    积分
    922
    发表于 2024-3-9 22:04:24 | 显示全部楼层
    来学习一下
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    10 小时前
  • 签到天数: 33 天

    [LV.5]常住居民I

    0

    主题

    2

    回帖

    146

    积分

    注册会员

    积分
    146
    发表于 2024-3-19 10:10:33 | 显示全部楼层
    这个太厉害了,大牛
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    难过
    10 小时前
  • 签到天数: 131 天

    [LV.7]常住居民III

    20

    主题

    87

    回帖

    1168

    积分

    金牌会员

    积分
    1168
    发表于 2024-3-19 11:20:38 | 显示全部楼层
    请问 FreeRTOS 支持C51吗? STC8 系列的支持吗?

    点评

    理论上,可以 不过显然32g系列更适合一些 8系列最大ram是8k,跑任务多了堆栈可能会爆 8系列目前好像没人移植  详情 回复 发表于 2024-3-19 18:47
    不争是争
    回复 支持 反对 送花

    使用道具 举报

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

    [LV.7]常住居民III

    29

    主题

    558

    回帖

    2138

    积分

    荣誉版主

    积分
    2138
     楼主| 发表于 2024-3-19 18:47:53 | 显示全部楼层
    大锤子 发表于 2024-3-19 11:20
    请问 FreeRTOS 支持C51吗? STC8 系列的支持吗?

    理论上,可以
    不过显然32g系列更适合一些
    8系列最大ram是8k,跑任务多了堆栈可能会爆
    8系列目前好像没人移植


    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    难过
    10 小时前
  • 签到天数: 131 天

    [LV.7]常住居民III

    20

    主题

    87

    回帖

    1168

    积分

    金牌会员

    积分
    1168
    发表于 2024-3-19 21:45:25 | 显示全部楼层
    gentleman 发表于 2024-3-19 18:47
    理论上,可以
    不过显然32g系列更适合一些
    8系列最大ram是8k,跑任务多了堆栈可能会爆

    好吧, 8系列就裸机好了。
    不争是争
    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-15 21:36 , Processed in 0.104506 second(s), 61 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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