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

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

[复制链接]

35

主题

739

回帖

3157

积分

荣誉版主

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


   

回复

使用道具 举报 送花

35

主题

739

回帖

3157

积分

荣誉版主

积分
3157
 楼主| 发表于 2024-3-2 11:58:37 | 显示全部楼层
回复

使用道具 举报 送花

35

主题

739

回帖

3157

积分

荣誉版主

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

使用道具 举报 送花

已绑定手机

19

主题

3549

回帖

8049

积分

论坛元老

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

使用道具 举报 送花

已绑定手机

1

主题

10

回帖

1649

积分

金牌会员

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

使用道具 举报 送花

44

主题

242

回帖

4343

积分

论坛元老

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

点评

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

使用道具 举报 送花

35

主题

739

回帖

3157

积分

荣誉版主

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

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


回复

使用道具 举报 送花

44

主题

242

回帖

4343

积分

论坛元老

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

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

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-9-21 01:10 , Processed in 0.077421 second(s), 84 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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