Cortex-A7:__disable_irq和GIC_DisableIRQ、__enable_irq和GIC_EnableIRQ的区别(3)——对中断挂起位影响测试对比

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)结论可以用如下示意图表示:
在这里插入图片描述

__set_PRIMASK和__disable_irq是CMSIS提供的用来操作中断的接口。__set_PRIMASK用于设置PRIMASK寄存器的值,可以用来开启或关闭中断。__disable_irq是调用了__set_PRIMASK来关闭所有中断。通过调用__disable_irq,CPU将不再响应中断请求,但并不会屏蔽中断的触发。如果在关闭总中断后有中断触发,中断标志将被置。当调用__enable_irq来开启总中断后,之前触发的中断将会立即被处理。要想禁止所有中断,可以对每个模块的中断进行Disable操作,或者通过清除中断标志或清除寄存器状态的方法来达到目的。这样在__enable_irq开启总中断后,MCU就不会响应之前触发的中断了。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [STM32中断相关概念阐述](https://blog.csdn.net/qq153471503/article/details/126177103)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [STM32关于开关总中断的问题](https://blog.csdn.net/weixin_42224980/article/details/105654722)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NW嵌入式开发

感谢您的支持,让我们一起进步!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值