Nios® V プロセッサー・ソフトウェア開発者ハンドブック

ID 743810
日付 7/08/2024
Public
ドキュメント目次

11.3.4. newlib ANSI C 標準ライブラリー

MicroC/OS-II 上にビルドされたプログラムは、ANSI C 標準ライブラリー関数を呼び出すこともできます。マルチスレッド環境では、C 標準ライブラリー関数がスレッドセーフであることを確認するために、いくつかの考慮事項が必要です。newlib C ライブラリーは、ポインター _impure_ptr を介して参照される単一の構造体にすべてのグローバル変数を格納します。ただし、インテル FPGA MicroC/OS-II の実装では、タスクごとに構造体の新しいインスタンスが作成されます。コンテキストの切り替え中、_impure_ptr の値は、この構造体の現在のタスクのバージョンを指すように更新されます。このように、_impure_ptr が指す構造体の内容はスレッドローカルとして扱われます。たとえば、このメカニズムにより、各タスクは独自のバージョンの errno を持ちます。

このスレッド・ローカル・データは、タスクのスタックの最上部に割り当てられます。スタックにメモリーを割り当てる際は、スレッド・ローカル・データ・ストレージのための余裕を見ておく必要があります。一般的に、_reent 構造体は約 900 バイトのデータを消費します。

さらに、MicroC/OS-II の移植版では適切なタスクロックが利用できるため、ヒープアクセス (malloc()free() の呼び出し) も確実にスレッド・セーフにすることが可能です。