7. vTaskDelay() と vTaskDelayUntil()

I. 概要

FreeRTOS は、相対遅延関数 vTaskDelay() と絶対遅延 vTaskDelayUntil() の 2 つのシステム遅延関数を提供します。

この 2 つの遅延関数は、自分で実装した遅延関数とは異なり、この 2 つの遅延関数が呼び出されると、現在のタスクはすぐにブロッキング状態になりますが、自分で作成した遅延関数 (for ループの形で実装されたソフトウェア遅延関数)など) ) は常に有効なタスクとして実行されます。

  • 相対遅延とは、各遅延がタスク実行関数 vTaskDelay() から始まり、遅延によって指定された時間に終了することを意味します。
  • 絶対遅延とは、指定された時間ごとに vTaskDelayUntil() 関数を呼び出すタスクを実行することを指します。つまり、タスクは一定の頻度で実行されます。

2. vTaskDelay()

vTaskDelay() 関数を呼び出した後、タスクはブロック状態に入り、vTaskDelay() 関数のパラメーター xTicksToDelay は、システム ティック クロック サイクルが何回遅れているかを示します。ファイル FreeRTOSConfig.h で、この関数を有効にするには、マクロ INCLUDE_vTaskDelay を 1 に設定する必要があります。

vTaskDelay() で指定される遅延時間は、vTaskDelay() を呼び出した後の相対時間です。

たとえば、vTaskDelay(100) の場合、vTaskDelay() を呼び出した後、タスクはブロック状態になり、100 システム クロック ティック後にタスクのブロックが解除されます。したがって、vTaskDelay() は、タスクが定期的に実行される場合には適していません。さらに、他のタスクや割り込みアクティビティが vTaskDelay() の呼び出しに影響を与えるため (たとえば、優先度の高いタスクが呼び出しの前に現在のタスクをプリエンプトした場合)、タスクの次の実行時間に影響します。

while(1)
{
    
    
	//执行操作...
	vTaskDelay(1000 / portTICK_RATE_MS);//1000ms后重新执行操作
}

3. vTaskDelayUntil()

API 関数 vTaskDelayUntil() は、絶対時間を遅らせるために使用される固定周波数の遅延に使用できます。
ファイル FreeRTOSConfig.h で、この関数を有効にするには、マクロ INCLUDE_vTaskDelayUntil を 1 に設定する必要があります。

この関数と vTaskDelay() 関数の重要な違いは、vTaskDelay() で指定された遅延時間は、vTaskDelay() を呼び出した後 (関数が実行された後) から計算されるのに対し、vTaskDelayUntil() は絶対時間を指定することです。到着したら、タスクのブロックを解除します。

TickType_t lasttick;
lasttick = xTaskGetTickCount();  
while(1)
{
    
    
	//执行操作...
	//相对于lasttick 1000ms后重新执行操作
	vTaskDelayUntil(&lasttick, 1000 / portTICK_RATE_MS);
}

4.まとめ

プロトタイプ:

void vTaskDelay( const TickType_t xTicksToDelay )

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

**vTaskDelay()** は、サイクル間隔で特定のことを行うことと同等です。たとえば、次のようになります。

たとえば、クラス間の休憩が 10 分である場合、教師が最後のクラスでクラスを 3 分間遅らせた場合、2 番目のクラスも 3 分間遅刻する必要があります.この間隔は vTaskDelay です

画像-20220829215500208

t1、t3: 何かを開始 (ループ)

t2 と t4 はvTaskDelayUntil()の遅延時間です。

vTaskDelayUntil()はデッド コマンドと同等であり、途中で何をしても、その時点で実行する必要があります。次に例を示します。

毎日登校は8時なので、8時以降は授業に行けず、今日の放課後にどんなに時間を割いても、次の日は8時授業、8時授業。 oclock は **vTaskDelayUntil()** の時間です

画像-20220829220330064

T1: vTaskDelayUntil 内のpxPreviousWakeTime (開始時刻)

T2: vTaskDelayUntil のxTimeIncrement (間隔時間)

T3: 2 回目の開始時刻

おすすめ

転載: blog.csdn.net/mayuxin1314/article/details/126593752