测量时 ESP-IDF 任务中断

Posted

技术标签:

【中文标题】测量时 ESP-IDF 任务中断【英文标题】:ESP-IDF task interruption on measurement 【发布时间】:2021-12-26 14:17:48 【问题描述】:

我的 ESP32 控制器有问题。我的系统正在使用多个任务。我用 HC-SR04 进行了测量。我想我在测量过程中有时会被打断。

我找不到描述任务间中断的文档。

这是我系统的示例代码:

// code of measurement
int ultrasonic_measure()


    int64_t time_start = 0;
    int64_t time_end = 0;
    int64_t time_measured = 0;
    int64_t process_start_time = 0; 

    gpio_set_direction(TRIGGER_PIN, GPIO_MODE_OUTPUT);
    gpio_set_level(TRIGGER_PIN, 0);
    delay_ms(1);
    gpio_set_level(TRIGGER_PIN, 1);
    ets_delay_us(10);
    gpio_set_level(TRIGGER_PIN, 0);

    gpio_set_direction(TRIGGER_PIN, GPIO_MODE_INPUT);

    process_start_time = esp_timer_get_time();
    while (!gpio_get_level(TRIGGER_PIN))
    
        if (timeout_expired(process_start_time, 120000))
        
            ESP_LOGE(TAG, "Timeout L");
            return -1;
        
    
    time_start = esp_timer_get_time();
    time_end = time_start;

    process_start_time = esp_timer_get_time();
    while (gpio_get_level(TRIGGER_PIN))
    
        if (timeout_expired(process_start_time, 12000))
        
            ESP_LOGE(TAG, "Timeout H");
            return -1;
        
    
    time_end = esp_timer_get_time();
    time_measured = time_end - time_start;
    int16_t distance = (time_measured / ROUNDTRIP) - CORRECTION;

    // elimination of overlimits
    distance = (distance < 70) ? 70 : distance;
    distance = (distance > 350) ? 350 : distance;
    ESP_LOGI(TAG, "Final distance after correction: %dmm", distance);
    return distance;

void start_background_tasks()

    int priority = 10;
    // THIS IS TASK WITH MEASUREMENT
    xTaskCreate(&external_sensor_tasks, "external_sensor_tasks", 2560, NULL, 2 | priority, NULL);

    xTaskCreate(&update_key_task, "update_key_task", 2560, NULL, 2 | priority, NULL);
    xTaskCreate(&print_heap_task, "print_heap_task", 2560, NULL, 2 | priority, NULL);
    xTaskCreate(&output_update_task, "output_update_task", 2560, NULL, 2 | priority, NULL);
    xTaskCreate(&send_report_task, "send_report_task", 4096, NULL, 2 | priority, NULL);

    xTaskCreate(&websocket_task, "websocket_task", 4096, NULL, 2 | priority, NULL);
    xTaskCreate(&get_host_to_connect_task, "get_host_to_connect_task", 4096, NULL, 2 | priority, NULL);

我没有显示我的 external_sensor_tasks() 代码,因为它有其他依赖逻辑(如保存结果等)。

我是 ESP-IDF 编程的初学者。当我在 Arduino UNO 上尝试测量时,它可以工作(我有一个核心并且没有中断)。当我的测量返回 70 毫米距离时,我遇到了这种情况。

【问题讨论】:

【参考方案1】:

你不能这样做(通过投票)。您需要使用 GPIO 中断。在中断处理程序中,您需要读取计时器计数器的值,然后将其发布(使用队列或直接任务通知)到您的测量任务。

实际上,当您在 RTOS 中编程时,您需要忘记轮询。您需要使用 IPC 机制。多任务环境中的编程与朴素的 Arduino 风格编码有很大不同。

【讨论】:

你能给我发送更多关于解决方案的信息吗?例如。文档,网络上的文章。我不明白你写的所有东西。不好的是ultrasonic_measure()start_background_tasks() @M.Liver 您的评论表明您对 IPC 和多任务处理一无所知。从写PC软件开始,学习队列、信号量、互斥锁等。SO答案中的多任务编程课程我不会。

以上是关于测量时 ESP-IDF 任务中断的主要内容,如果未能解决你的问题,请参考以下文章

ESP32看门狗

ESP-IDF版本2.1.1

Vscode esp-idf配置文件

ESP-IDF环境构建

[ESP] ESP-IDF WiFi配网(SoftAP+HTTPD)代码备注

[ESP] ESP-IDF CLion构建