STM32
直播中

1123127317

8年用户 1048经验值
擅长:制造/封装 接口/总线/驱动
私信 关注
[问答]

对于中断,先执行中断服务函数还是先清理中断标志?

对于中断,先执行中断服务函数还是先清理中断标志?开始学习固件库的时候,差不多是先进入服务函数在清理中断标志。最近在用CubeMX,是先清理中断标志再进入回调函数。想请教一个哪一个好
void HAL_GPIO_EXti_IRQHandler(uint16_t GPIO_Pin){  /* EXTI line interrupt detected */  if (__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != 0x00u)  {    __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);    HAL_GPIO_EXTI_Callback(GPIO_Pin);  }}


回帖(2)

李亚祎

2024-5-22 16:48:59
一般来讲,这个没有特定顺序要求。


唯一要注意的是,最好不要将中断请求标志放在中断程序退出前的最后一句,


避免同一中断事件再来一次。
举报

俞舟群

2024-5-22 17:38:52
在中断处理中,先执行中断服务函数还是先清理中断标志取决于具体的应用场景和硬件设计。然而,在大多数情况下,推荐的做法是先清理中断标志,然后再执行中断服务函数。这样做的原因有以下几点:

1. **防止重复触发**:在某些情况下,如果中断标志没有及时清除,可能会导致中断服务函数重复执行,从而引发不必要的处理。

2. **确保中断状态正确**:在执行中断服务函数之前清理中断标志,可以确保在处理中断时,中断标志的状态是正确的,避免因为中断标志的状态错误而导致的处理逻辑错误。

3. **提高中断响应速度**:在某些高性能应用中,快速地清除中断标志可以减少中断处理的延迟,从而提高系统的响应速度。

在你提供的CubeMX示例中,代码首先检查中断标志,然后清除中断标志,最后执行回调函数。这是一个典型的中断处理流程,可以确保中断处理的正确性和效率。

```c
void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin){
    /* EXTI line interrupt detected */
    if (__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != 0x00u){
        __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);
        HAL_GPIO_EXTI_Callback(GPIO_Pin);
    }
}
```

在这个示例中,`__HAL_GPIO_EXTI_GET_IT(GPIO_Pin)` 用于检查指定的GPIO引脚是否触发了中断。如果触发了中断(返回值不为0),则执行以下步骤:

1. `__HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin)`:清除中断标志,确保中断服务函数不会被重复执行。
2. `HAL_GPIO_EXTI_Callback(GPIO_Pin)`:执行中断服务函数,处理中断事件。

总之,先清理中断标志再执行中断服务函数是一种更安全、更可靠的中断处理方式。然而,在某些特定场景下,如果确定中断标志会在中断服务函数中被正确处理,也可以先执行中断服务函数再清理中断标志。但在大多数情况下,推荐按照先清理中断标志再执行中断服务函数的顺序进行处理。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分