这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 有奖活动 » 【我踩过的那些坑】ESP32GPIO中断配置引发的延时问题

共2条 1/1 1 跳转至

【我踩过的那些坑】ESP32GPIO中断配置引发的延时问题

高工
2025-10-22 04:47:08     打赏

       前段时间在用ESP32开发一个简单的物联网门铃项目时,踩了一个超级郁闷的坑:GPIO中断配置后,系统响应居然延迟了上百毫秒!原本以为是硬件问题,折腾了整整两天,最后才发现是软件配置的锅,将来龙去脉和解决方案分享给大家,希望能帮到同样在用ESP32的兄弟们避坑。

       用ESP32的GPIO2作为门铃按键输入,配置为中断触发(下降沿),一旦按下就通过WiFi发送通知到手机APP。开发环境是ESP-IDF v5.0,代码用C语言写。一开始,一切正常:我用gpio_install_isr_service(0)注册中断服务,然后gpio_isr_handler_add(GPIO_NUM_2, button_isr_handler, NULL)添加处理函数。测试时,按下按钮,中断能触发,LED灯能点亮,看起来没毛病。

但接入WiFi模块后,问题来了!按按钮的响应时间从原来的<10ms飙升到100-200ms,甚至偶尔卡顿到500ms。APP收到通知时,人早就走远了。调试过程如下:

       先怀疑硬件:换了几个GPIO引脚(试了GPIO0、GPIO4),问题依旧;测了波形,信号干净无噪。

       然后查WiFi:禁用WiFi模块,中断恢复正常。恩,指向网络栈干扰。

       用示波器抓中断,确认中断本身没丢,但ISR handler执行时间变长了。从日志看,handler里加了个简单延时测试,都卡了。

       最后,用FreeRTOS任务分析工具esp-idf的monitor,发现:中断优先级默认是高,但WiFi任务(默认优先级20)在抢占CPU,导致ISR被延迟调度。花了我两天时间,差点延误项目 deadline。最“开心”的是,官网文档里明明有提“WiFi and interrupts interaction”,但我当时只扫了一眼,没深挖。



高工
2025-10-22 14:41:09     打赏
2楼

有朋友感兴趣,写一下详细处理过程。

主要步骤:

1、调整中断优先级:用gpio_config_t结构体设置中断类型,并确保ISR服务优先级高于WiFi任务。

gpio_config_t io_conf = {
    .pin_bit_mask = (1ULL << GPIO_NUM_2),
    .mode = GPIO_MODE_INPUT,
    .pull_up_en = GPIO_PULLUP_ENABLE,
    .pull_down_en = GPIO_PULLDOWN_DISABLE,
    .intr_type = GPIO_INTR_NEGEDGE  // 下降沿触发
};
gpio_config(&io_conf);

// 关键:安装ISR服务时指定高优先级(高于WiFi的20)
gpio_install_isr_service(ESP_INTR_FLAG_LEVEL3);  // Level3优先级约21-23
gpio_isr_handler_add(GPIO_NUM_2, button_isr_handler, NULL);

这里ESP_INTR_FLAG_LEVEL3确保中断在更高层级执行,避开WiFi的抢占。

        2、在ISR中最小化处理:ISR handler只做标志位设置,别加复杂逻辑(如直接发WiFi)。用FreeRTOS队列或信号量通知低优先级任务处理。

static volatile bool button_pressed = false;
void IRAM_ATTR button_isr_handler(void* arg) {
    button_pressed = true;  // 只设标志,快速退出
}

// 在主任务中轮询或用队列
void app_main() {
    while(1) {
        if (button_pressed) {
            button_pressed = false;
            // 发送WiFi通知
            send_notification();
        }
        vTaskDelay(pdMS_TO_TICKS(10));
    }
}

       

3、禁用WiFi电源管理:在WiFi init后加esp_wifi_set_ps(WIFI_PS_NONE);,关闭省电模式,进一步减少延迟。

修改测试后,响应时间稳定<20ms,如果以后遇到类似问题,建议先用idftask命令监控任务优先级。




共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]