初级会员

- 积分
- 96
- 金钱
- 96
- 注册时间
- 2014-2-21
- 在线时间
- 12 小时
|
1金钱
今天学习外部中断的时候,写了一段程序,想验证一下高抢占优先级如何打断低抢占优先级。代码如下
void MY_EXTI_Init(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, 2);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, 3);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, 4);
EXTI_InitStructure.EXTI_Line=EXTI_Line2;
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd=ENABLE;
EXTI_Init(&EXTI_InitStructure);
EXTI_InitStructure.EXTI_Line=EXTI_Line3;
EXTI_Init(&EXTI_InitStructure);
EXTI_InitStructure.EXTI_Line=EXTI_Line4;
EXTI_Init(&EXTI_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel=EXTI2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel=EXTI3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel=EXTI4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
NVIC_Init(&NVIC_InitStructure);
}
void EXTI2_IRQHandler(void)
{
LED0=!LED0;
delay_ms(50000);
LED0=!LED0;
EXTI_ClearITPendingBit(EXTI_Line2);
delay_ms(20);
}
void EXTI3_IRQHandler(void)
{
LED1=!LED1;
delay_ms(50000);
LED1=!LED1;
EXTI_ClearITPendingBit(EXTI_Line3);
delay_ms(20);
}
void EXTI4_IRQHandler(void)
{
LED0=!LED0;
LED1=!LED1;
delay_ms(50000);
LED0=!LED0;
LED1=!LED1;
EXTI_ClearITPendingBit(EXTI_Line4);
delay_ms(20);
}
中断线2的抢占优先级是2,响应优先级是2(key2)
中断线3的抢占优先级是1,响应优先级是2(key1)
中断线4的抢占优先级是1,响应优先级是1(key0)
那么4和3应该都能打断2
而实际现象是,按下key2后,LED0点亮,立即按下key1,LED1并没有立即点亮,而是LED0熄灭后再点亮。哪位大哥能给解释一下啊
|
|