创建一个任务(源码)
-
内存分配:为任务控制块(Task Control Block,TCB)和任务栈分配内存。
- 通过内存管理机制获取足够的内存来存储 TCB 和任务栈的空间。
-
初始化任务控制块(TCB):
- 设置任务的状态为就绪(Ready)。
- 为任务分配优先级。
- 初始化任务的一些其他属性,如任务名称等。
-
将任务添加到就绪列表:
- 根据任务的优先级,将任务插入到相应的就绪列表中,以便调度器进行调度。
-
初始化任务栈:

- 将任务的初始上下文(如 CPU 寄存器的值)保存到任务栈中,以便任务恢复执行时使用。
- 创建任务函数最重要的就是伪造现场,而伪造现场最重要的就是将任务函数地址放入PC寄存器,任务函数参数放入R0寄存器,当启动第一个任务时将现场恢复时(将栈里的寄存器数值恢复到CPU寄存器中),则PC寄存器就存放了任务函数的地址,R0就存放了函数的参数,则PC为程序计数器,则会程序会跳转至该任务函数执行,而R0寄存器就是该任务函数的参数传递过去。
就绪队列是什么?
绪链表实际上就是一个 List_t 类型的数组,数组的大小由决定最 大 任 务 优 先 级 的 宏 configMAX_PRIORITIES 决 定 , configMAX_PRIORITIES 在FreeRTOSConfig.h 中默认定义为 5,最大支持 256 个优先级。数组的下标对应了任务的优先级,同一优先级的任务统一插入到就绪列表的同一条链表中,任务调度的时候就是从高优先级的链表开始遍历,确保高优先级的任务先执行。
任务调度器
- 指定当前任务
- 将pendsv中断和systick中断优先级设置为最低
- 设置主堆栈指针、开启全局中断、触发svc中断
- svc-手动恢复R4-R11寄存器,更新PSP,然后以线程模式返回,并使用PSP指针,PSP所指位置的值自动恢复到寄存器
任务切换函数 taskYIELD()
任务切换其实是由PendSV中断来完成的,portYIELD

最低0.47元/天 解锁文章
5240

被折叠的 条评论
为什么被折叠?



