Renesas Synergy™

FAQ 1008256 : sprintf等のライブラリを使っていますが、ライブラリ関数自身はどこのメモリを使用していますか?

回答

V2.02では、sprintfで使用されるメモリ(ヒープ領域)は、生成された実行可能なオブジェクト・ファイルの終端を越える最初のアドレス (4バイト境界)の__endから確保された領域を使用しています。
sprintfでfloatデータを扱う場合には、メモリを大量に消費してしまうので注意が必要です。
メモリ領域を確保していく際、I/Oレジスタの領域、ROMの領域を壊してしまう可能性があります。

これを回避するには、_endを.bssセクションを越える最初の(4バイト境界)アドレスの _ebssなどに変更します(bss領域を確保していなければ_ebssというシンボルは出ません)。
ライブラリでメモリを確保するシンボルを定義している部分のソースは、以下のとおりです。
これを改造してコンパイルし、できたオブジェクトをライブラリよりも先にリンクしてください。
(リンカが生成する__end、__ebss等のシンボルについては、ユーザーズ・マニュアル操作編の章 「リンカ」の「予約シンボル」を参照してください。)

【 sbrk.c 】
	extern int _end;	static char *end_of_data = (char *) &_end;	char * _sbrk(int delta)	{		char *ptr = end_of_data;		end_of_data += delta;		return ptr;	}


また、上記のようにヒープの領域を使用してしまうライブラリは、次のとおりです。
注意して使用する必要があります。

  • 書式化入出力 :sprintf、sscanf
  • ユーティリティ :ecvtf、fcvtf、gcvtf、atoff、strtodf

なお、V2.20からはこの点が改良され、ヒープ領域を使用せず、すべてスタックでまかなえる仕様となっています。

 

 

適用製品

V850用コンパイラパッケージ [CA850]
他にご質問がございましたら、リクエストを送信してください