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

ID 743810
日付 10/31/2022
Public

このドキュメントの新しいバージョンが利用できます。お客様は次のことを行ってください。 こちらをクリック 最新バージョンに移行する。

ドキュメント目次

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

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

このスレッド・ローカル・データは、タスクのスタックの一番上に割り当てられます.stackにメモリーを割り当てるときは、スレッド ローカル データ ストレージを考慮する必要があります。一般に、 _reent 構造体は約 900 バイトのデータを消費します。

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