硬件内部优先级
【3】、实验3:(硬件内部优先级)
修改中断分组,观察例子中抢占式、响应式优先级触发的现象,并详细描述原因。
将NVIC_PriorityGroupConfig( ); 设置为NVIC_PriorityGroup_0后从Key1-key4正按LED1-LED4按顺序正常亮起,从key4-key1反按LED4先亮,随后LED1亮LED2、LED3亮起
当前分组设置为NVIC_PriorityGroup_0后抢占优先级没有区分在内部优先级分组占0个bits,响应优先级分为15个等级0-15,在内部优先级分组占4个bits,由于没有抢占优先级中断 EXTI_Line0、 EXTI_Line2、EXTI_Line3、EXTI_Line4不能相互抢断,又因为响应优先级都设为0,所以从key4-key1反按除了正在运行的EXTI_Line4,其中的响应优先级要按照中断的硬件优先级来确定,从EXTI_Line0、 EXTI_Line2、EXTI_Line3依次响应。
将NVIC_PriorityGroupConfig( ); 设置为NVIC_PriorityGroup_1。从key4-key1反按LED3先亮,然后是LED1,LED4,最后是LED2。当前有2个抢占优先级在内部优先级分组占1个bits,响应优先级分为7个等级,在内部优先级分组占3个bits,从key4-key1反按由于EXTI_Line3、EXTI_Line4设置为2,3由于现在抢占优先级在内部优先级分组占1个bits取低位1 0;11,EXTI_Line3、EXTI_Line4的抢占优先级为0、1,从EXTI_Line3好 EXTI_Line1的抢占优先级为0又先触发EXTI_Line3所以是LED3先亮、后LED1亮,由于EXTI_Line2、EXTI_Line4抢占优先级相同又因EXTI_Line4先触发后被EXTI_Line3、EXTI_Line1抢占所以即使和EXTI_Line2抢占优先级与响应优先级相同也不会按照硬件优先级执行而是执行完被打断的程序后继续执行、EXTI_Line4所以是LED4亮之后LED2最后亮,如果按照先点击key3在点击key4、key2.这时由于EXTI_Line4、EXTI_Line2抢占优先级与响应优先级相同会按照硬件优先级执行,在LED3亮起后LED2先亮之后才轮到LED4.
将将NVIC_PriorityGroupConfig( ); 设置为NVIC_PriorityGroup_3当前EXTIX_IRQN抢占和响应设置EXTI0_IRQN 0、0; EXTI2_IRQN 0、1; EXTI3_IRQN 1、2; EXTI4_IRQN 1、3;为后从key4-key1反按LED2先亮,随后LED1亮LED4、LED3亮起,可以看出抢占优先级高EXTI0_IRQN、 EXTI2_IRQN先执行。即使响应优先级在内部优先级分组占1个bits,但设置EXTI3_IRQN 、 EXTI4_IRQN的响应优先级为2,3依旧按照其低位10,11来分配优先级,但是由于、 EXTI4_IRQN是被EXTI0_IRQN、 EXTI2_IRQN抢占后返回执行所以是LED4先亮 ,最后是LED3亮。如果先点击key2,在点key4、key3,LED3就会在LED4之前亮起。
将将NVIC_PriorityGroupConfig( ); 设置为NVIC_PriorityGroup_4当前EXTIX_IRQN抢占和响应设与置NVIC_PriorityGroupConfig( )为NVIC_PriorityGroup_3一致会发现 从key4-key1反按LED2先亮,随后LED1亮,LED4、LED3亮起。执行顺序的 EXTI4_IRQN被EXTI0_IRQN、 EXTI2_IRQN抢占,由于EXTI2_IRQN先抢占已经在执行了所以即使EXTI0_IRQN的响应优先级比EXTI2_IRQN的高也是先执行EXTI2_IRQN中断才是EXTI0_IRQN,之后返回EXTI4_IRQN执行,之后执行EXTI3_IRQN。
如果将EXTIx_IRQN设置为 EXTI0_IRQN 0、0; EXTI2_IRQN 0、1; EXTI3_IRQN 0、2; EXTI4_IRQN 0、3;为后从key4-key1反按LED4先亮,随后LED1亮LED2、LED3亮起,可以看出抢占优先级高EXTI0_IRQN、 EXTI2_IRQN先执行。即使响应优先级在内部优先级分组占1个bits,但设置EXTI3_IRQN 、 EXTI4_IRQN抢占优先级相同,没有响应优先级时按照硬件优先级执行。