1.11.5 ARM で提供されるヒープおよびヒープを使用するライブラリ関数の使用の回避

RAM が制限されているか、独自のヒープ管理を行う組み込みシステム(オペレーティングシステムなど)を開発する場合は、ヒープエリアを定義しないシステムが必要となる場合があります。

ヒープを使用しないようにするには、以下のいずれかの方法をとります。
  • アプリケーションに関数を再実装します。
  • ヒープを使用する関数を呼び出さないアプリケーションを作成します。
ヒープを使用する関数が ARM ライブラリからリンクされないようにするには、コード内で __use_no_heap シンボルまたは __use_no_heap_region シンボルを参照します。以下のいずれかの関数を使用して、これらのシンボルをアプリケーションに 1 回だけインポートする必要があります。
  • アセンブリ言語からの IMPORT __use_no_heap
  • C からの asm(".global __use_no_heap\n")
ヒープを使用する関数が含まれている場合に __use_no_heap または __use_no_heap_region が参照されている場合には、リンカによって以下のようなエラーが報告されます。例えば、次のサンプルコードを実行すると、コードの最後に示されているリンカエラーが発生します。
#include <stdio.h> #include <stdlib.h> #pragma import(__use_no_heap) void main() {      char *p = malloc(256);     ...}
エラー:L6915E:ライブラリからエラーがレポートされています:__use_no_heap が要求されていましたが、malloc が参照されました
ヒープを使用しているオブジェクトを探すには、--verbose --list=out.txt とリンクし、その出力内で関連するシンボル(この場合は malloc)を検索して、そのシンボルを参照するオブジェクトを見つけます。
__use_no_heap は、malloc()realloc()free() の各関数、およびこれらの関数を使用する関数(calloc() やその他の stdio 関数)が使用されるのを防ぎます。
__use_no_heap_region には、__use_no_heap と同じプロパティがあるだけでなく、ヒープメモリ領域を使用する他の項目からの保護機能も含まれています。例えば、引数を取る関数として main() を宣言した場合、ヒープ領域は argcargv を収集するために使用されます。
関連する参考文書
1.11.2 メモリ割り当て関数のヒープの実装の選択
1.6.6 C ライブラリ関数の間接セミホスティング依存関数
関連情報
--list=filename リンカオプション
--verbose リンカオプション
非機密扱いPDF file icon PDF 版ARM DUI0808CJ
Copyright © 2014, 2015 ARM.All rights reserved.