4

使用:

  • Stm32F10x、F2xx、F4xx
  • FreeRtos 8.1.1
  • gcc-arm-none-eabi-4_8-2014q2

高い割り込み優先度で実行する必要がある ISR があるため、この ISR 内から FreeRtos Api を呼び出すことは禁止されています (こちらこちらを参照)。

場合によっては、これらの ISR が条件を検出し、スリープ中の FreeRtos タスクを少なくとも可能な限りのレイテンシでウェイクアップする必要があります。

通常 (ISR が FreeRtos Api の呼び出しを許可されている場合は、優先度が十分に低いため)、キューまたはセマフォを使用してこれを解決します。

しかし、優先度の高い ISR でそれを実現するにはどうすればよいでしょうか。

私の現在の暫定的なアプローチは次のようなものです(簡単に概説します):

volatile int flag = 0;

void XYZ_IRQHandler() {
    if (someCondition)
        flag = 1
}

void FreeRtosTaskFunction(void* parameters) {
    for (;;) {
        if (flag == 1)
            doSomething();
        vTaskDelay(1);  // sleep 10ms (tick frequency is 100Hz)
    }
}

しかし、このアプローチには欠点があります。

  • レイテンシ (ISR でフラグを設定してからタスクがウェイクアップするまで) は、最大 1 FreeRtos tick です。
  • フラグをポーリングする必要があります (CPU サイクルの浪費)。

これをより良い方法で、特に待ち時間を少なくして解決するための提案はありますか?

4

2 に答える 2

2

テストはしていませんが、うまくいくようです。

ISR は、他の割り込みの影響を受けないこと (つまり、正確な時間に測定を行うこと) を実行するために非常に低いレイテンシーを必要とするため、優先度が高いと想定しています。クリティカル (つまり、値を送信または表示する)。

優先度の高い ISR で、タイミングが重要な機能を実行してから、優先度の低い内部割り込みをトリガーします。

優先度の高い ISR が完了すると (保留中の他の ISR と同様に)、優先度の低い ISR が呼び出されます。これにより、FreeRTOS API を呼び出して、遅延なくタスクを開始できます。

于 2014-10-08T22:49:13.253 に答える