ESP-IDF 如何检查任务是否已在运行?

问题描述

我有一个作业应该以 5 秒的最小间隔运行。启动此作业的触发器可以在任何时刻以任何频率执行。

在 RTOS 环境中解决这种情况的最佳方法是什么?

如果任务不存在,我想创建一个创建任务的函数。现有任务在做任何事情之前应该等待最小间隔过去。当它在等待时,应该创建它的函数应该跳过新任务的创建。

检查任务是否已创建但尚未完成的正确方法是什么? 在这种情况下,我应该使用任务吗?

下面的代码示例:

#define CONFIG_MIN_INTERVAL 5000

uint32_t last_execution_timestamp = 0;
TaskHandle_t *task_handle = NULL;
bool task_done = true;

static void report_task(void *context)
{
    if (esp_timer_get_time() / 1000 < last_execution_timestamp + CONFIG_MIN_INTERVAL)
    {
        ESP_LOGI(stateTAG,"need to wait for  for right time");
        int time_to_wait = last_execution_timestamp + CONFIG_MIN_INTERVAL - esp_timer_get_time() / 1000;
        vTaskDelay(time_to_wait / portTICK_PERIOD_MS);
    }

    // do something...

    task_done = true;
    vTaskDelete(task_handle);
}

void init_report_task(uint32_t context)
{    
    if (!task_done)
    {
        ESP_LOGI(stateTAG,"TASK already exists");
    }
    else
    {
        ESP_LOGI(stateTAG,"Creating task");
        xTaskCreate(&report_task,"report_task",8192,(void *)context,4,task_handle);
        task_done = false;
    }
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)