第一个task是怎么起来的呢?分析完vTaskStartScheduler,就会有答案了。
那vTaskStartScheduler()干了啥呢?
一、创建prvIdleTask task
二、xTimerCreateTimerTask里创建prvTimerTask task
三、初始化一些全局变量
3.1
xNextTaskUnblockTime是下一个task运行的tick数
xSchedulerRunning 是否开始调度器
xTickCount 当前系统tick数
四、重点的重点是xPortStartScheduler函数
4.1 设置PendSV和SysTick的中断优先级
portNVIC_SYSPRI3_REG的定义:
0xe000ed20在M7里对应的寄存器叫做 System Handler Priority Register 3,是控制PendSV和SysTick中断优先级的寄存器:
4.2vPortSetupTimerInterrupt 中设置中断频率和使能中断
这两个寄存器定义:
0xe000e014 在M7里是SysTick Reload Value Register寄存器
0xe000e010 在M7里面是SysTick Control and Status Register 寄存器
4.3 配置FPU
4.4 prvPortStartFirstTask 开启第一个task
下面是一个多核的启动第一个task的例程
这里只分析了多核中的一个核,其余一样,不同的核里0x40198004中的内容不一样,debug如下:
芯片手册里也有讲到:
4.5 pendsv中断 vPortSVCHandler
prvPortStartFirstTask里面出发svc中断后,会跳转到vPortSVCHandler
此时r14里是什么呢,在任务创建章节里有提到:FreeRtos任务创建分析-CSDN博客
此时r14的值是
0xfffffffd是啥意思呢?
表示回归到thread 模式,并使用任务栈