【FreeRTOS操作系统教程】第12章 FreeRTOS中断优先级配置(重要)

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第12章F r e e R T O S中断优先级配置(重要)

本章节为大家讲解FreeRTOS中断优先级配置,此章节非常重要,初学者经常在这里犯迷糊。对于初学者来说,本章节务必要整明白。

12.1 NVIC基础知识

12.2 使用FreeRTOS时如何配置外设NVIC

12.3 FreeRTOS配置选项中NVIC相关配置

12.4 不受FreeRTOS管理中的的深入讨论

12.5总结

12.1N V I C基础知识

NVIC的全称是Nested vectored interrupt controller,即嵌套向量中断控制器。

对于M3和M4内核的MCU,每个中断的优先级都是用寄存器中的8位来设置的。8位的话就可以设置2^8 = 256级中断,实际中用不了这么多,所以芯片厂商根据自己生产的芯片做出了调整。比如ST 的STM32F1xx和F4xx只使用了这个8位中的高四位[7:4],低四位取零,这样2^4=16,只能表示16级中断嵌套。

对于这个NVIC,有个重要的知识点就是优先级分组,抢占优先级和子优先级,下面就以STM32为例进行介绍,STM32F1xx和F4xx都是只使用了这个8位寄存器的高四位[7:4]。

优先级分组 抢占优先级 子优先级 高4位使用情况描述 NVIC_PriorityGroup_0 0级抢占优先级 0-15级子优先级 0bit用于抢占优先级

4bit全用于子优先级 NVIC_PriorityGroup_1 0-1级抢占优先级 0-7级子优先级 1bit用于抢占优先级

3bit用于子优先级 NVIC_PriorityGroup_2 0-3级抢占优先级 0-3级子优先级 2bit用于抢占优先级

2bit用于子优先级 NVIC_PriorityGroup_3 0-7级抢占优先级 0-1级子优先级 3bit用于抢占优先级

1bit用于子优先级 NVIC_PriorityGroup_4 0-15级抢占优先级 0级子优先级 4bit全用于抢占优先级

0bit用于子优先级

图12.1 优先级分组

0,也就是没有抢占式优先级,只有子优先级,关于这个抢占优先级和这个子优先级有几点一定要说清楚。

●具有高抢占式优先级的中断可以在具有低抢占式优先级的中断服务程序执行过程中被响应,即中

断嵌套,或者说高抢占式优先级的中断可以抢占低抢占式优先级的中断的执行。

●在抢占式优先级相同的情况下,有几个子优先级不同的中断同时到来,那么高子优先级的中断优

先被响应。

●在抢占式优先级相同的情况下,如果有低子优先级中断正在执行,高子优先级的中断要等待已被

响应的低子优先级中断执行结束后才能得到响应,即子优先级不支持中断嵌套。

●Reset、NMI、Hard Fault 优先级为负数,高于普通中断优先级,且优先级不可配置。

●对于初学者还有一个比较纠结的问题就是系统中断(比如:PendSV,SVC,SysTick)是不是一

定比外部中断(比如SPI,USART)要高,答案:不是的,它们是在同一个NVIC下面设置的。

掌握了这些基础知识基本就够用了。另外特别注意一点,配置抢占优先级和子优先级,他们合并成的4bit数字的数值越小,优先级越高,这一点千万不要搞错了,下面通过12.2小节举一个实例。

12.2使用F r e e R T O S时如何配置外设N V I C

强烈推荐用户将Cortex-M3内核的STM32F103和Cortex-M4内核的STM32F407以及

STM32F429的NVIC优先级分组设置为4,即:NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);这

样中断优先级的管理将非常方便。这个也是官方强烈建议的。此函数在bsp_Init中第一个被调用:

/*

********************************************************************************************************* * 函 数 名: bsp_Init

* 功能说明: 初始化硬件设备。只需要调用一次。该函数配置CPU寄存器和外设的寄存器并初始化一些全局变量。

* 全局变量。

* 形 参: 无

* 返 回 值: 无

********************************************************************************************************* */

void bsp_Init(void)

{

/* 优先级分组设置为4, 优先配置好NVIC */

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);

bsp_InitUart(); /* 初始化串口 */

bsp_InitLed(); /* 初始LED指示灯端口 */

bsp_InitKey(); /* 初始化按键 */

}

(注意:一旦初始化好NVIC的优先级分组后,切不可以在应用中再次更改。)

设置NVIC的优先级分组为4表示支持0-15级抢占优先级(注意,0-15级是16个级别,包含0级),

不支持子优先级。反映在STM32标准库的配置上就是如下:

/*

********************************************************************************************************* * 函 数 名: TIM_Config

相关文档
最新文档