FreeRTOS for STC32G12K128内核代码解读(二)任务调度(上)
本帖最后由 gentleman 于 2024-3-3 07:24 编辑FreeRTOS for STC32G12K128内核代码解读(二)任务调度(上)
还是先放张图
了解下图过程的就不必看了
1.第一个任务 是如何开启的
1.1建立空闲任务
建立好任务之后
就调用vTaskStartScheduler(); 开启任务调度了
跳进去
xReturn = xTaskCreate( prvIdleTask,
这里建立里个空闲任务
空闲任务优先级为0
cpu空闲时调用(无其他高优先级任务运行)
具体内容在调用时在看
1.2 配置tick 定时器
初始化一些变量
开启任务调度标志
Tick计数置0--默认1Tick是1msFreeRTOS的调度离不开这个Tick计数器
跳进去xPortStartScheduler() 开启任务调度的接口函数
再跳 prvPortSetupTimerInterrupt() 配置定时器接口函数
这部分是特别熟悉的代码了
开启定时器0
1T模式
1ms自动重载
这个定时器 也被称为滴答定时器, FreeRTOS 的轮询,延时操作 等都是通过这个定时器中断实现的
1.3修改SP指针
返回到xPortStartScheduler() 开启任务调度的接口函数
portRESTORE_SPX();
发现这个是个宏
包含一些汇编代码
这里又要补充知识了
下图为c251 寄存器结构
原来的栈指针 spx 再寄存器DR60中
这段代码 将pxCurrentTCB (由于TCB第一项为 RTOS 的(堆)栈指针,所以pxCurrentTCB 也是RTOS的(堆)栈指针 pxTopOfStack)
通过一些MOV指令和中间的寄存器 将低2位赋值给单片机的栈指针(DR60)
高位通过与操作置0(spx指针只有16位)
现在 单片机级的栈 就被改成了RTOS 的栈
继续
又是一段 宏
1.4 出栈 恢复现场(第一次开启任务其实只有DR0存放任务参数,后面切换任务时才有其他寄存器的值)
这段就是出栈指令了
POP 指令 将RTOS(堆)栈的内容
恢复到寄存器中
(SP指针 会移动 -被恢复寄存器空间的大小)
看RTOS(堆)栈
POP DR56 后 sp指针指向了PSW1
1.5 ERET修改PC指针,开启任务
继续看代码
再展开
恢复PSW1
看ROTS(堆)栈
那现在SP指针 可就指向任务函数入口了
开启总中断
最后的0AAH 是这条指令
ERET
将SP 指针指向的地址(函数入口) 给PC(24位)
上文说过,PC指针就是程序执行代码在存储器中的地址
到此任务切换成功
本帖最后由 gentleman 于 2024-3-28 10:49 编辑
上期 任务建立(下)FreeRTOS for STC32G12K128内核代码解读(一)任务建立(下) - FreeRTOS/实时操作系统/文件系统/嵌入式系统软件,TFT-GUI/uGFX - 国芯论坛-STC全球32位8051爱好者互助交流社区 - STC全球32位8051爱好者互助交流社区 (stcaimcu.com)
下期
任务调度(中) FreeRTOS for STC32G12K128内核代码解读(二)任务调度(中) - FreeRTOS/实时操作系统/文件系统/嵌入式系统软件,TFT-GUI/uGFX - 国芯论坛-STC全球32位8051爱好者互助交流社区 - STC全球32位8051爱好者互助交流社区 (stcaimcu.com)
占楼备用 来学习一下 这个太厉害了,大牛{:smile:} 请问 FreeRTOS 支持C51吗? STC8 系列的支持吗?
大锤子 发表于 2024-3-19 11:20
请问 FreeRTOS 支持C51吗? STC8 系列的支持吗?
理论上,可以
不过显然32g系列更适合一些
8系列最大ram是8k,跑任务多了堆栈可能会爆
8系列目前好像没人移植
gentleman 发表于 2024-3-19 18:47
理论上,可以
不过显然32g系列更适合一些
8系列最大ram是8k,跑任务多了堆栈可能会爆
好吧, 8系列就裸机好了。
页:
[1]