3

オペレーティング システムのスケジューラがまだ開始されていない、実行されている、一時停止されている、または停止している可能性がある環境で、スレッド セーフな IO (デバッグ シリアル ポートに接続する printf など) を最適に実装する方法についてのアドバイスを探しています。墜落した。Newlib と FreeRTOS を使用しています。

現時点では、_write システム コール (Newlib) キュー文字を FreeRTOSキューに入れる (一見標準的な) FreeRTOS アプローチを行っています。FreeRTOS キューは、割り込みサービス ルーチンから空にされます (シリアル ポート ハードウェア FIFO をいっぱいにしてから、 FIFO エンプティ割り込み)。

これには、(少なくとも FreeRTOS では) スケジューラが実行されているときにのみキューを安全に使用でき、割り込みが無効になっているとデバッグ出力を出力できないという欠点があります (スケジューラが起動するまでのブート中、または致命的なエラーの後)。エラー状態 (正確に debug printf 出力が最も役立つ場所:-)。

_write システム コールでスケジューラおよび/または割り込みステータスをクエリし、スケジューラが実行されている場合はキューを使用し、割り込みが無効になっている場合はシリアル IO のブロッキング/ポーリングを使用するのが最善でしょうか? 私がまだ考えていないよりエレガントなアイデアはありますか?

ありがとう

4

1 に答える 1

2

_write システム コールでインダイレクションを使用する方が、もう少し洗練されているかもしれません。ステータスをチェックする代わりに、関数ポインタを使用して、スケジューラが実行されているかどうか、割り込みが有効になっているかどうかなどに基づいて目的の機能を実現します。次に、プログラムの状態が変化したときに適切なコールバック関数を設定します。

int (*writeCallback)(int, const void *, unsigned int);

int
_write(int fd, const void *buffer, unsigned int count)
{
    return writeCallback(fd, buffer, count);
}

...

writeCallback = polling_write;

...

writeCallback = rtos_write;

...

または、標準ライブラリ ストリーム システム (printf など) をバイパスする別のデバッグ関数を定義して、割り込み/RTOS 機能がないことがわかっている場所 (例外ハンドラなど) で使用します。

于 2010-05-04T13:48:53.273 に答える