config开始的宏还有很多,可以在资料中查询。
1、FreeRTOS中断配置和临界段
FreeRTOS中断配置是一个很重要的内容,需要根据所使用的的MCU来具体配置。这需要了解MCU架构中有段中断的知识,本章会结合Cortex-M的NVIC来讲解STM32平台下的FreeRTOS终端配置。
1.1Cortex-M中断
1.1.1中断简介
中断是MCU一个很常见的特性,中断由硬件产生,当产生中断以后CPU就会中断当前的流程转而去处理中断服务,Cortex-M内核的MCU提供了一个用于中断管理的嵌套向量中断控制器(NVIC)。
Cortex-M3和M4的NVIC最多支持240个IRQ(中断请求)、1个不可屏蔽的中断(NMI)、1个Systick(滴答定时器)定时器中断和多个系统异常。
1.1.2中断管理简介
Cortex-M处理器有多个用于管理中断和异常的可编程寄存器,这些寄存器大多数都在NVIC和系统控制块(SCB)中,CMSIS将这些寄存器定义为结构体。以STM32F407为例,打开core_cm4.h,有两个结构体,NVIC_Type和SCB_Type。具体可以查看代码。
重点关心三个中断屏蔽寄存器:PRIMASK、FAULTMASK和BASEPRI。
1.1.3优先级分组定义
当多个中断来临的时候处理器应该响应哪一个中断是由中断的优先级来决定的,高优先级的中断(优先级编号小!)肯定是首先得到响应的,而且高优先级的中断可以抢占低优先级的中断,这就是嵌套中断。Cortex-M处理器的有些中断是具有固定优先级的,比如复位、NMI、HardFault,这些中断的优先级都是负数,优先级也是最高的。
Cortex-M处理器有三个固定优先级和256个可编程的优先级,最多有128个抢占等级,但是实际的优先级数量是由芯片厂商来决定的。比如,STM32就只有16级优先级。在设计芯片的时候会裁掉表达优先级的几个低端有效位,以减少优先级数,所以不管用多少位来表达优先级,都是MSB对齐的,如图就是用三位来表达优先级。
Bit0~Bit4没有实现,所以读他们总是返回0,写入他们则会忽略写入的值。因此,对于3个位的情况,可以使用的优先级为8:0X00、0X20、0X40、0X60、0X80、0XA0、0XC0、0XE0。注意,这个是芯片厂商决定的,比如STM32就选择了4位作为优先级!