【秋招】FreeRTOS常见问题汇总

创建一个任务(源码)

  1. 内存分配:为任务控制块(Task Control Block,TCB)和任务栈分配内存。

    • 通过内存管理机制获取足够的内存来存储 TCB 和任务栈的空间。
  2. 初始化任务控制块(TCB):

    • 设置任务的状态为就绪(Ready)。
    • 为任务分配优先级。
    • 初始化任务的一些其他属性,如任务名称等。
  3. 将任务添加到就绪列表:

    • 根据任务的优先级,将任务插入到相应的就绪列表中,以便调度器进行调度。
  4. 初始化任务栈:

在这里插入图片描述

  • 将任务的初始上下文(如 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MBHB

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值