函數(shù)名 :vTaskDelayUntil 頭文件 :task.h 函數(shù)功能:任務(wù)絕對延時 函數(shù)聲明:
void vTaskDelayUntil( portTickType *pxPreviousWakeTime, portTickTypexTimeIncrement );
INCLUDE_vTaskDelayUntil 必須定義為 1以使能此函數(shù)。見configuration 章節(jié)獲得更多信息。 延遲任務(wù)直到一個指定的時間結(jié)束。該函數(shù)用在周期性任務(wù)以保證任務(wù)執(zhí)行頻率的穩(wěn)定。 與上vTaskDelay 不同的是該任務(wù)指定絕對時間,vTaskDelay指定相對時間。 (筆者注釋:原文接下來兩小段反復(fù)解釋為什么一個是相對時間一個是絕對時間,翻譯 省略,后續(xù)筆者會描述。) 必須注意,vTaskDelayUntil() 會立即返回(沒有阻塞)如果它用來指定一個已經(jīng)過去 的喚醒時間。所以任務(wù)用vTaskDelayUntil() 來執(zhí)行周期必須重新計算它需要的喚醒時間, 如果該周期執(zhí)行由于任何導(dǎo)致任務(wù)丟失 1個或者多個周期的理由被打斷(比如該任務(wù)被掛 起) 這可以由檢查pxPreviousWake 傳遞的變量與當(dāng)前的時間封計數(shù)器來做比較檢測到。在 大多數(shù)情況這不是必須的的。 常量portTICK_RATE_MS 可以用來計算時間封的實際時間間隔。 當(dāng)調(diào)度器由于應(yīng)用調(diào)用vTaskSuspendAll()導(dǎo)致掛起(調(diào)度器暫停),不能調(diào)用此函數(shù)。 具體參數(shù) pxPreviousWakeTime :上一次喚醒的時間計數(shù)器。 xTimeIncrement :間隔周期計數(shù)器。 (筆者注釋:如果有寫過以定時器方式查詢按鍵,去抖動等程序,或者看過 PIC591鍵盤程序的用戶,對這兩個參數(shù)的作用應(yīng)當(dāng)很容易從直觀上理解。對于所有的 RTOS,都有一個時間封(心跳時間),需要靠經(jīng)過設(shè)置后能提供周期性中斷功能的定時器來實現(xiàn),而當(dāng) RTOS發(fā)動時,將有一個計數(shù)器來計數(shù)這是第幾次定時中斷,這個計數(shù)器一般只會自然溢出,即達到最大值后歸0。讀這個計數(shù)器的值,就等于了解了從FRTOS開始運行,到當(dāng)下,經(jīng)歷了多少時間間隔(不考慮歸0),而所謂的絕對延時,就是只關(guān)心上一次的計數(shù)器時間 pxPreviousWakeTime,以及經(jīng)歷多長時間 xTimeIncrement后完成定時。至于計數(shù)器溢出,不會影響什么,只要這兩個參數(shù)與系統(tǒng)的計數(shù)器的數(shù)據(jù)類型一致,又都采用自然溢出方式計算就可以。) 范例:
// Perform an action every 10 ticks.
void vTaskFunction( void * pvParameters )
{
portTickType xLastWakeTime;
const portTickType xFrequency = 10;
// Initialise the xLastWakeTime variable with the current time.
xLastWakeTime = xTaskGetTickCount();
for( ;; )
{
// Wait for the next cycle.
vTaskDelayUntil( &xLastWakeTime, xFrequency );
// Perform action here.
}
}
更多建議: