原创 STM32的优先级寄存器。

2008-7-17 16:02 7170 4 7 分类: MCU/ 嵌入式

CortexM3的内核使用一个8bit的寄存器来进行优先级分组。


组里面又分为连续的高低两个位组部分:抢占优先级位组(preempt priority level 从MSB开始),子优先级位组(subpriority level)。由于子优先级位组至少要有占有一个位,则抢占抢占优先级位组最多就只能占据Bit7~Bit1,即最多128个抢占优先级。


这里我们要区别抢占优先级和子优先级:顾名思义抢占优先级是用来配置中断的优先级的,但是与子优先级不同的是,对抢占优先级哪个中断的抢占优先级高,哪个中断就有资格抢占正在执行的抢占优先级低的中断的执行权(占据CPU)。子优先级则只能用来决定当两个具有相同抢占优先级中断同时发生时谁先执行,而不能导致抢占的发生。


如果我们设置所有中断的抢占优先级都一样,那么就没有抢占一说了,所有的中断都按时间顺序来执行(排除同时发生的中断执行顺序由子优先级决定)。


STM32里面只用了4位来做优先级分组。最多有16个抢占优先级。(从stm32的函数库函数NVIC_PriorityGoupConfig function的参数推知)


但按照权威说法必须有一位子优先级,那么就只有8个抢占优先级了。


有点矛盾了,高人指点一下。


 


 


 

PARTNER CONTENT

文章评论3条评论)

登录后参与讨论

用户1284802 2008-7-18 12:58

刚才又仔细看了一下那书,发现宋岩如此译法也没有错。关键是我理解错误了。 cotexM3的优先级分组group0...group7是对整个8bit的优先级分组寄存器而言的,因此无论是只使用了其中几位来做优先级分组,还是全部使用,这个分组都是一致的。是必须有一个作为子优先级的位,只是如果用做优先级分组的位不足8位(如STM32只用高4位),这些子优先级位要在未分配位中占据位置。如宋岩译本112页,图7.6所示。

用户1284802 2008-7-18 12:43

按照The Defi nitive Guide to the ARM Cortex-M3宋岩译的中文电子档第111页第四行“这种优先级分组规定:亚优先级至少是1 个位。因此抢占优先级最多是7 个位,造成了 最多只有128 级抢占的现象。”。 后来我仔细对照了下英文“If a Cortex-M3 device has implemented all 8 bits in the priority-level confi guration registers, the maximum number of preemption levels it can have is only 128, using a priority group setting of 0. The priority fi elds defi nition is shown in Figure 7.8.”貌似这种译法有点问题。没有说子优先级一定要有一位,只是说了子优先级占用了一位。SMT32使用cortexM3核的时候只用了4bit作为优先级分组位组,可能在4bit全作为抢占优先级位组时,后面没有分配的4bit会分配一位给子优先级吧(只是占位,没有作用)

用户1090342 2008-7-18 11:14

哈哈,先顶一下,再问一个问题:你所说的“按照权威说法必须有一位子优先级”,请问这个权威说法的出处是哪里?
相关推荐阅读
用户1284802 2008-07-17 01:03
STM32 System Tick.
时钟始终是数字系统的心脏,而操作系统的心脏system tick(也称系统滴答)则是由承载它的硬件(CPU)提供。通常system tick“跳动”比系统硬件的时钟“跳动”要慢得多,硬件时钟可以是几M...
我要评论
3
4
关闭 站长推荐上一条 /3 下一条