打印
[应用相关]

老生常谈之中断向量分组的问题(估计没几个人认真了解过)

[复制链接]
1221|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
pigeon0411|  楼主 | 2014-10-24 10:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式


        关于NVIC 中断向量优先级分组的理解和使用。 我最初的理解和代码配置跟 这个思路是一致的: http://www.cnblogs.com/dyllove98/archive/2013/08/01/3230973.html

前提条件1:组别优先顺序(第0组优先级最强,第4组优先级最弱):NVIC_PriorityGroup_0>NVIC_PriorityGroup_1>NVIC_PriorityGroup_2>NVIC_PriorityGroup_3>NVIC_PriorityGroup_4
前提条件2:“组”优先级别>“抢”占优先级别>“副”优先级别
前提条件3:同一组优先级别中,不同的抢占级别之间,其中一抢占级别正在做事,另外抢占级别不能打断他;(即”同一组优先级下的中断源间,没有中断嵌套“)
前提条件4:不同组优先级别间,依据优先级强弱,优先级别高的组的中断源可以打断优先级别低的组的正在做的事情;(即:不同组优先级间,可以中断嵌套)

下面:我们给一段优先级配置的代码进行详尽分析,方便上面的理解:

关以"前提条件一"的实例:

前提条件1:组别优先顺序(第0组优先级最强,第4组优先级最弱):NVIC_PriorityGroup_0>NVIC_PriorityGroup_1>NVIC_PriorityGroup_2>NVIC_PriorityGroup_3>NVIC_PriorityGroup_4


/*
***************************************************************************************************
**
**                                         NVIC_Config()
**
**
**        功能描述:中断向量配置。
**
**        参  数  :无
**
**        返回值  :无
**
***************************************************************************************************
*/
void NVIC_Config(void)
{
        NVIC_InitTypeDef NVIC_InitStructure;
       
        /* Configure one bit for preemption priority -------------------------------- */
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
       

        /* EXTI0 -------------------------------------------------------------------- */
        NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 9; // 指定抢占式优先级别4,可取0-15
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
        

        /* Configure one bit for preemption priority -------------------------------- */
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);
        /* SPI1-------------------------------------------------------------------- */
        NVIC_InitStructure.NVIC_IRQChannel = SPI1_IRQChannel;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);

       
}
解析:1.按照NVIC_PriorityGroup_4这么分,就分为了16个抢占(优先)级,每个抢占(优先)级下只有1个副优先级:0;

              按照NVIC_PriorityGroup_3这么分,就分为了8个抢占(优先)级,每个抢占(优先)级下只有2个副优先级:0-1;



2.(优先级强弱:)    EXTI0_IRQChannel  是0级组>  SPI的3级组高优先级组的人,可以打断低阶级的正在做事的人(嵌套),所以当SPI正在工作时,  EXTI0可以打断他进入 EXTI0中断;


类似这样的配置使用,我的STM32中用到了8个中断,我用这样的配置思路跑的代码目前也没有发现任何问题。

但是今天再翻看库手册 STM32_firmware_library_EN.pdf 以及这篇**http://yervant.blog.163.com/blog/static/199795124201262925930390/
发现我之前理解错了。

真正的优先级分组是只能分一次的,而能多次配置的是优先等级。
我就奇怪了,我那代码竟然没出问题。
请大家谈谈看法。
沙发
saviourxx| | 2014-10-24 11:39 | 只看该作者
我刚搞stm32的时候就已经知道了,
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);只能设置一次
每个组对应不同的抢占优先级和子优先级。
稍微看过参考手册就能看到。

使用特权

评论回复
板凳
diweo| | 2014-10-24 11:42 | 只看该作者
原则上,NVIC_PriorityGroupConfig()只在程序初始化的时候调用一次就好了。

不过,我原来也在程序的多个地方调用 NVIC_PriorityGroupConfig().也没有出现明显的问题。
可能是虽然中断系统混乱了,但是我用到的中断比较少,不超过10个的样子,所以不至于出现大问题。

使用特权

评论回复
地板
mmuuss586| | 2014-10-24 12:25 | 只看该作者
diweo 发表于 2014-10-24 11:42
原则上,NVIC_PriorityGroupConfig()只在程序初始化的时候调用一次就好了。

不过,我原来也在程序的多个地 ...

都快10个中断的话,也不少了;

使用特权

评论回复
5
airwill| | 2014-10-24 13:44 | 只看该作者
多次调用, 那么系统肯定以最后一次为准。中断的优先系统并不影响中断的执行,另外也不会在中断中调用 NVIC_PriorityGroupConfig(),所以在更改中断系统时,是没有中断在执行的,不会导致中断系统可能的混乱(即使在中断中更改抢占级别,应该也不会导致混乱)。
差别只是会不会发生预期的中断嵌套,如果没有特别敏感的时序控制,系统不会引发问题的 (当然如果有时序控制,那就是不易捕捉的隐患了)。所以还是要规范,认真地对待中断优先级问题。

使用特权

评论回复
6
拿起书本| | 2014-10-30 20:55 | 只看该作者
中断优先级是中断控制器的机制,所以它并不会影响到中断的执行的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:drrgsdfgdsfgsdrg

42

主题

157

帖子

3

粉丝