我有一份工作应该以 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;
}
}