FreeRTOS学習(4)遅延時間スライス操作(vTaskDelay / vTaskDelayUntil)



Freertos Learning Delay Time Slice Operation



ディレイ

これは、CPUを一定期間引き渡すことを意味します。タスクが遅延または一時停止されていない場合、優先度の低いタスクはCPUを取得しません。
FreeRTOS遅延の単位はティックです。これはスケジューリングの基本単位です(ミリ秒ではありません)。

vTaskDelayとvTaskDelayUntilはどちらも遅延関数であり、vTaskDelayUntilは正確な遅延です。



関数プロトタイプ

void vTaskDelay( const TickType_t xTicksToDelay ) void vTaskDelayUntil( TickType_t * const pxPreviousWakeTime, const TickType_t xTimeIncrement )

vTaskDelay

while(1) { //Perform operation... vTaskDelay(1000 / portTICK_RATE_MS)//Re-execute the operation after 1000ms }

vTaskDelayUntil

TickType_t lasttick lasttick = xTaskGetTickCount() while(1) { //Perform operation... //Re-execute the operation after 1000ms relative to lasttick vTaskDelayUntil(&lasttick, 1000 / portTICK_RATE_MS) }

vTaskDelayUntilは変数に値を自動的に割り当てます、lasttickは最初に割り当てる必要があるだけです
テスト:

//vTaskDelayUntil test void delay_test_task(){ TickType_t lasttick = xTaskGetTickCount() //Initial value while(1) { printf('---------------------- ') printf('1.lasttick:%d, xTaskGetTickCount:%d ',lasttick,xTaskGetTickCount()) vTaskDelayUntil(&lasttick,100) printf('2.lasttick:%d, xTaskGetTickCount:%d ',lasttick,xTaskGetTickCount()) vTaskDelayUntil(&lasttick,100) printf('3.lasttick:%d, xTaskGetTickCount:%d ',lasttick,xTaskGetTickCount()) vTaskDelayUntil(&lasttick,200) printf('4.lasttick:%d, xTaskGetTickCount:%d ',lasttick,xTaskGetTickCount()) } }

画像