RL78 の 標準ライブラリに関しまして

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:使用した場合、標準ライブラリの何が使用されているかの確認するにはどういう手順で確認出来るのか

です。

抑止目的は、

- 余分なエリアを確保させない

- 自分で制御出来ないライブラリを使用しない

です。

ご存じの方、ご教授いただけると幸いです。

Parents
  • Q1:実際には、どういう手順で標準ライブラリを抑止設定するのか

    A1:スタートアップルーチンから呼ばれる標準ライブラリ内の関数があるため、それらを独自に実装するか、スタートアップルーチンの使用も止めるかのどちらかになると思います。

    Q2:使用した場合、標準ライブラリの何が使用されているかの確認するにはどういう手順で確認出来るのか

    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()だけを書き、

    main.c:

    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(スタックサイズ見積もりツール)さまさまです。

Reply
  • 実のところは自信がないのですがオリジナルのQ2への回答です。確信が持てればたいへんうれしいので教授をお願いします。.mapファイルだけでは標準ライブラリの関数がメモリーのどこに配置されているかだけなので、標準ライブラリのどの関数がどこで呼ばれていているかはfujitaさんの回答のとうり.mapと.symファイルの両方を見ることになりますが、CS+のツール→スタック見積もりツールの起動の方が見やすいのではないでしょうか?おそらく標準ライブラリも表示されると思います。

    CS+のヘルプで「標準ライブラリ」で検索をすると関数リストがみれますが、ここは大丈夫ですか?以前は紙のマニュアルで確認しながらスタックサイズを手計算してたんですよね。CallWalk(スタックサイズ見積もりツール)さまさまです。

Children
  • 確かにスタック見積もりツールという手がありましたね(確かに確認しやすいです)。これもスタックの容量確保量の確認で使用してましたが、標準ライブラリという意識がありませんでした。

  • スタック見積もりツールを使って下記のプログラムを試してみました。

    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() の他に

    • _@cstart
    • @@luadd ※unsigned longの加算
    • hdwinit()
    • stkinit()
    • exit()

    がリンクされますが、スタック見積もりツールで確認できるのは 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システム入門は読んだことがあるのですが、すっかり忘れてしまっているので、再度勉強してみようかと思ってます。