FreeRTOS开始第一个任务源码分析 vTaskStartScheduler:
1.创建一个空任务:优先级为0
2.是否使用软件定时器,是的话 创建软件定时器
3.关闭中断(关中断操作的寄存器是BASEPRI,开中断在SVC中断服务函数中开启)
4.初始化静态全局变量(xNextTaskUnblockTime\xSchedulerRunning\xTickCount)
5.初始化跟内核有关的硬件:xPortStartScheduler
xPortStartScheduler:
1.设置PENDSV 和 SYSTICK的中断为最低优先级==》怎样设置:(优先级分组)
portNVIC_SYSPRI2_REG |= portNVIC_PENDSV_PRI;
portNVIC_SYSPRI2_REG |= portNVIC_SYSTICK_PRI;
2.配置systick=》怎样配置的?中断周期、使能【看systick寄存器】
portNVIC_SYSTICK_LOAD_REG = ( configCPU_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL;
portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK | portNVIC_SYSTICK_INT | portNVIC_SYSTICK_ENABLE;
3.如果MCU有FPU,使能FPU=》【权威指南 13.2】
4.开启惰性压栈,跟FPU有关【权威指南13.2.6】
5.开启第一个任务
prvStartFirstTask
1.获取MSP的初始值
2.关中断操
3.调用SVC 0,【引起SVC中断,进入SVC中断服务函数】【只有开启第一个任务才会引起SVC异常,其他不会】
4.进入线程模式,使用PSP。PSP=>进程栈,MSP=》主堆栈【权威指南】
5.跳转PC指针