13.4.2 触发PendSV中断和开启节拍定时器SysTick
FreeRTOS在ARM Cortex-M3内核的处理器上运行,任务切换是通过内核的一种软件中断PendSV来实现的,要理解任务切换,这是重要的知识。
为什么会开启节拍定时器SysTick呢?因为RTOS通过节拍定时器SysTick的中断服务来实时检测各任务的运行情况,让任务在就绪、运行、阻塞和挂起间切换。FreeRTOS在节拍定时器SysTick中断过程中调用xTaskIncrementTick()函数,节拍定时器SysTick就好比人的心脏,在不停地发生跳动。
触发PendSV中断和开启节拍定时器SysTick是通过xPortStartScheduler()函数来实现的,该函数位于“port.c”文件中,主要的内容如下。

主要语句功能如下。
①设置PendSV优先级为最低。(https://www.daowen.com)
②设置SysTick优先级为最低。
③初始化节拍定时器SysTick,此处是直接采用寄存器的方式配置初值,代码如下。

以上程序中的configSYSTICK_CLOCK_HZ是STM32 F1系列MCU的系统时钟,应用时要特别注意,它是通过一个宏来定义的,与CPU的系统时钟对应。configTICK_RATE_HZ是节拍值,在配置文件中定义,可以修改。第一条语句是装载初值,第二条语句是开启节拍定时器SysTick。
④初始化临界区嵌套计数器,也就是中断的嵌套层数。
⑤调用prvStartFirstTask()函数开启第一个任务,第一次启动调用。