第一个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 模式,并使用任务栈