精华内容
下载资源
问答
  • 2018-08-08 19:24:21

    Cortex-M内核提出中断分组的概念,一共5组

    NVIC_PriorityGroup_0 :0 bit 抢占优先级 4 bit 子优先级
    NVIC_PriorityGroup_1 :1 bit 抢占优先级 3 bit 子优先级
    NVIC_PriorityGroup_2 :2 bit 抢占优先级 2 bit 子优先级
    NVIC_PriorityGroup_3 :3 bit 抢占优先级 1 bit 子优先级
    NVIC_PriorityGroup_4 :4 bit 抢占优先级 0 bit 子优先级
    

    在老的MCU中,没有分组的概念,分组是为了更好地管理中断,可以将同一个优先级的任务放在同一分组里,先到先执行,同时到,按子优先级顺序执行。
    NVIC_SetPriorityGrouping(NVIC_PriorityGroup_4)意味着没有子优先级,只有抢占优先级的区别,跟老MCU基本一样
    NVIC_SetPriorityGrouping(NVIC_PriorityGroup_0)意味着没有抢占优先级,只有子优先级的区别

    中断分组设置好以后,设置中断任务的优先级
    NVIC_SetPriority(irq,pri0)
    irq 表示中断号,由MCU决定
    pri0 值域 0~15 根据前述分组,决定哪些位是 抢占优先级,哪些位是 子优先级
    数值越低,优先级越高
    当然,以上设置是在相应中断配置后,且相应中断使能的情况下才有效

    更多相关内容
  • STM32的抢占优先级与子优先级

    千次阅读 2020-07-08 15:06:31
    STM32 的中断向量具有两个属性,一个为抢占属性,另一个为... 而响应属性则应用在抢占属性相同的情况下,当两个中断向量的抢占优先级相同时,如果两个中断同时到达, 则先处理响应优先级高的中断, 响应属性由NVIC_I

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

    二、NVIC 的优先级组
    Cortex-M3允许具有较少中断源时使用较少的寄存器位指定中断源的优先级,因此STM32把指定中断优先级的寄存器位减少到4位,这4个寄存器位的分组方式如下:
    第0组:所有4位用于指定响应优先级
    第1组:最高1位用于指定抢占式优先级,最低3位用于指定响 应优先级
    第2组:最高2位用于指定抢占式优先级,最低2位用于指定响应优先级
    第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级
    第四组:所有4位用于指定抢占式优先级

    M3用8bitsSTM32用高四位来表示抢占和子优先级:bit=1表示抢占bit=0表示非抢占即子优先级;所以共有5中方案分组:
    分组 Bit7 Bit6 Bit5 Bit4 说明:
    第0组 0 0 0 0
    第1组 1 0 0 0
    第2组 1 1 0 0 抢占共有22=4(03);子优先级2</sup>2=4(03),共44=16级嵌套
    第3组 1 1 1 0 抢占共有23=4(07);子优先级2</sup>1=2(01),共8
    2=16级嵌套
    第4组 1 1 1 1
    到底谁优先:数字越小优先级越高,抢占级数字小的可剥夺抢占级数字大的
    1抢占相同,子优先级不同:此时没有抢占剥夺,此时按照子优先级顺序排序
    2抢占和子优先级都相同但有先后:此时无抢占剥夺,依照FIFO,前一个执行完了才能执行后者;
    3抢占和子优先级都相同且同时到达:此时按照中断向量表顺序排先后

    三、举例说明
    中断优先级设置步骤:
    系统运行后先设置中断优先级分组。在主函数调用函数:void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);
    整个系统执行过程中,只设置一次中断分组。
    针对每个中断,设置对应的抢占优先级和响应优先级:
    //配置过程
    void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);
    NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口1中断,此处可改为任何有中断功能的模块定时器,外部中断等,
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;// 抢占优先级为1
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;// 子优先级位2
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//IRQ通道使能
    NVIC_Init(&NVIC_InitStructure); //根据上面指定的参数初始化NVIC寄存器
    如果需要挂起/解挂,查看中断当前激活状态,分别调用相关函数即可。
    优先级分组只是给抢占优先级与响应优先级在中断优先级寄存器中高四位分配各个优先级数字所占的位数,在程序中只能设定一次。

    每写一个关于中断优先级的程序必须包含下列两个函数:
    (1)void NVIC_PriorityGroup();//写在主程序中;
    (2)NVIC_Init(); //写在初始化配置中

    默认情况下,如何不设置中断优先级分组,则中断优先级分组默认为0,即0位抢占优先级,4位响应优先级,则无任何抢占优先级,所以无论中断的优先级设多少,都没有抢占中断的功能,所以,如果想要一个中断打断另一个中断,必须设置中断优先级分组为1,2,3,4.
    如设置优先级分组为2:NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

    具体例子如下:
    {
    假设NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1)则

    // 使能EXTI0中断 NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; // 指定抢占式优先级别1 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 指定响应优先级别0 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); // 使能EXTI9_5中断 NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 指定抢占式优先级别0 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 指定响应优先级别1 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); //TIM3中断 NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级0级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //响应优先级3级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能 NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器 TIM_Cmd(TIM3, ENABLE); //使能TIMx外设 

    在上例子中,优先抢占优先级,其数字越低,优先级越高。相同下比较响应优先级,其数字越低,优先级越高

    **Tips:**代码中抢占优先级0,1等,响应优先级(子优先级)0,1,3等,都是由自己设置的,但是必须在抢占优先级或者响应优先级设定的范围内。

    展开全文
  • stm32的抢占优先级和响应优先级(也叫子优先级

    万次阅读 多人点赞 2019-04-25 18:30:41
    一、抢占优先级和响应优先级 STM32 的中断向量具有两个属性,一个为抢占属性,另一个为响应属性,其属性编号越小,表明它的优先级别越高。 抢占,是指打断其他中断的属性,即因为具有这个属性会出现嵌套中断(在执行...

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

    二、NVIC 的优先级组
    Cortex-M3允许具有较少中断源时使用较少的寄存器位指定中断源的优先级,因此STM32把指定中断优先级的寄存器位减少到4位,这4个寄存器位的分组方式如下:
    第0组:所有4位用于指定响应优先级
    第1组:最高1位用于指定抢占式优先级,最低3位用于指定响 应优先级
    第2组:最高2位用于指定抢占式优先级,最低2位用于指定响应优先级
    第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级
    第四组:所有4位用于指定抢占式优先级

    M3用8bitsSTM32用高四位来表示抢占和子优先级:bit=1表示抢占bit=0表示非抢占即子优先级;所以共有5中方案分组:
    分组  Bit7 Bit6  Bit5  Bit4 说明:
    第0组 0   0    0   0
    第1组 1   0    0   0
    第2组 1   1    0   0 抢占共有22=4(0~3);子优先级22=4(0~3),共44=16级嵌套
    第3组 1   1    1   0  抢占共有23=4(0~7);子优先级21=2(0~1),共8
    2=16级嵌套
    第4组 1   1    1   1
    到底谁优先:数字越小优先级越高,抢占级数字小的可剥夺抢占级数字大的
    1抢占相同,子优先级不同:此时没有抢占剥夺,此时按照子优先级顺序排序
    2抢占和子优先级都相同但有先后:此时无抢占剥夺,依照FIFO,前一个执行完了才能执行后者;
    3抢占和子优先级都相同且同时到达:此时按照中断向量表顺序排先后

    三、举例说明
    中断优先级设置步骤:
    系统运行后先设置中断优先级分组。在主函数调用函数:void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);
    整个系统执行过程中,只设置一次中断分组。
    针对每个中断,设置对应的抢占优先级和响应优先级:
    //配置过程
    void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);
    NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口1中断,此处可改为任何有中断功能的模块定时器,外部中断等,
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;// 抢占优先级为1
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;// 子优先级位2
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//IRQ通道使能
    NVIC_Init(&NVIC_InitStructure); //根据上面指定的参数初始化NVIC寄存器
    如果需要挂起/解挂,查看中断当前激活状态,分别调用相关函数即可。
    优先级分组只是给抢占优先级与响应优先级在中断优先级寄存器中高四位分配各个优先级数字所占的位数,在程序中只能设定一次。

    每写一个关于中断优先级的程序必须包含下列两个函数:
    (1)void NVIC_PriorityGroup();//写在主程序中;
    (2)NVIC_Init(); //写在初始化配置中

    默认情况下,如何不设置中断优先级分组,则中断优先级分组默认为0,即0位抢占优先级,4位响应优先级,则无任何抢占优先级,所以无论中断的优先级设多少,都没有抢占中断的功能,所以,如果想要一个中断打断另一个中断,必须设置中断优先级分组为1,2,3,4.
    如设置优先级分组为2:NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

    具体例子如下:
    {
    假设NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1)则

    // 使能EXTI0中断
    NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel; 
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; // 指定抢占式优先级别1
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 指定响应优先级别0 
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 
    NVIC_Init(&NVIC_InitStructure);
    // 使能EXTI9_5中断 
    NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel; 
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 指定抢占式优先级别0 
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 指定响应优先级别1 
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 
    NVIC_Init(&NVIC_InitStructure);
    //TIM3中断
    NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //抢占优先级0级
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //响应优先级3级
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
    NVIC_Init(&NVIC_InitStructure);  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
    TIM_Cmd(TIM3, ENABLE);  //使能TIMx外设
    

    }

    在上例子中,优先抢占优先级,其数字越低,优先级越高。相同下比较响应优先级,其数字越低,优先级越高

    **Tips:**代码中抢占优先级0,1等,响应优先级(子优先级)0,1,3等,都是由自己设置的,但是必须在抢占优先级或者响应优先级设定的范围内。

    展开全文
  • 而响应优先级一位,就是2的一次方。2*8=16,所以就是16。 这个寄存器好像在corem3内核里边,她外边没咋写。所以不用管了,知道咋用就行了 #define NVIC_PriorityGroup_0 ((uint32_t)0x700) /*!< 0 bits for pre-...

    在这里插入图片描述他说的是4位,我一开始理解的是0123四个数。这样一看就理解了。3位就是可以2的三次方,也就是8。而响应优先级一位,就是2的一次方。2*8=16,所以就是16。
    这个寄存器好像在corem3内核里边,她外边没咋写。所以不用管了,知道咋用就行了

    #define NVIC_PriorityGroup_0         ((uint32_t)0x700) /*!< 0 bits for pre-emption priority
                                                                4 bits for subpriority */
    #define NVIC_PriorityGroup_1         ((uint32_t)0x600) /*!< 1 bits for pre-emption priority
                                                                3 bits for subpriority */
    #define NVIC_PriorityGroup_2         ((uint32_t)0x500) /*!< 2 bits for pre-emption priority
                                                                2 bits for subpriority */
    #define NVIC_PriorityGroup_3         ((uint32_t)0x400) /*!< 3 bits for pre-emption priority
                                                                1 bits for subpriority */
    #define NVIC_PriorityGroup_4         ((uint32_t)0x300) /*!< 4 bits for pre-emption priority
                                                                0 bits for subpriority */
    

    这个是他的定义,一眼可以看出,跟上边对应的。011就是3,100就是4

    展开全文
  • 转载于:https://blog.51cto.com/13502993/2053541
  • 多个中断源在它们的抢占式优先级相同的情况下,子优先级不论是否相同,如果某个中断已经在服务当中,则其它中断源都不能打断它;只有抢占式优先级高的中断才可以打断其它抢占式优先级低的中断。 就是说, 组优先级...
  • 确定组号,也就是确定抢占优先级和子优先级的 分配位数。调用函数为 NVIC_PriorityGroupConfig(); 设置所用到的中断的中断优先级别。对每个中断调用函数为 NVIC_Init(); Ref. STM32的抢占优先级和响应优先级
  • 1、抢占优先级比子优先级的优先权更高,这意味抢占优先级更高的中断会先执行,而不管子优先级的优先权,数值越低优先级越高。 2、同理,如果抢占优先级相同,那么就会比较子优先级子优先级更高的中断将会先被执行...
  • 中断和优先级

    千次阅读 2022-03-25 16:14:02
    假设中断A的抢占优先级比中断B的抢占优先级一样,中断A的子优先级比中断B的子优先级高,中断B 先发生,随后A也发生,那么中断A将等待中断B执行完后,才会执行中断A,即子优先级不能中断嵌套。 假设中断A的抢占...
  • 当 A、B 两个中断的抢占优先级相同的情况下,且 A 的子优先级比 B 高,那么当他们同 时发生或者同时解挂的时候会优先执行 A,如果 A 中断发生的时候 B 中断正在执行,那么 A也不会抢占 B,而是要挂起,等待正在执行...
  • //对中断源进行分组,每组有一个抢占优先级和响应优先级。 上面的理解是错误的,事实上,所有中断源都是一个组。 这个操作应该称之为设置中断优先级的控制模式(控制组别)。 清楚地说是:这里不应该用“组”这个...
  • 优先级

    2019-05-23 19:12:17
    抢占式优先级和响应优先级,也把响应优先级称作“亚优先级”或者是“副优先级”,每个中断源都需要被指定这两种优先级! 1.何为抢占式优先级(pre-emption priority): 抢占式优先级的中断事件会打断当前的主程序...
  • 主线程与线程的优先级问题

    千次阅读 2018-05-03 21:04:54
    在一个线程中开启另外一个新线程,则新开线程称为该线程的线程,子线程初始优先级与父线程相同。不过主线程先启动占用了cpu资源,如果存在主线程和子线程争抢cpu执行权的话,看运气,谁抢到就让谁执行。其实设置了...
  • 1 NVIC中断优先级分组 1.1NVIC的中断向量表 Cortex-M3和CM4内核都支持256个中断,其中包含了16个内核中断(异常)和240个外部中断,并且具有256级的可编程中断设置。但是,STM32F1并没有使用CM3内核的全部东西,...
  • cubemax设置中断优先级

    2021-08-18 00:15:57
    1.打开cubemax,例如设置两个GPIO引脚高低电平产生的外部...3.选择NVIC控制器,分配抢占优先级和响应优先级位数,一共有5种分配方式,打钩进行中断使能,最后设置优先级,数字越小表示优先级越高。 ...
  • cortex M内核优先级设置

    千次阅读 2020-05-26 19:27:50
    这个8位的寄存器可以分为抢占优先级和子优先级两个部分(通过设置优先级组设置) 抢占优先级和子优先级有什么用? 举例说明: 有两个中断A、B A的抢占优先级比B的高 当B发生中断,正在执行B的中断服务函数时 A发生了...
  • STM32(Cortex-M3)中有两个优先级的概念——抢占式优先级和响应优先级,有人把响应优先级称作’亚优先级’或’副优先级’,每个中断源都需要被指定这两种优先级。 具有高抢占式优先级的中断可以在具有低抢占式优先级...
  • 这篇文章算是自己这半个月,终于从中断优先级分组的坑里爬出来的一点个人经验的总结吧,其中的各种问题也确实在网上资料偏少,所以抛砖引玉吧。 2 遇到的问题 首先,介绍一下我所遇到的问题。我在开发板上搞1838...
  • 关于STM32中的中断优先级的理解

    千次阅读 2021-10-20 10:14:46
    2.响应优先级(子优先级)。两种优先级的优先顺序是:抢占式>响应式。 1.抢占式:即当中断来临时,可立马中断此时的操作而去执行抢占式优先级的活儿。高抢占式优先级可以中断低抢占式优先级(中断嵌套)。 2.响应...
  • SysTick系统定时器(功能框图和优先级配置) SysTick—系统定时器是属于 CM3 内核中的一个外设,内嵌在 NVIC 中。系统定时器是一个 24bit (2^24)的向下递减的计数器,计数器每计数一次的时间为 1/SYSCLK,一般我们...
  • 主要介绍了Python实现一个优先级队列的方法,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
  • STM32-中断优先级管理NVIC 1.NVIC中断优先级分组 NVIC的全称是Nested vectoredinterrupt controller,即嵌套向量中断控制器。STM32F中文参考手册中搜索向量表可以找到相应的中断说明。 CM4/CM7 内核支持256个中断,...
  • 异常类型F103 在内核...除了个别异常的优先级被定死外,其它异常的优先级都是可编程的。有关具体的系统异常和外部中断可在标准库文件stm32f10x.h 这个头文件查询到,在IRQn_Type 这个结构体里面包含了F103 系列全...
  • STM32 有 84 个中断,包括 16 个内核中断和 68 个可屏蔽中断,具有 16 级可编程的中断优先级。 而我们常用的就是这 68 个可屏蔽中断,但是 STM32 的 68 个可屏蔽中断,在 STM32F103 系列 上面,又只有 60 个(在 ...
  • NVIC 中断优先级管理详解

    万次阅读 多人点赞 2018-08-12 01:14:46
    子优先级 ),很明显多个中断会 先比较 抢占优先级 ,抢占优先级 相同的比较响应优先级 ,这里值得注意的是 高抢占优先级 能够打断 低抢占优先级的,但是相同抢占优先级的高响应优先级 不能打断 低响应优先级。 NVIC ...
  • 主要介绍了C++线程优先级SetThreadPriority的使用实例,较为详细的讲述了C++线程及其优先级的用法,需要的朋友可以参考下
  • stm32 优先级分组

    千次阅读 多人点赞 2019-06-06 11:06:47
    一、中断优先级配置的函数: 1.NVIC_IRQChannelPreemptionPriority 配置抢占优先级 2.NVIC_IRQChannelSubPriority 配置响应优先级 二、抢占优先级与响应优先级的描述: 1、抢占优先级不同,...
  • 之前学习嵌入式的时候不太明白中断优先级分组与抢占优先级和响应优先级的关系,比如分组为2,抢占优先级也为2,响应优先级也为2,就是不明白他们之间有什么关系,谁决定谁,总共有多少个数值可供选择。  趁着现在...
  • 正则表达式从左到右进行计算,并遵循优先级顺序,这与算术表达式非常类似。 相同优先级的从左到右进行运算,不同优先级的运算先高后低。...若要匹配”mood”或”food”,请使用括号创建表达式,从而产生
  • GD32/ST32的中断优先级分组记录

    千次阅读 2021-03-09 09:40:18
    文章目录简介优先级的定义代码详解1. 配置分组2. 使能中断 简介 简单来说NVIC就是个嵌套向量中断控制器,控制着整个...如果抢占优先级相同的话,就比较子优先级,如果抢占优先级和子优先级都相同的话,就比较硬件中

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 311,224
精华内容 124,489
关键字:

子优先级

友情链接: ALI_EDITOR_070726.rar