RL78 の 標準ライブラリの使用は、スタートアップルーチン内の定義を0にすることにより抑止出来ると思いますが、
コンパイラ設定の中の定義にも標準ライブラリを使用する、しないが選択できるようになっています。
RL78 の 標準ライブラリだけを、”いいえ”にすると、以下の様なエラーが出ます。※RL78/G12 16K:30pin 版を使用
RA78K0R error E3405: Undefined symbol '_stkinit' in file 'C:\Program Files\Renesas Electronics\CubeSuite+\CA78K0R\V1.60\lib78k0r\s0rl.rel'RA78K0R error E3405: Undefined symbol '_?R_INIT' in file 'C:\Program Files\Renesas Electronics\CubeSuite+\CA78K0R\V1.60\lib78k0r\s0rl.rel'RA78K0R error E3405: Undefined symbol '_?RLINIT' in file 'C:\Program Files\Renesas Electronics\CubeSuite+\CA78K0R\V1.60\lib78k0r\s0rl.rel'RA78K0R error E3405: Undefined symbol '_?R_INIS' in file 'C:\Program Files\Renesas Electronics\CubeSuite+\CA78K0R\V1.60\lib78k0r\s0rl.rel'RA78K0R error E3405: Undefined symbol '_?DATA' in file 'C:\Program Files\Renesas Electronics\CubeSuite+\CA78K0R\V1.60\lib78k0r\s0rl.rel'RA78K0R error E3405: Undefined symbol '_?DATAL' in file 'C:\Program Files\Renesas Electronics\CubeSuite+\CA78K0R\V1.60\lib78k0r\s0rl.rel'RA78K0R error E3405: Undefined symbol '_?DATS' in file 'C:\Program Files\Renesas Electronics\CubeSuite+\CA78K0R\V1.60\lib78k0r\s0rl.rel'RA78K0R error E3405: Undefined symbol '_@RTARG4' in file 'DefaultBuild\info.rel'RA78K0R error E3405: Undefined symbol '_@RTARG6' in file 'DefaultBuild\info.rel'RA78K0R error E3405: Undefined symbol '_@SEGAX' in file 'DefaultBuild\r_cg_intc_user.rel'RA78K0R error E3405: Undefined symbol '_@SEGDE' in file 'DefaultBuild\r_cg_intc_user.rel'RA78K0R error E3405: Undefined symbol '_@RTARG0' in file 'DefaultBuild\r_cg_intc_user.rel'RA78K0R error E3405: Undefined symbol '_@SEGAX' in file 'DefaultBuild\r_cg_adc_user.rel'RA78K0R error E3405: Undefined symbol '_@SEGDE' in file 'DefaultBuild\r_cg_adc_user.rel'RA78K0R error E3405: Undefined symbol '_@RTARG0' in file 'DefaultBuild\r_cg_adc_user.rel'RA78K0R error E3405: Undefined symbol '_@SEGAX' in file 'DefaultBuild\r_cg_timer_user.rel'RA78K0R error E3405: Undefined symbol '_@SEGDE' in file 'DefaultBuild\r_cg_timer_user.rel'RA78K0R error E3405: Undefined symbol '_@RTARG0' in file 'DefaultBuild\r_cg_timer_user.rel'
質問としては、
Q1:実際には、どういう手順で標準ライブラリを抑止設定するのか
Q2:使用した場合、標準ライブラリの何が使用されているかの確認するにはどういう手順で確認出来るのか
です。
抑止目的は、
- 余分なエリアを確保させない
- 自分で制御出来ないライブラリを使用しない
ご存じの方、ご教授いただけると幸いです。
A1:スタートアップルーチンから呼ばれる標準ライブラリ内の関数があるため、それらを独自に実装するか、スタートアップルーチンの使用も止めるかのどちらかになると思います。
A2:プロジェクトの「ファイル」の下の「ビルド・ツール生成ファイル」の中に「プロジェクト名.map」というファイルが生成されるので、それを参照することで確認できます。
ご教授有り難うございます。
Q1に関してですが、既存のスタートアップを使用するが、標準ライブラリだけを抑止することはできないのでしょうか?
※使わないライブラリを独自に実装する必要も無いので。
Q2に関しまして、mapファイルは日頃から見ているのですが、どれが標準ライブラリにあたるかがわかりません。
無いので出てこないだけかもしれませんが、参考例などありますでしょうか?
Q1に関してですが、既存のスタートアップを使用するが、標準ライブラリだけを抑止することはできないのでしょうか? ※使わないライブラリを独自に実装する必要も無いので。
A1で書いてる通り、「スタートアップルーチンから呼ばれる標準ライブラリ内の関数があるため、それらを独自に実装」すれば可能です。
「標準ライブラリを使用する」→「いいえ」でとりあえずリンクは成功するよう独自実装した例:
main.c:
void main() { #asm public _?DATA,_?R_INIT,_?DATS,_?R_INIS,_?DATAL,_?RLINIT _?DATA: _?R_INIT: _?DATS: _?R_INIS: _?DATAL: _?RLINIT: #endasm } void stkinit() { } void hdwinit() { } void exit() { }
※実際には各シンボルの機能を理解し適切に実装する必要があります。
あとライブラリについての誤解があるようですが、プログラムで使われない機能はリンクされないため実装する必要はありません。
Q2に関しまして、mapファイルは日頃から見ているのですが、どれが標準ライブラリにあたるかがわかりません。 無いので出てこないだけかもしれませんが、参考例などありますでしょうか?
新規プロジェクトに下記のmain()だけを書き、
void main() { }
「標準のスタートアップを使用する」「標準ライブラリを使用する」をそれぞれ「はい」(初期値)でビルドして生成された.mapファイルの一部抜粋が下記ですが、
MEMORY=ROM BASE ADDRESS=00000H SIZE=04000H OUTPUT INPUT INPUT BASE SIZE SEGMENT SEGMENT MODULE ADDRESS @@VECT00 00000H 00002H CSEG AT @@VECT00 @cstart 00000H 00002H @@CNST 00002H 00000H CSEG UNITP @@CNST @cstart 00002H 00000H @@CNST main 00002H 00000H @@CNSTL 00002H 00000H CSEG PAGE64KP @@CNSTL @cstart 00002H 00000H @@CNSTL 00002H 00000H CSEG PAGE64KP @@CNSTL main 00002H 00000H @@R_INIT 00002H 00000H CSEG UNIT64KP @@R_INIT @cstart 00002H 00000H @@R_INIT main 00002H 00000H @@R_INIT @rom 00002H 00000H @@RLINIT 00002H 00000H CSEG UNIT64KP @@RLINIT @cstart 00002H 00000H @@RLINIT main 00002H 00000H @@RLINIT @rom 00002H 00000H @@R_INIS 00002H 00000H CSEG UNIT64KP @@R_INIS @cstart 00002H 00000H @@R_INIS main 00002H 00000H @@R_INIS @rom 00002H 00000H @@CALT 00002H 00000H CSEG @@CALT @cstart 00002H 00000H @@CALT main 00002H 00000H * gap * 00002H 000BEH ?CSEGOB0 000C0H 00004H CSEG OPT_BYTE @@CODE 000C4H 00000H CSEG BASE @@CODE main 000C4H 00000H @@BASE 000C4H 00000H CSEG BASE @@BASE main 000C4H 00000H ?CSEGSI 000C4H 0000AH CSEG @@LCODE 000CEH 000ADH CSEG BASE @@LCODE @cstart 000CEH 000ADH @@CODEL 0017BH 00001H CSEG @@CODEL main 0017BH 00001H @@LCODEL 0017CH 00061H CSEG @@LCODEL @hdwinit 0017CH 00001H @@LCODEL @stkinit 0017DH 00044H @@LCODEL exit 001C1H 0001CH * gap * 001DDH 03E23H
この中のINPUT MODULEの列にモジュール名が書かれています。main が今回の main.c から生成されたユーザーモジュールであり、@cstart がスタートアップなのでそれ以外が標準ライブラリからリンクされたモジュールであることがわかります。アドレスの範囲は書かれてる通りなので、.sym ファイルやデバッガの逆アセンブル表示を見るとどのような関数等がリンクされてるかが確認できます。
fujita nozomu さま
詳細な解説有り難うございました。
実のところは自信がないのですがオリジナルのQ2への回答です。確信が持てればたいへんうれしいので教授をお願いします。.mapファイルだけでは標準ライブラリの関数がメモリーのどこに配置されているかだけなので、標準ライブラリのどの関数がどこで呼ばれていているかはfujitaさんの回答のとうり.mapと.symファイルの両方を見ることになりますが、CS+のツール→スタック見積もりツールの起動の方が見やすいのではないでしょうか?おそらく標準ライブラリも表示されると思います。
CS+のヘルプで「標準ライブラリ」で検索をすると関数リストがみれますが、ここは大丈夫ですか?以前は紙のマニュアルで確認しながらスタックサイズを手計算してたんですよね。CallWalk(スタックサイズ見積もりツール)さまさまです。
確かにスタック見積もりツールという手がありましたね(確かに確認しやすいです)。これもスタックの容量確保量の確認で使用してましたが、標準ライブラリという意識がありませんでした。
スタック見積もりツールを使って下記のプログラムを試してみました。
unsigned long fibonacci(unsigned long n) { switch (n) { case 0: return 0; case 1: return 1; default: return fibonacci(n - 1) + fibonacci(n - 2); } } void main() { fibonacci(10); }
プログラム中の関数 main()、fibonacci() の他に
がリンクされますが、スタック見積もりツールで確認できるのは main() と fibonacci() の他は @luadd のみのようです。
main()を
#include <stdlib.h> void main() { fibonacci(10); exit(0); }
と変更すれば exit() もスタック見積もりツールで確認できるようになりますが、main() 実行以前に暗黙的に実行されるスタートアップとそこから呼ばれている関数については表示はされないようです。
Breezeさん。ご教授ありがとうございます。また、確認の実施もありがとうございます。
やっぱりmain以下のスタックサイズのチャックですか。CS+とRL78は個人的な興味でとりあえず簡単なプログラムを作成して動作させただけで、実行時間やメモリサイズのチェックやその他の評価は具体的な話が出てからと思い省略してしまいました。
HEWでSHやH8のワークスペースを作成するとruntime標準ライブラリーは外すことができません。ワークスペースを作成する際にサイズを示してstackセクションを設定します。スタートアップのようなmainのさらに下側にある部分はこの領域を使用、あるいは、メモリ未使用だろうと思ってます。ルネサス以外の開発環境も検討したこともなく、どんどん下がっていくとロジック回路やトランジスタまで信用できなくなるので、統合開発環境のセットアップや標準ライブラリ内部を気にしたことがありません。むしろ用意されているものの方が圧倒的な実績で信頼性が高いと思ってます。
コンピュータのハードとソフトの境目に興味はあり、ミードの超LSIシステム入門は読んだことがあるのですが、すっかり忘れてしまっているので、再度勉強してみようかと思ってます。