0

特定の順序でいくつかの操作を実行する特定のタスク ルーチンがあり、これらの操作はいくつかの揮発性変数を処理します。これらの揮発性変数を非同期的に更新する特定の割り込みがあります。したがって、このような割り込みが発生した場合、タスク ルーチンは再起動する必要があります。通常、FreeRTOS はタスクを再開しますが、これにより誤った派生値が生成されるため、ルーチンを再起動する必要があります。また、割り込みを逃してはならないため、クリティカル セクションの下にタスク ルーチンを保持することもできません。

これを達成できる FreeRTOS の方法はありますか? vtaskRestart API のように。タスクを削除して再作成することもできましたが、これによりメモリ管理が複雑になるため、避けたいと考えています。現在、私の唯一のオプションは、フラグのルーチンにチェックを追加して、コンテキスト スイッチが発生したかどうかを確認し、発生した場合は再起動し、そうでない場合は続行することです。

グーグルはこれに関する手がかりを見つけられませんでした。人々はそのような問題に直面したことがないように思われるか、この設計が貧弱である可能性があります. FreeRTOS フォーラムでは、タスクの再起動を求めた人はほとんどいなかったようです。フリート+タスク+再起動でstackOverflowの結果が出ませんでした。したがって、これはこのタグの組み合わせを使用した最初の投稿になる可能性があります ;)

これが FreeRTOS で直接可能かどうか教えてください。

4

2 に答える 2

0

この目的でセマフォを使用できます。セマフォを使用する場合は、以下の手順を実行する必要があります。

  • まず、バイナリ セマフォを作成する必要があります。
  • セマフォは、割り込みルーチンで xSemaphoreGiveFromISR( Example_xSemaphore, &xHigherPriorityTaskWoken ); で指定する必要があります。
  • また、タスクでセマフォを取得することを確認する必要があります。

    void vExample_Task( void * pvParameters ) {
    for( ;; ) {
    if (xSemaphoreTake( Example_xSemaphore, Example_PROCESS_TIME)==pdTRUE) {

    } } }

于 2013-12-13T08:01:23.003 に答える
0

この目的のために、キューを使用し、キュー ピーク機能を使用して揮発性データを生成する必要があります。

私はリアルタイムタイマーを持っているのでそれを使用しています。このようにして、ブロックすることなく、すべてのタスクで時間を利用できるようにします。

キューを宣言します。

xQueueHandle     RTC_Time_Queue;

1 要素のキューを作成します。

RTC_Time_Queue = xQueueCreate( 1, sizeof(your volatile struct) );

割り込みが発生するたびにキューを上書きします。

xQueueOverwriteFromISR(RTC_Time_Queue, (void*) &time);

そして、他のタスクからキューを覗いてみましょう:

xQueuePeek(RTC_GetReadQueue(), (void*) &TheTime, 0);

xQueuePeek の末尾の 0 は、キューが空の場合に待機しないことを意味します。キュー ピークはキュー内の値を削除しないため、ピークするたびに値が存在し、コードが停止することはありません。

また、予期しない破損が発生する可能性があるため、ISR および RTOS コードから変数にアクセスすることは避ける必要があります。

于 2014-01-03T10:50:18.770 に答える