从您提供的代码片段来看,您在中断服务程序(ISR)中关闭了中断使能,然后在应用线程中重新开启中断使能。这种情况可能导致中断响应不稳定,原因如下:
1. 中断服务程序(ISR)的执行时间可能较长,导致中断响应不及时。在ISR中关闭中断使能后,如果ISR执行时间过长,可能会导致在这段时间内发生的中断事件被忽略。
2. 在应用线程中重新开启中断使能可能存在竞争条件。如果在ISR执行过程中,应用线程尝试重新开启中断使能,可能会导致中断使能标志位被错误地设置。
为了解决这个问题,您可以尝试以下方法:
1. 优化ISR的执行时间。确保ISR尽可能简洁,避免执行耗时的操作。这样可以减少中断响应的延迟。
2. 在ISR中使用标志位来通知应用线程中断事件的发生,而不是直接在ISR中关闭中断使能。例如:
```c
static volatile bool gpio_interrupt_flag = false;
static void IRAM_ATTR gpio_isr_handle(void* arg) {
uint32_t gpio_num = (uint32_t)arg;
gpio_interrupt_flag = true;
xQueueSendFromISR(gpio_pen_queue, &gpio_num, NULL);
}
static void gpio_task_example(void* arg) {
uint32_t io_num;
for (;;) {
if (xQueueReceive(gpio_pen_queue, &io_num, portMAX_DELAY)) {
printf("GPIO interrupt occurred on GPIO number %un", io_num);
}
if (gpio_interrupt_flag) {
// 处理中断事件
gpio_interrupt_flag = false;
GPIO.pin[GPIO_PEN_SDA_IO].int_ena = 1; // 重新开启中断使能
}
}
}
```
3. 确保在应用线程中重新开启中断使能的操作是安全的,避免竞争条件。可以通过使用互斥锁或其他同步机制来确保操作的原子性。
通过以上方法,您应该能够提高中断响应的稳定性。