前言
在学习FreeRTOS时,到了任务调度学习的时候,都会碰到将pendSV异常和Systick异常的优先级设定为最低的语句,如下:
/* Make PendSV and SysTick the lowest priority interrupts. */
portNVIC_SYSPRI2_REG |= portNVIC_PENDSV_PRI;
portNVIC_SYSPRI2_REG |= portNVIC_SYSTICK_PRI;
这两句就是将控制pendSV和Systick异常的内核SCB外设,关于控制这两个异常的优先级寄存器的对应位设置为15的优先级,也就是最低的优先级。
问题在于,只是看代码的话不知道为什么将他们两个设置为最低优先级,笔者看了野火和正点原子的FreeRTOS的开发手册,只是照着源代码说这两个要设置为最低,并且解释了这两个优先级是通过哪个寄存器来设置的优先级。真正要理解为什么要这样设置,可能还是要对照着《CM3权威指南》中的第七章-异常-7.6 SVC和PendSV来理解。
SysTick异常
CM3处理器的异常向量表中的前16个内容包含了所有的内核级别的异常,笔者关于异常和中断的文章中解释过,不能简单的把异常和中断统称为中断,不利于对CM3的异常系统的理解。
SysTick处于异常中最末位,优先级是可编程的,这点也意味着它的优先级可以人为的设置,也正因为这点,在设计RTOS的时候利用它很好的解决了实时性的问题。
在一个没有外部中断的系统中,我们利用SysTick异常周期性出现的特点,对一个具有两个任务的系统进行任务的来回切换。通俗的说,就是有个两个任务,任务A和任务B。在SysTick发生的周期下,每发生一次SysTick异常,就从A切换到B,或者从B切换到A。此时SysT