精华内容
下载资源
问答
  • 3. freertos调度器启动、中断优先级管理、中断优先级分组永远不要小看不起眼的东西,哪怕是短短的一行代码!(某些图片分辨率过大显示不清楚,保存到本地或拖动可放大)。很多例程将vTaskStartScheduler函数作为main...

    3. freertos调度器启动、中断优先级管理、中断优先级分组

    永远不要小看不起眼的东西,哪怕是短短的一行代码!

    (某些图片分辨率过大显示不清楚,保存到本地或拖动可放大)。

    很多例程将vTaskStartScheduler函数作为main执行的最后一行代码,因为执行了vTaskStartScheduler后主权便交给了freertos调度器,程序永远不会在这个函数中得到返回。

    vTaskStartScheduler主要动作有:创建IDLE任务,初始化systick等重要寄存器,手动触发中断重新配置MSP并返回到handle模式执行第一个任务。如图展示源码主要流程:

    d6a6a8c012127296736a71fff4acf6c2.png

    (调度器启动流程)

    流程分析:

    3.1 创建IDLE任务

    vTaskStartScheduler函数中创建了名为IDLE的任务,这个任务的功能先不管它,先饶它不死等对源码逐个击破后它就会不攻自破。

    3.2 关中断

    某些不可重入代码段或定义的一些全局变量,在使用它们之前往往先进入临界区保护下,以免突发事件产生时破坏当前正要处理的数据。比如一些全局变量,如果在中断里或多个任务中都被使用到,当任务正在处理某个全局数组的数据时,此时中断发生并更新了数组中的数据,这样中断返回后就会产生一些不可预料的结果。

    记得在实习那会写过不少这样的错误代码,没有考虑代码能不能重入,结果只能害人害己啊~。

    在task.c中有一些全局变量,freertos为了保护这些变量数据在处理时不被异常破坏而使用了中断屏蔽,不过这种操作并没有将所有可屏蔽中断一股脑全部杀死:freertos提供了“可管理的中断范围”。以某个中断优先级为阈值,优先级低于(或等于)此分界线的中断将全部屏蔽,较高的中断则不受影响。当然不会白白让“高等”优先级执行的,代价便是freertos不会让高优先级的中断参与任何api的调用。所以“高等”优先级是否触发都不会影响freertos的正常运行。

    事实上能够有如此方便的屏蔽操作还要归功于CM3/CM4中NVIC的强大。写到这里,终于引出今天的主角了~。NVIC :嵌套向量中断控制器是CM3/CM4内核水平上搭载了一个异常响应系统,支持为数众多的系统异常和外部中断。不仅如此,NVIC拥有者更多精巧的设计,BASEPRI寄存器便是其中之一,屏蔽中断所使用的阈值就存储在其中,屏蔽时将需要屏蔽中断的最高优先级值填入寄存器便能达到效果。如果向BASEPRI写0则意味着停止掩蔽任何中断。

    在配置头文件中可以看到阈值的身影:configMAX_SYSCALL_INTERRUPT_PRIORITY

    freertos执行中断屏蔽的源码:

    mov r1, #configMAX_SYSCALL_INTERRUPT_PRIORITY msr basepri, r1 

    3.3 优先级定义

    CM3中使用了8位寄存器来表达中断优先级,所以原则上,CM3支持256级可编程优先级和3个固定优先级(复位,NMI ,硬 fault)。

    但是,绝大多数 CM3 芯片都会精简设计,对优先级有效位数进行裁剪以达到减少优先级数的目的,不过无论怎样裁剪,有效位都是在高位开始算起。

    注:CM3 允许的最少使用位数为 3 个位,亦即至少要支持 8 级优先级。增加位数将增加更多成本和功耗。

    优先级的数值越小,则优先级越高

    举个例子,使用了3位有效位表达优先级的寄存器:

    eb2ba31cafe2a3e78430f83489d752d9.png

    (使用了3位有效位表达优先级)

    对有效位写1能读回1,无效位读回0,上图寄存器中,若对它写入0xFF则读回0xE0,可以使用读回的方法判断芯片支持多少级中断。

    对比下3位和4位优先级状况:

    1320626d36c1def8752160fc2043f0a1.png

    (3-4优先级对比)

    上图还是来自宝典,有图截取真爽。很明显4位要比3位表示的优先级范围更细致些,当然这是废话,不过为什么一定要将有效位放在高位,而不放在低位更直观。这也完全是为了开发者考虑,高位可以简化程序的跨器件移植:

    假设一个程序要从4位向3位上移植(3位向4位上移植肯定是没问题的,因为4位范围更广),在没有刻意更改优先级的情况下如图:

    d393f2b41a7dd0440d17ab2e757201aa.png

    (MSB减少有效位状况)

    移植后优先级有效位减少,原来相邻的两个优先级被置为一个,消失的中断优先级被拉高,不过这些改变将不会带来致命错误。

    如果使用低位来代表有效位的话将不会这样幸运了:

    1c38ba982a84f7f3daaa5dd14fb3016f.png

    (LSB减少有效位状况)

    红色区域出现移植后超过7的优先级反而升高,这对于之前的程序将会带来不可预测的错误。

    3.4优先级分组

    最后一个函数xPortStartScheduler中有一段断言宏打开时执行的代码,调试阶段肯定要将断言配置打开,这样便于程序在调试阶段及时发现异常。程序段如下:

    4703bba04912c2dab7c30febe7130c6a.png

    乍一看完全不知道执行这段程想要达到的目的,想要弄清楚之前首先要搞懂优先级分组的原则。

    关于优先级分组的信息,引用宝典的原话:“为了使抢占机能变得更可控,CM3 还把 256 级优先级按位分成高低两段,分别是抢占优先级和亚优先级。 NVIC 中有一个寄存器是“应用程序中断及复位控制寄存器”,它里面有一个位段名为“优先级组”。该位段的值对每一个优先级可配置的异常都有影响——把其优先级分为个位段:MSB 所在的位段(左边的)对应抢占优先级,而 LSB 所在的位段(右边的)对应亚优先级”。

    338352bb021ac3cfe801958e9731e178.png

    (分组位与分组优先级对应表)

    抢占优先级决定了抢占行为:当系统正在响应某异常 L 时,如果来了抢占优先级更高的异常 H,则 H 可以抢占 L。亚优先级则处理“内务”:当抢占优先级相同的异常有不止一个悬起时,就优先响应亚优先级最高的异常。这种优先级分组规定:亚优先级至少是 1 个位。因此抢占优先级最多是 7 个位,造成了最多只有 128 级抢占的现象。但是 CM3 允许从比特 7 处分组,此时所有的位都表达亚优先级,没有任何位表达抢占优先级,因而所有优先级可编程的异常之间就不会发生抢占——相当于在它们之中除能了CM3 的中断嵌套机制。

    注:分组位置可以在无效位,在任意无效位的效果都一样,它们都舍去了亚优先级。

    那么了解优先级分组之后,再去分析上面断言宏的主要动作,先向某个外部中断优先级配置寄存器写0xFF再读回,主要判断芯片有多少优先级有效位,然后根据有效位左移依次将最大分组数7减1,这样便得到了能够划分抢占优先级为最大数的分组最大位置,例如开发板优先级有效位为3(优先级寄存器7,6,5位),优先级最多能被分为8组,但是能够将其分为8组的分组位置为4,3,2,1,0。这段程序只取最大值所以ulMaxPRIGROUPValue值得到为4。

    ulMaxPRIGROUPValue值将会在freertos提供的中断api中被使用到,这些api中都会首先执行vPortValidateInterruptPriority()函数。这个函数中有两个断言宏,第一个检查了当前的中断优先级是否低于可屏蔽的中断(上文提到高于可屏蔽的优先级不允许调用freertos的中断api);第二个检查NVIC中设置的分组值是否大于ulMaxPRIGROUPValue,如果大于则意味着存在着主优先级和亚优先级,freertos不允许存在亚优先级,否则断言宏伺候,贴下注释原话:Priority grouping: The interrupt controller (NVIC) allows the bits that define each interrupt's priority to be split between bits that define the interrupt's pre-emption priority bits and bits that define the interrupt's sub-priority. For simplicity all bits must be defined to be pre-emption priority bits. The following assertion will fail if this is not the case (if some bits represent a sub-priority).

    按注释的描述是为了简化而不去设置亚优先级。

    3.5 调度器最后的配置

    在调度器启动之前还进行了:

    1. 配置了两个中断PendSV 和SysTick的优先级,配置头文件中的宏

    configKERNEL_INTERRUPT_PRIORITY表示它们的中断级别,configKERNEL_INTERRUPT_PRIORITY数值一定要大于或等于宏configMAX_SYSCALL_INTERRUPT_PRIORITY的值,或者说PendSV 和SysTick中断优先级一定要在可屏蔽中断范围内,若相反的话可就乱成一锅粥了。

    2. 开启freertos的心脏systick,填入计数值来决定systick中断频率,也是任务调度频率或说是时间片长度。

    3. 跳入prvPortStartFirstTask函数:

    ldr r0, NVIC_VTABLE_R // NVIC_VTABLE_R: 0xE000ED08 ,向量表偏移量寄存器的地址,需要现将向量表重定向ldr r0, [r0] ldr r0, [r0] //取出MSP新地址 msr msp, r0 //重新配置MSP地址 cpsie i //开中断 dsbisbsvc #0 //触发SVC中断

    至此,在进入SVC中断之前,freertos开启调度器代码流程已执行完毕,等待SVC中断处理完成后freertos便进入正轨。奔跑吧!fucking source code

    展开全文
  • stm32中断优先级分组

    2019-12-11 17:20:41
    stm32中断优先级分组 转载:http://news.eeworld.com.cn/mcu/article_2018053039408.html 一、抢占优先级和响应优先级 STM32 的中断向量具有两个属性,一个为抢占属性,另一个为响应属性,其属性编号越小,表明它的...

    stm32中断优先级分组

    转载:http://news.eeworld.com.cn/mcu/article_2018053039408.html

    一、抢占优先级和响应优先级
    STM32 的中断向量具有两个属性,一个为抢占属性,另一个为响应属性,其属性编号越小,表明它的优先级别越高。 抢占,是指打断其他中断的属性,即因为具有这个属性会出现嵌套中断(在执行中断服务函数A 的过程中被中断B 打断,执行完中断服务函数B 再继续执行中断服务函数A),抢占属性由NVIC_IRQChannelPreemptionPriority 的参数配置。 而响应属性则应用在抢占属性相同的情况下,当两个中断向量的抢占优先级相同时,如果两个中断同时到达, 则先处理响应优先级高的中断, 响应属性由NVIC_IRQChannelSubPriority 参数配置。例如,现在有三个中断向量,如下表。 若内核正在执行C 的中断服务函数,则它能被抢占优先级更高的中断A 打断,由于B和C 的抢占优先级相同,所以C 不能被B 打断。但如果B 和C 中断是同时到达的,内核就会首先响应响应优先级别更高的B 中断。

    二、NVIC 的优先级组
    在配置优先级的时候,还要注意一个很重要的问题,即中断种类的数量。NVIC 只可以配置16 种中断向量的优先级,也就是说,抢占优先级和响应优先级的数量由一个4 位的数字来决定,把这个4 位数字的位数分配成抢占优先级部分和响应优先级部分。有5 组分配方式:q 第0 组: 所有4 位用来配置响应优先级。即16 种中断向量具有都不相同的响应优先级。
    第1 组:最高1 位用来配置抢占优先级,低3 位用来配置响应优先级。表示有2 种级别的抢占优先级(0 级,1 级),有8 种响应优先级,即在16 种中断向量之中,有8 种中断,其抢占优先级都为0 级,而它们的响应优先级分别为0~7,其余8 种中断向量的抢占优先级则都为1 级,响应优先级别分别为0~7。
    第2 组:2 位用来配置抢占优先级,2 位用来配置响应优先级。即4 种抢占优先级,4 种响应优先级。
    第3 组:高3 位用来配置抢占优先级,最低1 位用来配置响应优先级。即有8 种抢占优先级,2 种响应2 优先级。q
    第4组:所有4 位用来配置抢占优先级,即NVIC 配置的16 种中断向量都是只有抢占属性,没有响应属性。
    要配置这些优先级组,可以采用库函数NVIC_PriorityGroupConfi g(),可输入的参数为NVIC_PriorityGroup_0 ~ NVIC_PriorityGroup_4,分别为以上介绍的5 种分配组。
    于是,有读者觉得疑惑了,如此强大的STM32,所有GPIO都能够配置成外部中断,USART、ADC 等外设也有中断,而NVIC 只能配置16 种中断向量,那么在某个工程中使用超过16 个中断怎么办呢?注意NVIC 能配置的是16 种中断向量,而不是16 个,当工程中有超过16 个中断向量时,必然有两个以上的中断向量是使用相同的中断种类,而具有相同中断种类的中断向量不能互相嵌套。

    展开全文
  • 3. freertos调度器启动、中断优先级管理、中断优先级分组 永远不要小看不起眼的东西,哪怕是短短的一行代码! 某些图片分辨率过大显示不清楚,保存到本地或点击放大会回复原状。 原本认为几分钟能搞定的...

    3. freertos调度器启动、中断优先级管理、中断优先级分组


    永远不要小看不起眼的东西,哪怕是短短的一行代码!

    某些图片分辨率过大显示不清楚,保存到本地或点击放大会回复原状。

    原本认为几分钟能搞定的vTaskStartScheduler函数结果一不小心弄到了中秋,还好有葵花宝典(CM3权威指南)在,不然中秋节就抱着一堆代码度过了。

    很多例程将vTaskStartScheduler函数作为main执行的最后一行代码,因为执行了vTaskStartScheduler后主权便交给了freertos调度器,程序永远不会在这个函数中得到返回。

    vTaskStartScheduler主要动作有:创建IDLE任务,初始化systick等重要寄存器,手动触发中断重新配置MSP并返回到handle模式执行第一个任务。如图展示源码主要流程:

    (调度器启动流程)

    流程分析:

    3.1 创建IDLE任务

    vTaskStartScheduler函数中创建了名为IDLE的任务,这个任务的功能先不管它,先饶它不死等对源码逐个击破后它就会不攻自破。

    3.2 关中断

    某些不可重入代码段或定义的一些全局变量,在使用它们之前往往先进入临界区保护下,以免突发事件产生时破坏当前正要处理的数据。比如一些全局变量,如果在中断里或多个任务中都被使用到,当任务正在处理某个全局数组的数据时,此时中断发生并更新了数组中的数据,这样中断返回后就会产生一些不可预料的结果。

    记得在实习那会写过不少这样的错误代码,没有考虑代码能不能重入,结果只能害人害己啊~。

    在task.c中有一些全局变量,freertos为了保护这些变量数据在处理时不被异常破坏而使用了中断屏蔽,不过这种操作并没有将所有可屏蔽中断一股脑全部杀死:freertos提供了“可管理的中断范围”。以某个中断优先级为阈值,优先级低于(或等于)此分界线的中断将全部屏蔽,较高的中断则不受影响。当然不会白白让“高等”优先级执行的,代价便是freertos不会让高优先级的中断参与任何api的调用。所以“高等”优先级是否触发都不会影响freertos的正常运行。

    事实上能够有如此方便的屏蔽操作还要归功于CM3/CM4中NVIC的强大。写到这里,终于引出今天的主角了~。NVIC :嵌套向量中断控制器是CM3/CM4内核水平上搭载了一个异常响应系统,支持为数众多的系统异常和外部中断。不仅如此,NVIC拥有者更多精巧的设计,BASEPRI寄存器便是其中之一,屏蔽中断所使用的阈值就存储在其中,屏蔽时将需要屏蔽中断的最高优先级值填入寄存器便能达到效果。如果向BASEPRI写0则意味着停止掩蔽任何中断。

    在配置头文件中可以看到阈值的身影:configMAX_SYSCALL_INTERRUPT_PRIORITY

    freertos执行中断屏蔽的源码:

    mov r1, #configMAX_SYSCALL_INTERRUPT_PRIORITY                    

    msr basepri, r1   


    3.3 优先级定义

    CM3中使用了8位寄存器来表达中断优先级,所以原则上,CM3支持256级可编程优先级和3个固定优先级(复位,NMI ,硬 fault)。

    但是,绝大多数 CM3 芯片都会精简设计,对优先级有效位数进行裁剪以达到减少优先级数的目的,不过无论怎样裁剪,有效位都是在高位开始算起。

    注:CM3 允许的最少使用位数为 3 个位,亦即至少要支持 8 级优先级。增加位数将增加更多成本和功耗。

    优先级的数值越小,则优先级越高

    举个例子,使用了3位有效位表达优先级的寄存器:

    (使用了3位有效位表达优先级)

    对有效位写1能读回1,无效位读回0,上图寄存器中,若对它写入0xFF则读回0xE0,可以使用读回的方法判断芯片支持多少级中断。

    对比下3位和4位优先级状况:

    (3-4优先级对比)

    上图还是来自宝典,有图截取真爽。很明显4位要比3位表示的优先级范围更细致些,当然这是废话,不过为什么一定要将有效位放在高位,而不放在低位更直观。这也完全是为了开发者考虑,高位可以简化程序的跨器件移植:

    假设一个程序要从4位向3位上移植(3位向4位上移植肯定是没问题的,因为4位范围更广),在没有刻意更改优先级的情况下如图:



    (MSB减少有效位状况)

    移植后优先级有效位减少,原来相邻的两个优先级被置为一个,消失的中断优先级被拉高,不过这些改变将不会带来致命错误。

    如果使用低位来代表有效位的话将不会这样幸运了:


    (LSB减少有效位状况)
    红色区域出现移植后超过7的优先级反而升高,这对于之前的程序将会带来不可预测的错误。

    3.4优先级分组

    最后一个函数xPortStartScheduler中有一段断言宏打开时执行的代码,调试阶段肯定要将断言配置打开,这样便于程序在调试阶段及时发现异常。程序段如下:


    乍一看完全不知道执行这段程想要达到的目的,想要弄清楚之前首先要搞懂优先级分组的原则。

    关于优先级分组的信息,引用宝典的原话:“为了使抢占机能变得更可控,CM3 还把 256 级优先级按位分成高低两段,分别是抢占优先级和亚优先级。 NVIC 中有一个寄存器是“应用程序中断及复位控制寄存器”,它里面有一个位段名为“优先级组”。该位段的值对每一个优先级可配置的异常都有影响——把其优先级分为个位段:MSB 所在的位段(左边的)对应抢占优先级,而 LSB 所在的位段(右边的)对应亚优先级”。


    (分组位与分组优先级对应表)

    抢占优先级决定了抢占行为:当系统正在响应某异常 L 时,如果来了抢占优先级更高的异常 H,则 H 可以抢占 L。亚优先级则处理“内务”:当抢占优先级相同的异常有不止一个悬起时,就优先响应亚优先级最高的异常。这种优先级分组规定:亚优先级至少是 1 个位。因此抢占优先级最多是 7 个位,造成了最多只有 128 级抢占的现象。但是 CM3 允许从比特 7 处分组,此时所有的位都表达亚优先级,没有任何位表达抢占优先级,因而所有优先级可编程的异常之间就不会发生抢占——相当于在它们之中除能了CM3 的中断嵌套机制。

    注:分组位置可以在无效位,在任意无效位的效果都一样,它们都舍去了亚优先级。

    那么了解优先级分组之后,再去分析上面断言宏的主要动作,先向某个外部中断优先级配置寄存器写0xFF再读回,主要判断芯片有多少优先级有效位,然后根据有效位左移依次将最大分组数7减1,这样便得到了能够划分抢占优先级为最大数的分组最大位置,例如开发板优先级有效位为3(优先级寄存器7,6,5位),优先级最多能被分为8组,但是能够将其分为8组的分组位置为4,3,2,1,0。这段程序只取最大值所以ulMaxPRIGROUPValue值得到为4。

    ulMaxPRIGROUPValue值将会在freertos提供的中断api中被使用到,这些api中都会首先执行vPortValidateInterruptPriority()函数。这个函数中有两个断言宏,第一个检查了当前的中断优先级是否低于可屏蔽的中断(上文提到高于可屏蔽的优先级不允许调用freertos的中断api);第二个检查NVIC中设置的分组值是否大于ulMaxPRIGROUPValue,如果大于则意味着存在着主优先级和亚优先级,freertos不允许存在亚优先级,否则断言宏伺候,贴下注释原话:Priority grouping:  The interrupt controller (NVIC) allows the bits that define each interrupt's priority to be split between bits that define the interrupt's pre-emption priority bits and bits that define the interrupt's sub-priority.  For simplicity all bits must be defined to be pre-emption priority bits.  The following assertion will fail if this is not the case (if some bits represent a sub-priority).

    按注释的描述是为了简化而不去设置亚优先级。


    3.5 调度器最后的配置

    在调度器启动之前还进行了:

    1.      配置了两个中断PendSV 和SysTick的优先级,配置头文件中的宏

    configKERNEL_INTERRUPT_PRIORITY表示它们的中断级别,configKERNEL_INTERRUPT_PRIORITY数值一定要大于或等于宏configMAX_SYSCALL_INTERRUPT_PRIORITY的值,或者说PendSV 和SysTick中断优先级一定要在可屏蔽中断范围内,若相反的话可就乱成一锅粥了。

    2.      freertos的心脏systick,填入计数值来决定systick中断频率,也是任务调度频率或说是时间片长度。

    3.      prvPortStartFirstTask函数由汇编实现:

    ldr r0, NVIC_VTABLE_R  // NVIC_VTABLE_R: 0xE000ED08 ,向量表偏移量寄存器的地址,需要现将向量表重定向

    ldr r0, [r0]        

    ldr r0, [r0]      //取出MSP新地址  

    msr msp, r0    //重新配置MSP地址                               

    cpsie i       //开中断                     

    dsb

    isb

    svc #0   //触发SVC中断

    至此,在进入SVC中断之前,freertos开启调度器代码流程已执行完毕,等待SVC中断处理完成后freertos便进入正轨。奔跑吧!fucking source code






    展开全文
  • STM32的 NVIC中断优先级分组 中断 CM3 内核支持 256 个中断,其中包含了 16 个内核中断和 240 个外部中断,并且具有 256 级的可编程中断设置。 STM32 并没有使用 CM3 内核的全部东西,而是只用了它的一部分。 STM32 ...

    STM32的 NVIC中断优先级分组

    中断

    CM3 内核支持 256 个中断,其中包含了 16 个内核中断和 240 个外部中断,并且具有 256
    级的可编程中断设置。

    STM32 并没有使用 CM3 内核的全部东西,而是只用了它的一部分。

    STM32 有 84 个中断,包括 16 个内核中断和 68 个可屏蔽中断,具有 16 级可编程的中断优先级。

    我们常用的就是这 68 个可屏蔽中断, 但是 STM32 的 68 个可屏蔽中断,在 STM32F103 系列
    上面,又只有 60 个(在 107 系列才有 68 个)。
    在这里插入图片描述
    在这里插入图片描述

    但是中断太多了,我们需要一个管理方法来管理。

    中断管理方法:

    首先,对STM32中断进行分组,组0~4。同时,对每个中断设置一个抢占优先级和一个响应优先级值。

    分组配置是在寄存器SCB->AIRCR中配置:

    在这里插入图片描述

    抢占优先级 & 响应优先级的区别:

    ①高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的。

    ②抢占优先级相同的中断,高优先级的响应优先级不可以打断低响应优先级的中断。

    ④抢占优先级相同的中断,当两个中断同时发生的情况下,哪个响应优先级高,哪个先执行。

    ③如果两个中断的抢占优先级和响应优先级都是一样的话,则看哪个中断先发生就先执行。

    NVIC配置过程

    ①用NVIC_Init()初始化

    	NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;			//通道,在stm32f10x.h文件里面
    	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
    	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;		//子优先级(响应优先级)3
    	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
    	NVIC_Init(&NVIC_InitStructure);	//根据制定的参数初始化NVIC寄存器
    

    ②NVIC_PriorityGroupConfig(),设置NVIC中断分组

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
    												//该段放在主函数初始化位置
    
    展开全文
  • 3. freertos调度器启动、中断优先级管理、中断优先级分组 永远不要小看不起眼的东西,哪怕是短短的一行代码! (某些图片分辨率过大显示不清楚,保存到本地或拖动可放大)。 很多例程将vTaskStartScheduler函数...
  • Crotex-M3中断优先级分组 中断简介 中断是微控制器一个很常见的特性,中断由硬件产生,当中断产生以后CPU就会中断当前的流程转而去处理中断事务,Crotex-M3内核的MCU提供了一个用于中断管理的嵌套向量NVIC。 中断...
  • 之前学习嵌入式的时候不太明白中断优先级分组与抢占优先级和响应优先级的关系,比如分组为2,抢占优先级也为2,响应优先级也为2,就是不明白他们之间有什么关系,谁决定谁,总共有多少个数值可供选择。  趁着现在...
  • Cortex-M内核提出中断分组的概念,一共5组 NVIC_PriorityGroup_0 :0 bit 抢占优先级 4 bit 子优先级 NVIC_PriorityGroup_1 :1 bit 抢占优先级 3 bit 子优先级 NVIC_PriorityGroup_2 :2 bit 抢占优先级 2 bit ...
  • 数值越小,优先级越高 高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的。 抢占优先级相同的中断,高响应优先级不可以打断低响应优先级的中断。...中断优先级分组函数 在misc.c函数中 void NVIC_P...
  • 2.5.6 中断优先级分组 为了增强系统对中断的优先级控制,NVIC支持优先级分组。这种分组把每个中断优先级寄存器入口分为两块: 上半区定义了组优先级。 下半区定义了组里的子优先级。 只有组优先级决定了中断异常...
  • NVIC中断优先级分组

    千次阅读 2018-05-23 22:14:08
    CM7内核支持256个中断,其中包含了16个内核中断和...STM32具有16级可编程的中断优先级,而我们常用的就是这些可屏蔽中断。 ???几十个中断,怎么管理?首先,对STM32中断进行分组,组0~4,同时,对每个中断设置...
  • 之前学习嵌入式的时候不太明白中断优先级分组与抢占优先级和响应优先级的关系,比如分组为2,抢占优先级也为2,响应优先级也为2,就是不明白他们之间有什么关系,谁决定谁,总共有多少个数值可供选择。    ...
  • STM32中断优先级分组概念

    万次阅读 2016-12-20 09:19:23
    Cortex-M3允许具有较少中断源时使用较少的寄存器位指定中断源的优先级,因此STM32把指定中断优先级的寄存器位减少到4位,这4个寄存器位的分组方式如下:第0组:所有4位用于指定响应优先级第1组:最高1位用于指定抢占...
  • STM32中断优先级分组

    千次阅读 2015-11-26 14:14:33
    Cortex-M3的中断优先级分组方式最多可以有有8种,因为CM3强制规定:SubPriority至少要占一个位(如果没有该强制规定,那么CM3分组方式最多有9种)。 我们知道:STM32把指定中断优先级的寄存器的MSB4位有效,共有...
  • STM32F4设置NVIC中断优先级分组

    千次阅读 2017-01-16 14:32:42
    同时,对每个中断设置一个抢占优先级和一个响应优先级值。 分组配置是在寄存器SCB->AIRCR中配置: 高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的。抢占优先级相同的中断,高响应优先级不可以打断低...
  • 优先级分组相关问题 问题八:如何设置系统的优先级分组? 答:一个系统,优先级分组只须设定一次,那么应该如何设定呢? 当然是根据整个系统的需求来综合考虑了。 还是以身份证为例,在发放身份证之前,我们要总体...
  • 关于中断寄存器主要有:ISER(使能中断),ICER(失能中断),IP(用来设置中断优先级) 优先级的定义 GD32或者ST32使用4个bit来表示中断优先级,优先级又被分为抢占优先级和子优先级。数值越小,优先级越高。如果抢占...
  • STM32(Cortex-M3)中有两个优先级的概念——抢占式优先级和响应优先级,有人把响应优先级称作’亚优先级’或’副优先级’,每个中断源都需要被指定这两种优先级。 具有高抢占式优先级中断可以在具有低抢占式优先级...
  • 优先级分组只分一次。配置SCB->AIRCR[10:8],就确定了每个中断的IP[7:4],也就是确定了每个中断抢占优先级和响应优先级在IP中所占的位数。之后就可以在初始化配置中单独设置每个中断的优先级。
  • 【stm32】 中断优先级分组

    千次阅读 2018-09-05 11:49:13
    在stm32开发中,我们...中断优先级中抢占优先级与响应优先级位数可自行分配。 初始化时NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //2 位抢占优先级、2位响应优先级 可根据需要自行替代分配,如下: ...
  • STM32F103系列上面,又只有60个可屏蔽中断(在107系列才有68个) 中断管理方法 首先,对STM32中断进行分组,组0~4。同时,对每个中断设置...抢占优先级相同的中断,高响应优先级不可以打断低响应优先级中断。...
  • stm32的中断向量表和中断优先级分组

    千次阅读 2019-06-19 16:39:06
    STM32F具有多达 98 个可屏蔽中断通道(不包括带 FPU 的Cortex®-M7 的 16 根中断线),16 个可编程优先级(使用了 4 位中断优先级),可以将中断分成5个组,分别为组0-4;同时,对每个中断设置一个抢占优先级和响应...
  • * 形 参: 无 * 返 回 值: 无 ********************************************************************************************************* */ void bsp_Init(void) { /* 优先级分组设置为 4, 优先配置好 NVIC */...
  • STM32F103系列NVIC中断优先级分组讲解

    千次阅读 2019-05-17 16:29:33
    但是STM32只用到了CM3内核的一部分,STM32有84个中断,包括16个内核中断和68个可屏蔽中断,具有16级可编程中断优先级。 STM32F103系列只有60个可屏蔽中断。 二、中断管理 1.对STM32进行中断分组,组0-4,同时对...
  • CM3里面有很多中断,有更高的优先级层数。但是stm32f103被阉割了好多。... STM32有84个中断,包括16个内核中断和68个可屏蔽中断,具有16级可编程的中断优先级。  STM32F103系列上面,又只有6...
  • stm32-端口复用映射以及中断优先级 一.端口复用映射 为什么会有端口复用以及映射的概念呢?因为MCU内部集成了内部外设,就是类似ADC、USART等设备,这些设备与外界的连接也是通过GPIO端口的。这就使得GPIO端口应该...
  • 6.中断优先级分组NVIC

    2018-09-11 16:57:16
    void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup) void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)   typedef struct NVIC_InitTypeDef{ ... //中断通道 uint8_t NVIC_IRQCha...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 479
精华内容 191
关键字:

中断优先级分组