先貼上一個創建的代碼,先聲明一個句柄
TimerHandle_t pump_wakeup_timer_handle = NULL;
創建定時器和啟動定時器,第三個參數,pdFALSE是只定時一次,pdTRUE是自動重載定時器,也就是一直循環。
if(pump_wakeup_timer_handle == NULL) { //定時器的第一個參數,字符串,定時器的名字 //第二個參數,是定時時間,毫秒級別 //第三個參數,只定時一次,還是自動加載 //第4個參數嗎,定時器的ID,一般為0 //第5個參數,定時到了的回調函數
pump_wakeup_timer_handle = xTimerCreate(NULL, (15000), pdFALSE, NULL, pump_wakeup_timeout_callback); //啟動定時器 //reset這個定時器
if(xTimerStart(pump_wakeup_timer_handle, 0) != pdPASS) { Report("timer start fail"); } }
定時器回調函數,比如上面定時了15S,那么15S之后到了就會調用這個函數。
void pump_wakeup_timeout_callback(TimerHandle_t xTimer) { if (pump_wakeup_timer_handle != NULL) { xTimerDelete(pump_wakeup_timer_handle, 0); pump_wakeup_timer_handle = NULL; } Report("task suspend"); }
問題記錄,實際測試發現定時器啟動函數,只能啟動一次,如果啟動之后,再次啟動會產生問題,導致時間異常,總結起來就是定時器啟動函數不會在內部檢查是否已經啟動了。我犯過這個錯誤,需要注意。
if(xTimerStart(pump_wakeup_timer_handle, 0) != pdPASS)