1. Timer回调运行在公共Timer Service Task中。
  2. Timer回调应快速返回。
  3. 回调适合发送通知、Queue消息或设置事件位。
  4. 耗时业务应该交给普通Worker任务。
  5. Worker没有工作时通过通知进入Blocked。
  6. Timer决定触发时间,Worker负责实际处理。
  7. Worker处理不过来时,通知计数可能累积。
  8. 每次工作携带不同数据时,应使用Queue。
Timer到期
→ Callback快速发送任务通知
→ Callback立即返回
→ Worker被唤醒
→ Worker执行耗时操作

创建定时器

static TimerHandle_t xWorkTimer = NULL;

xWorkTimer = xTimerCreate("WorkTimer",pdMS_TO_TICKS(TIMER_PERIOD_MS),pdTRUE,NULL,vWorkTimerCallback);

创建worker

static TaskHandle_t xWorkerTaskHandle = NULL; // 任务句柄
xWorkerResult = xTaskCreate(vWorkerTask,"TimerWorker",configMINIMAL_STACK_SIZE,NULL,2,&xWorkerTaskHandle;

static void vWorkerTask(void *pvParameters)
{
    (void)pvParameters;
    for (;;)
    {
        ulTaskNotifyTake(pdTRUE, portMAX_DELAY);//一直等待
        vTaskDelay(pdMS_TO_TICKS(200));//模拟处理,处理完成之后让步
    }
}

定时回调

static void vWorkTimerCallback(TimerHandle_t xTimer)
{
    xTaskNotifyGive(xWorkerTaskHandle);//唤醒worker
}

另一个低优先级任务

xTaskCreate(vHeartbeatTask,"Heartbeat",configMINIMAL_STACK_SIZE,NULL,1,
NULL);
static void vHeartbeatTask(void *pvParameters)
{
    (void)pvParameters;
    for (;;)
    {
        vTaskDelay(pdMS_TO_TICKS(200));//模拟一直处理,当定时器给到通知worker之后,woker抢占cpu
    }
}

启动定时器

xTimerStart(xWorkTimer, 0)