一、启动第一个任务流程:
创建开始任务:start_tsak
启动任务调度器:vTaskStartScheduler
1.创建空闲任务:prvIdleTask
2.创建软件定时器任务:xTimerCreateTimerTask
3.关中断(在启动第一个任务时开启)
4.初始化一些全局变量...
5.初始化任务运行时间统计功能的时基定时器
6.调用函数xPortStartScheduler完成启动任务调度器
(1.配置 PendSV 和 SysTick 的中断优先级为最低优先级(优先级0)
(2.调用函数 vPortSetupTimerInterrupt()配置 SysTick
(3.调用函数 prvEnableVFP()使能 FPU
(4.将 FPCCR 寄存器的[31:30]置 1,这样在进出异常时, FPU 的相关寄存器就会自
动地保存和恢复
(5.调用函数 prvStartFirstTask()启动第一个任务
二、任务切换流程:
触发pendsv中断(1、滴答定时器中断触发2、调用FreeRTOS的API函数触发,如:portYIELD( )
)
(1、当前的psp是正在运行的任务的栈指针,读取当前psp进程指针,存入r0
(2、压栈(保存现场)
(3、获取当前最高优先级任务的任务控制块
(4、出栈(恢复现场)
(5、更新切换后的任务的的栈指针给PSP(双堆栈指针、中断内使用MSP)
(6、bx r14 执行新任务函数
该笔记来源于正点原子FreeRTOS教程