学前班
最后登录1970-1-1
在线时间 小时
注册时间2019-1-30
|
最近在学习中断,“如果抢占优先级相同,响应优先级低的中断服务函数正在进行时,得到一个响应优先级高的中断请求,那么低的不会被高的打断”,想请问一下这句话对不对,这是在网上看到的,可是我写了个程序测试了一下,结果是低的仍然会被高的打断,非常不解,我不知道是网上写错了,还是自己的程序有误。 按下按键1,LED1亮灭状态翻转,并且串口顺序输出1,2,3;
按下按键2,LED2亮灭状态翻转,并且串口顺序输出4,5,6;
按下按键3,LED1和LED2亮灭状态同时翻转,并且串口顺序输出7,8,9;
- 我是这么设定的,抢占优先级:按键1>按键2=按键3 | 响应优先级:按键2>按键3 。
- 那么按说应该是:按键1中断请求可以打断按键2和按键3的中断服务函数,而按键2与按键3的抢占优先级相同,不会有打断情况。
- 可是实验结果是:按键1打断另外两个按键的中断服务函数这没问题;可我按下按键2,会打断按键3的中断服务函数。想问一下就应该如此还是说网上写的有问题。
麻烦请给看看程序有什么问题么,这个是配置NVIC和按键1的中断服务函数(按键1、2、3中断服务函数几乎相同),整个程序太长了我就没都粘贴过来,如有需要附件里是整个程序,请各位看看,谢谢了:
static void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
/* 配置为组2 */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
/* 配置中断源:按键1*/
NVIC_InitStructure.NVIC_IRQChannel = KEY1_INT_EXTI_IRQ;
/*抢占优先级 */
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
/* 子优先级 */
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
/*使能 */
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
/* 配置中断源:按键2*/
NVIC_InitStructure.NVIC_IRQChannel = KEY2_INT_EXTI_IRQ;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_Init(&NVIC_InitStructure);
void KEY1_IRQHandler(void)
{
char i;
if(EXTI_GetITStatus(KEY1_INT_EXTI_LINE) != RESET)
{
SysTick_Delay_Ms(50);
if(EXTI_GetITStatus(KEY1_INT_EXTI_LINE) != RESET)
{
for(i=1;i<=3;i++)
{
LED1_TOGGLE;/*灯状态翻转*/
Usart_SendString( DEBUG_USARTx, &i);/*串口输出数字*/
SysTick_Delay_Ms(2500);
}
EXTI_ClearITPendingBit(KEY1_INT_EXTI_LINE);
}
}
}
RVMDK(uv5).rar
(18.3 KB, 下载次数: 8)
|
|