1.14 C ライブラリでのスタティックデータの使用

スタティックデータとは、スタックやヒープ上に保存されていない永続的な読み出し/書き込みデータを意味します。C ライブラリからの呼び出しでスタティックデータにアクセスできます。

スタティックデータは有効範囲の外部または内部のいずれにも配置でき、以下の場所に保存されます。
  • 固定アドレス(--apcs /norwpi を使用してコンパイルされた場合)。
  • スタティックベースであるレジスタ r9 を基準とした固定アドレス(--apcs /rwpi を使用してコンパイルされた場合)
  • プログラムカウンタ(pc)を基準とした固定アドレス(--apcs /fpic を使用してコンパイルされた場合)
スタティックデータを使用するライブラリも場合によっては再入可能である可能性があります。ただし、可能か不可能かは、そのライブラリの __user_libspace スタティックデータ領域の使用方法と、選択するビルドオプションによって決まります。
  • --apcs /norwpi を使用してコンパイルされた場合、読み出し/書き込みスタティックデータのアドレスは、位置依存形式で指定されます。これがデフォルトです。)このようなバリアントのコードは、読み出し/書き込みスタティックデータを使用するのでシングルスレッドとなります。
  • --apcs /rwpi を使用してコンパイルされた場合、読み出し/書き込みスタティックデータのアドレスは、スタティックベースレジスタ sb からのオフセットを使用して位置非依存形式で指定されます。このようなバリアントのコードは再入可能で、各スレッドが異なるスタティックベース値を使用している場合にこのコードをマルチスレッドにすることができます。
C ライブラリによるスタティックデータの使用形態は以下のとおりです。
  • デフォルトの浮動小数点算術演算ライブラリ fz_* および fj_* はスタティックデータを使用せず、常に再入可能です。ソフトウェア浮動小数点の場合、f_* および g_* ライブラリはスタティックデータを使用して、浮動小数点(FP)ステータスワードをストアします。ハードウェア浮動小数点の場合、f_* および g_* ライブラリはスタティックデータを使用しません。
  • C ライブラリ内の、初期化されたすべてのスタティックデータは読み出し専用です。
  • すべての書き込み可能スタティックデータはゼロで初期化されます。
  • ほとんどの C ライブラリ関数は書き込み可能スタティックデータを使用しません。また、ビルド時に、デフォルトのビルドオプション --apcs /norwpi または再入可能ビルドオプション --apcs /rwpi のいずれを使用したかに関係なく、再入可能です。
  • 関数の中には、その定義内に暗黙的にスタティックデータがあるものもあります。--apcs /rwpi を使用してビルドし、呼び出し元が sb 内に指定されている異なる値を使用しない限り、再入可能アプリケーションではこのような関数を使用しないで下さい。

定義内のスタティックデータを使用する関数は、今後のリリースで変更される場合があります。
C ライブラリからの呼び出しでスタティックデータにアクセスできます。スタティックデータを使用する C ライブラリ関数は、以下のように分類できます。
  • 種類にかかわらずスタティックデータを一切使用しない関数(例:fprintf())。
  • スタティック状態を管理する関数(例:malloc()rand()strtok())。
  • スタティック状態は管理しないものの、 ARM® コンパイラの実装に固有の方法でスタティックデータを使用する関数(例:isalpha()
C ライブラリは、暗黙のスタティックデータを必要とする機能を使う場合に、置き換え可能な関数への呼び出しを使用します。次の表にこれらの関数を示します。これらの関数ではセミホスティングは使われません。

表 1-1 C ライブラリの呼び出し

関数 説明
__rt_errno_addr() 変数 errno のアドレスを取得するために呼び出されます
__rt_fp_status_addr() 浮動小数点ステータスワードのアドレスを取得するために、浮動小数点サポートコードによって呼び出されます
locale 関数 __user_libspace() 関数は、ライブラリ専用のスタティックデータブロックを作成します
__user_libspace のデフォルトの実装では、ZI 領域内に 96 バイトのブロックが作成されます。アプリケーションに main() 関数が含まれない場合でも、通常は __user_libspace() 関数を再定義する必要はありません。

定義内のスタティックデータを使用する関数は、今後のリリースで変更される場合があります。
関連する概念
1.17 C ライブラリでの既存の関数 __user_libspace() の再実装
1.49 C ライブラリでのロケール関数をカスタマイズするためのアセンブラマクロ
1.11 ARM C ライブラリとマルチスレッド
関連する参考文書
4.24 __rt_errno_addr()
4.26 __rt_fp_status_addr()
関連情報
別々にコンパイルおよびアセンブルしたモジュールとのコードの互換性
--apcs=qualifier...qualifier コンパイラオプション
非機密扱いPDF file icon PDF 版ARM DUI0475KJ
Copyright © 2010-2014 ARM.All rights reserved.