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

6206

问答对人有帮助,内容完整,我也想知道答案

0

对于中断,先执行中断服务函数还是先清理中断标志?开始学习固件库的时候,差不多是先进入服务函数在清理中断标志。最近在用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); }}

0

2024-5-22 07:20:15

评论

淘帖0

邀请回答

您可以邀请以下用户,快速回答问题

×

heks

该类别下有 54 个回答。

邀请回答

hgimtk

该类别下有 45 个回答。

邀请回答

新星之火12138

该类别下有 43 个回答。

邀请回答

chm5

该类别下有 42 个回答。

邀请回答

wang21cj

该类别下有 41 个回答。

邀请回答

hjfjsdgfjdsf

该类别下有 38 个回答。

邀请回答

werywer

该类别下有 35 个回答。

邀请回答

uvysdfydad

该类别下有 35 个回答。

邀请回答

h1654155957.9520

该类别下有 35 个回答。

邀请回答

fdjslkjd

该类别下有 35 个回答。

邀请回答

凤毛麟角

该类别下有 34 个回答。

邀请回答

维生素B2

该类别下有 34 个回答。

邀请回答

dfzvzs

该类别下有 34 个回答。

邀请回答

江左盟

该类别下有 34 个回答。

邀请回答

jenny042

该类别下有 34 个回答。

邀请回答

wenminglang

该类别下有 33 个回答。

邀请回答

lining870815844

该类别下有 33 个回答。

邀请回答

储蓄叛逆

该类别下有 33 个回答。

邀请回答

ggfvxv

该类别下有 33 个回答。

邀请回答

LY0206

该类别下有 33 个回答。

邀请回答

举报

1123127317

相关推荐

• PM组件中断唤醒后进入中断函数其打印函数不起作用咋办?

5990

• AVR单片机--中断代码执行与中断响应

5836

• LOGD和rt_kprintf函数这两个打印函数在按键中断函数中无法输出到shell是怎么回事

1742

• avr能用查询中断标志位的方法产生中断吗?

5162

• STM32使能定时器更新中断和捕获中断同时发生那么CPU会先因为哪个中断源进入中断呢?

8655

• 定时器中断实验里的中断服务是怎么被执行的?

2814

• 请问MSP430低功耗模式时能执行中断的语句吗?

6430

• 请问是DMA将500个完全缓存到内存中后然后中断完成标志位置1再进入中断服务函数打印出500个数据吗?

3635

• 【求助】6678无法跳出中断服务程序问题

2108

• 程序在中断标志被清除后进入中断服务例程是什么原因?

1709

提交评论

2个回答

答案对人有帮助,有参考价值

0

一般来讲,这个没有特定顺序要求。

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

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

2024-5-22 16:48:59

评论

举报

李亚祎

提交评论

答案对人有帮助,有参考价值

0

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

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)`:执行中断服务函数,处理中断事件。

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

2024-5-22 17:38:52

评论

举报

俞舟群

提交评论

只有小组成员才能发言,加入小组>>