- Timer回调运行在公共Timer Service Task中。
- Timer回调应快速返回。
- 回调适合发送通知、Queue消息或设置事件位。
- 耗时业务应该交给普通Worker任务。
- Worker没有工作时通过通知进入Blocked。
- Timer决定触发时间,Worker负责实际处理。
- Worker处理不过来时,通知计数可能累积。
- 每次工作携带不同数据时,应使用Queue。
Timer到期
→ Callback快速发送任务通知
→ Callback立即返回
→ Worker被唤醒
→ Worker执行耗时操作
static TimerHandle_t xWorkTimer = NULL;
xWorkTimer = xTimerCreate("WorkTimer",pdMS_TO_TICKS(TIMER_PERIOD_MS),pdTRUE,NULL,vWorkTimerCallback);
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)