使用:
- 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 サイクルの浪費)。
これをより良い方法で、特に待ち時間を少なくして解決するための提案はありますか?