3

PIC32MX で FreeRTOS を使用する前は、次のような ISR を使用するだけで割り込みを処理できました。

void __ISR(_INTERRUPT_1_VECTOR, ipl7auto) {
    // Handle interrupt here
}

しかし、FreeRTOS を紹介して以来、インストラクターはアセンブリ ラッパーを使用して割り込みを処理するように指示してきました。属性を使用して、割り込みベクトルを割り込みを処理する関数にバインドし、アセンブリを使用してコンテキストを保存しますが、次のようなものではありません。

void __attribute__((interrupt(ipl5), vector (_EXTERNAL_2_VECTOR))) vEXT2InterruptWrapper (void);

FreeRTOS でこれを行う必要があるのはなぜですか?

4

2 に答える 2

3

__ISRは単なるプリプロセッサマクロです。コンパイラ/リンカーがその関数を ISR にしたいことを知るために必要なものに展開されます。

マクロは、C 言語からの割り込みを続行して処理するために、必要なアセンブリ レベルの処理 (レジスタの状態の保存など) を自動的に実行する可能性があります。

于 2014-05-07T22:56:35.560 に答える
2

プリエンプティブな RTOS を使用する場合、割り込みハンドラは通常、OS を介して終了する必要があります。これにより、セマフォまたはイベントを通知した場合、それを待機しているスレッドを「すぐに」準備できるようになります。これには、interrupt-return が割り込みの最上位レベルを終了したことを検出し、割り込みを受けたスレッドの代わりに RTOS カーネルに戻る必要があります。それには少しいじる必要があり、アセンブラーが必要です。プリエンプティブ RTOS がない場合、そのようなものは必要ありません。

于 2014-05-09T11:19:23.307 に答える