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

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

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

FreeRTOS の上に構築されたプログラムは、ANSI C 標準ライブラリー関数も呼び出すことができます。C 標準ライブラリー関数がスレッドセーフであることを保証するために、マルチスレッド環境で以下のシナリオを考慮します。
  • newlib C ライブラリーは、すべてのグローバル変数をポインター _impure_ptr を介して参照される単一の構造体に格納します。インテル FPGA FreeRTOS 実装は、各タスクごとにこの構造体の新しいインスタンスを作成します。コンテキストの切り替え中、 Nios® Vプロセッサー は、_impure_ptr の値を更新して、現在のタスクのこの構造体のバージョンを指すようにします。このように、 Nios® Vプロセッサー_impure_ptr によって指された構造体の内容をスレッドローカルとして扱います。例えば、このメカニズムを通じて、各タスクは独自の errno バージョンを有しています。 Nios® Vプロセッサー は、このスレッド・ローカル・データをタスクのスタックの最上部に割り当てます。スタックのメモリーを割り当てる際には、スレッド・ローカル・データ・ストレージに向けてある程度の余裕を見ておく必要があります。一般的に、_reent 構造体は約 900 バイトのデータを消費します。
  • FreeRTOS の実装は、ヒープアクセス (malloc()free()etc()、および setenv() の呼び出し) もスレッドセーフであることを保証するために、適切なタスクロック (_malloc_lock()/unlock() および _env_lock()/unlock()) を提供します。デフォルトでは、スレッドセーフな newlib ライブラリーを有効にするために、ボード・サポート・パッケージ・エディターで freertos.os_thread_safe_newlib フラグが 1 に設定されています。