vTaskDelayUntil()関数で遅延が発生せずすぐに終了する問題があります。ここでは、コードは次のとおりです。FreeRTOS vTaskDelayUntil()がすぐに終了する
TickType_t xLastWakeTime = xTaskGetTickCount();
while(1){
if (xSemaphoreTake(xSemaphoreRS485, portMAX_DELAY) == pdTRUE) {
printf("S display data %d\n", xTaskGetTickCount());
sendDisplayData();
printf("E display data %d\n", xTaskGetTickCount());
xSemaphoreGive(xSemaphoreRS485);
printf("W display data %d\n", xLastWakeTime);
vTaskDelayUntil(&xLastWakeTime, 2000);
}
}
このことから、私は次のような出力が得られます。
S display data 29928
E display data 30534
W display data 3919
S display data 30534
E display data 31140
W display data 5919
S display data 31140
E display data 31746
W display data 7919
S display data 31746
E display data 32352
W display data 9919
sendDisplayDataは()を実行するのに約670ミリ秒かかり、xTaskGetTickCount()関数は、それを確認します。次に、タスクは約1230ミリ秒を待たなければならないので、繰り返し全体が2000ミリ秒かかることがあります。しかし、vTaskDelayUntil()はすぐに終了します。最初の実行は30534で終了し、2番目の実行は30534でも開始されます。 xTaskGetTickCount()によって返された値は、vTaskDelayUntil()によって遅延が導入されなかったことを示します。 sendDisplayData()の出力頻度でも見ることができます。
2番目の面白いことに、xLastWakeTimeは全く異なる値を示し、その値は実際には2000ずつ増えています。xTaskGetTickCount()で返される値と同じ値を保存してはいけませんか?あなたの最初の反復xLastWakeTime
で
設定ファイルに#define INCLUDE_vTaskDelayUntil 1がありますか?そして、TickType_tを再定義して、符号付き16ビットと言うことはできませんか? TickType_t xLastWakeTime = xTaskGetTickCount();を移動してみてください。セマフォを受け取った後に、適切な値が表示されますか? (これは、最初にvTaskDelayUntilにxLastWakeTime + 2000を既に超過したことが原因であるかどうかをプレーンなチェックのためだけにしたいとは思わないでしょう) – koper89
はい、この定義があり、TickType_tは32ビットタイプです。私の疑問に思っています。もちろん、元のコードは完全ではありませんでした。なぜなら、セマフォを取るには最大10秒かかり、最初のvTaskDelayUntil()はすぐに終了するからです。その変数は5919ではなく、30534に設定されています。 – grzegorz