正点原子FreeRTOS——任务调度
发布网友
发布时间:2024-10-01 09:40
我来回答
共1个回答
热心网友
时间:2024-10-22 12:00
开启任务调度器
使用函数vTaskStartScheler()启动任务调度器。内部实现包括:创建空闲任务、检查软件定时器、关闭中断以避免干扰、初始化全局变量、启动时基定时器、调用xPortStartScheler()完成硬件配置并启动第一个任务。
启动第一个任务
当需要启动任务A时,首先恢复CPU寄存器中的值,包括程序状态寄存器xPSR,程序计数器PC(R15),链接寄存器LR(R14),以及R12至R0。对于R4至R11,需要手动进行栈操作。进入中断后,硬件自动更新LR(R14)为EXC_RETURN。
prvStartFirstTask()函数初始化启动第一个任务的环境,重设MSP指针,并开启全局中断。
MSP指针管理程序运行时的栈空间,FreeRTOS中使用MSP用于中断,而PSP用于非中断状态。
vPortSVCHandler()在全局中断被使能并触发SVC中断后,执行中断服务函数。注意,SVC中断在启动第一个任务后仅调用一次。
任务切换
任务A切换到任务B的核心是切换CPU寄存器,涉及上下文切换过程。在PendSV中断服务函数中完成此操作。
PendSV中断的触发方式
通过向中断控制和状态寄存器ICSR的bit28写入1挂起PendSV来启动PendSV中断。此过程通过特定函数实现。
介绍关键指令
第一个指令使用__clz()获取寄存器[31:0]中最高几个0的数量,以确定最高优先级。第二个指令不断循环直至找到当前最高优先级任务的任务控制块。