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

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

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

29

主题

722

回帖

2790

积分

荣誉版主

积分
2790
发表于 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指针就是程序执行代码在存储器中的地址
           到此任务切换成功
                 


   

回复

使用道具 举报 送花

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

29

主题

722

回帖

2790

积分

荣誉版主

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

使用道具 举报 送花

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

29

主题

722

回帖

2790

积分

荣誉版主

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-02 07:55:56
已绑定手机

19

主题

3190

回帖

4870

积分

论坛元老

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

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:181
  • 最近打卡:2025-04-29 08:52:53
已绑定手机

1

主题

9

回帖

759

积分

高级会员

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:468
  • 最近打卡:2025-05-01 10:58:55

44

主题

230

回帖

2841

积分

金牌会员

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

点评

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

使用道具 举报 送花

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

29

主题

722

回帖

2790

积分

荣誉版主

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

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


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:468
  • 最近打卡:2025-05-01 10:58:55

44

主题

230

回帖

2841

积分

金牌会员

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

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

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 09:00 , Processed in 0.129334 second(s), 96 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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