STM32(Cortex-M3)中的优先级理解
(2011-03-06 19:55:41)
转载
标签:
it
分类:STM32
很多人在配置 STM32 中断时对固件库中的这个函数 NVIC_PriorityGroupCong()——配置优先级分组方式,会很不理解,尤其是
看中文翻译版的,因为中文翻译版里把这里翻译成“先占优先级和从优先级”这样翻译其实是不对的,很容易让人误解。为了便于大家理
解,有必要先解释两个概念:
抢占式优先级/响应优先级:
STM32(Cortex-M3)中有两个优先级的概念——抢占式优先级和响应优先级,有人把响应优先级称作'亚优先级'或'副优先级',每个
中断源都需要被指定这两种优先级。
具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以嵌
套在低抢占式优先级的中断中。
当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到
来的中断就要等到前一个中断处理完之后才能被处理。如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先
处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。
看了上面的介绍后,相信大家都明白了这里面的关系了,总结下便是:抢占式优先级>响应优先级>中断表中的排位顺序(其
中“>”理解为比较的方向)。
正是因为每个中断源都需要被指定这两种优先级,就需要有相应的寄存器位记录每个中断的优先级;在 Cortex-M3 中定义了 8 个比
特位用于设置中断源的优先级,这 8 个比特位可以有 8 种分配方式,如下:
1.所有 8 位用于指定响应优先级
2.最高 1 位用于指定抢占式优先级,最低 7 位用于指定响应优先级
3.最高 2 位用于指定抢占式优先级,最低 6 位用于指定响应优先级
4.最高 3 位用于指定抢占式优先级,最低 5 位用于指定响应优先级
5.最高 4 位用于指定抢占式优先级,最低 4 位用于指定响应优先级
6.最高 5 位用于指定抢占式优先级,最低 3 位用于指定响应优先级
7.最高 6 位用于指定抢占式优先级,最低 2 位用于指定响应优先级
8.最高 7 位用于指定抢占式优先级,最低 1 位用于指定响应优先级
以上便是优先级分组的概念,但是 Cortex-M3 允许具有较少中断源时使用较少的寄存器位指定中断源的优先级,因此 STM32 把指
定中断优先级的寄存器位减少到 4 位,这 4 个寄存器位的分组方式如下:
第 0 组:所有 4 位用于指定响应优先级
第 1 组:最高 1 位用于指定抢占式优先级,最低 3 位用于指定响应优先级
第 2 组:最高 2 位用于指定抢占式优先级,最低 2 位用于指定响应优先级
第 3 组:最高 3 位用于指定抢占式优先级,最低 1 位用于指定响应优先级
第 4 组:所有 4 位用于指定抢占式优先级
这里便对于于文章最前提到的固件库里相关的函数了——NVIC_PriorityGroupCong(u32NVIC_PriorityGroup),函数的参数共有
5 种:
这个函数的参数(NVIC_PriorityGroup 值)有下列 5 种:
NVIC_PriorityGroup_0 =>选择第 0 组
评论0