0 相关资料
ARM® Generic Interrupt Controller Architecture version 2.0.pdf
1 对中断挂起位影响测试对比
在字面上理解,中断失能表示的是不再响应中断,那中断失能期间中断挂起位是否会被设置为挂起呢?此外,中断设置为电平触发和边沿触发会产生什么样的影响呢?为了验证这一想法,本文设计了4段程序,逐一验证:
(1)中断电平触发,验证__disable_irq和__enable_irq
(2)中断电平触发,验证GIC_DisableIRQ和GIC_EnableIRQ
(3)中断边沿触发,验证__disable_irq和__enable_irq
(4)中断边沿触发,验证GIC_DisableIRQ和GIC_EnableIRQ
1.1 中断电平触发,验证__disable_irq和__enable_irq
验证程序如下:
void gic_test(void)
{
GIC_SetConfiguration(UART4_IRQn, 0); // 设置为电平触发
__disable_irq();
HAL_Delay(5000); // 在这段时间内输入字符触发UART4空闲中断
imx_printf("Get uart4 pend : %d\r\n", GIC_GetPendingIRQ(UART4_IRQn)); // 检查UART4挂起位
__enable_irq();
HAL_Delay(1000);
}
测试结果:
(1)电平触发下,使用__disable_irq仅不响应所有中断,在失能所有中断期间如果发生了中断事件,依然会设置中断挂起位,并不会丢失这一中断事件。
1.2 中断电平触发,验证GIC_DisableIRQ和GIC_EnableIRQ
验证程序如下:
void gic_test(void)
{
GIC_SetConfiguration(UART4_IRQn, 0); // 设置为电平触发
GIC_DisableIRQ(UART4_IRQn);
HAL_Delay(5000); // 在这段时间内输入字符触发UART4空闲中断
imx_printf("Get uart4 pend : %d\r\n", GIC_GetPendingIRQ(UART4_IRQn)); // 检查UART4挂起位
GIC_EnableIRQ(UART4_IRQn);
HAL_Delay(1000);
}
测试结果:
(1)电平触发下,使用GIC_DisableIRQ仅不响应指定中断,在失能该中断期间如果发生了中断事件,依然会设置中断挂起位,并不会丢失这一中断事件。
1.3 中断边沿触发,验证__disable_irq和__enable_irq
验证程序如下:
void gic_test(void)
{
GIC_SetConfiguration(UART4_IRQn, 2); // 设置为边沿触发
__disable_irq();
HAL_Delay(5000); // 在这段时间内输入字符触发UART4空闲中断
imx_printf("Get uart4 pend : %d\r\n", GIC_GetPendingIRQ(UART4_IRQn)); // 检查UART4挂起位
__enable_irq();
HAL_Delay(1000);
}
测试结果:
(1)边沿触发下,使用__disable_irq仅不响应所有中断,在失能所有中断期间如果发生了中断事件,依然会设置中断挂起位,并不会丢失这一中断事件。
1.4 中断边沿触发,验证GIC_DisableIRQ和GIC_EnableIRQ
验证程序如下:
void gic_test(void)
{
GIC_SetConfiguration(UART4_IRQn, 2); // 设置为边沿触发
GIC_DisableIRQ(UART4_IRQn);
HAL_Delay(5000); // 在这段时间内输入字符触发UART4空闲中断
imx_printf("Get uart4 pend : %d\r\n", GIC_GetPendingIRQ(UART4_IRQn)); // 检查UART4挂起位
GIC_EnableIRQ(UART4_IRQn);
HAL_Delay(1000);
}
测试结果:
(1)边沿触发下,使用GIC_DisableIRQ仅不响应指定中断,在失能该中断期间如果发生了中断事件,依然会设置中断挂起位,并不会丢失这一中断事件。
2 结论
(1)可以把__disable_irq、__enable_irq看做响应所有中断的总开关,而GIC_DisableIRQ、GIC_EnableIRQ是响应特定中断的子开关。
(2)在__disable_irq或GIC_DisableIRQ期间发生的中断不会丢失,对应的中断挂起位会被置位。
以上(1)(2)结论可以用如下示意图表示: