RX MCUのROM/RAM usage sizeがRenesas QuickConnect IoTのsample programでボロ負け(very worse than)している件(RA MCUやRL78 MCUに比べて)

こんにちは。NoMaYです。

ルネサスさんのクイックコネクトIoTのサンプルプログラムのドキュメントを見ていて気付いたのですけれども、サンプルプログラムでのRXマイコンの使用ROM/RAMサイズがRAマイコン/RL78マイコンと比べてボロ負け感のあるほど大量ですね、、、これは要調査ですね(数値はサンプルプログラムをビルドした素朴な結果ですかね)、、、

ROM / RAM (bytes)
            RX & CC-RX?        RA & GNUARM         RL78 & CC-RL?      RE & GNUARM
HS300x      24,863 / 7,941      6,164 / 1,740       4,046 / 100         74,472 / 7,560
FS2012      24,696 / 7,945      7,984 / 1,676       4,792 / 102         -

以下、HS300xサンプルソフトウェアマニュアルの画面コピーです。






[関連リンク]

RAファミリ、RXファミリ、RL78ファミリ、RE01 256KBグループ HS300xサンプルソフトウェアマニュアル
R01AN5897JJ0110 Rev.1.10 September 30.21
www.renesas.com/jp/ja/document/apn/hs300x-sample-application

RAファミリ、RXファミリ、RL78ファミリ FS2012 サンプルソフトウェアマニュアル
R01AN6047JJ0100 Rev.1.00 September 30.21
www.renesas.com/jp/ja/document/apn/fs2012-sample-application

センサソフトウェア ミドルウェア 製品ページ
www.renesas.com/jp/ja/software-tool/sensor-software
 

  • チョコです。

    RL78は小さなプログラムに対応した命令セット(アドレッシング)になっているから、小さなプログラムですむ範囲ならより効率的になるのではないでしょうか。

    それよりも、RL78では、ROM以上にRAMが少なくなっていますね。

    この結果だけ見ると、大は小を兼ねるとは言えないようですね。

  • こんにちは。NoMaYです。

    自分でビルドしてみました。MAPファイルとビルドログファイルを以下のzipファイルに固めて置いておきます。内容の検討は、これからです。

    r01an5897xx0110-hs300x_map_files_20211016.zip
    r01an5897xx0110-hs300x_map_files_20211017.zip    GNURXとGNURL78の分も追加しました
    HS300x_RX65N_NonOS.build.log
    HS300x_RX65N_NonOS.map
    HS300x_RA6M4_NonOS.build.log
    HS300x_RA6M4_NonOS.map
    HS300x_RL78G14_NonOS.build.log
    HS300x_RL78G14_NonOS.map
    HS300x_RX65N_FreeRTOS.build.log
    HS300x_RX65N_FreeRTOS.map
    HS300x_RA6M4_FreeRTOS.build.log
    HS300x_RA6M4_FreeRTOS.map
    HS300x_RX65N_NonOS_GCC.build.log
    HS300x_RX65N_NonOS_GCC.map
    HS300x_RL78G14_NonOS_GCC.build.log
    HS300x_RL78G14_NonOS_GCC.map
    HS300x_RX65N_FreeRTOS_GCC.build.log
    HS300x_RX65N_FreeRTOS_GCC.map

    NonOS版

    RX65N: e2 studio 2021-10 & CC-RX V3.03.00

    PROGRAM SECTION:  00005ba1 Byte(s)  23457 バイト(10進数)
    ROMDATA SECTION:  00000e7a Byte(s)   3706 バイト(10進数)
    RAMDATA SECTION:  00001f2d Byte(s)   7981 バイト(10進数)

     
    RA6M4: e2 studio 2021-10 & FSP V3.4.0 & GNU ARM Embedded 9.3.1 2020q2

       text    data     bss     dec     hex filename
       6684      20    1684    8388    20c4 HS300x_RA6M4_NonOS.elf

     
    RL78/G14: e2 studio 2021-10 & CC-RL V1.10.00

    PROGRAM SECTION:  00000d65 Byte(s)   3429 バイト(10進数)
    ROMDATA SECTION:  00000320 Byte(s)    800 バイト(10進数)
    RAMDATA SECTION:  00000060 Byte(s)     96 バイト(10進数)

     
    FreeRTOS版


    RX65N: e2 studio 2021-10 & CC-RX V3.03.00

    PROGRAM SECTION:  0000952c Byte(s)  38188 バイト(10進数)
    ROMDATA SECTION:  00000f2e Byte(s)   3886 バイト(10進数)
    RAMDATA SECTION:  0000705d Byte(s)  28765 バイト(10進数)

     
    RA6M4: e2 studio 2021-10 & FSP V3.4.0 & GNU ARM Embedded 9.3.1 2020q2

       text    data     bss     dec     hex filename
      20132      68    6140   26340    66e4 HS300x_RA6M4_FreeRTOS.elf

     
    [追記]

    GNURXとGNURL78の分も追加しました

    NonOS版

    RX65N: e2 studio 2021-10 & GNURX 8.3.0.202102

       text    data     bss     dec     hex filename
      49956    1104    7724   58784    e5a0 HS300x_RX65N_NonOS_GCC.elf

     
    RL78/G14: e2 studio 2021-10 & GNURL78 4.9.2.202103

       text    data     bss     dec     hex filename
       9816     146     110   10072    2758 HS300x_RL78G14_NonOS_GCC.elf

     
    FreeRTOS版

    RX65N: e2 studio 2021-10 & GNURX 8.3.0.202102

       text    data     bss     dec     hex filename
      75076    1132   28560  104768   19940 HS300x_RX65N_FreeRTOS_GCC.elf

     

  • こんにちは。NoMaYです。

    とりあえず(というか実は闇雲に)、HS300x_RX65N_NonOSプロジェクトでMemory Usageビューを開いてみました。(MAPファイルを直接見るよりは幾らか見易いでしょうか、、、)

    画面コピー(7枚)








     

  • こんにちは。NoMaYです。

    RAマイコンのソフトウェア開発プラットフォームのGNU ARM Embeddedプロジェクトでは、プロジェクト作成時のデフォルトの設定が、未使用の変数/関数を削除する最適化を行う、という設定になっています。そこで、CC-RXでも同様の最適化を施してみました。ただ、現状は、以下のスレッドにあるように単にコンパイルオプションを設定するだけでは効き目が弱いですので、セクション配置順とオブジェクトリンク順も一緒に調整して効き目を強めるようにしてみました。

    CC-RXの未使用の変数/関数を削除する最適化の効き目がGNURX/ICCRXより歴然と弱いのですが、、、
    japan.renesasrulz.com/cafe_rene/f/forum21/6403/cc-rx-gnurx-iccrx

    結果は以下の通りでした。

    r01an5897xx0110-hs300x_opt_map_files_20211017.zip
    HS300x_RX65N_NonOS.build.log
    HS300x_RX65N_NonOS.map
    HS300x_RX65N_FreeRTOS.build.log
    HS300x_RX65N_FreeRTOS.map

    NonOS版

    RX65N: e2 studio 2021-10 & CC-RX V3.03.00

    施術前

    PROGRAM SECTION:  00005ba1 Byte(s)  23457 バイト(10進数)
    ROMDATA SECTION:  00000e7a Byte(s)   3706 バイト(10進数)
    RAMDATA SECTION:  00001f2d Byte(s)   7981 バイト(10進数)

     
    施術後

    PROGRAM SECTION:  00004343 Byte(s)  17219 バイト(10進数)
    ROMDATA SECTION:  00000e0a Byte(s)   3594 バイト(10進数)
    RAMDATA SECTION:  00001b0d Byte(s)   6925 バイト(10進数)

     
    FreeRTOS版

    RX65N: e2 studio 2021-10 & CC-RX V3.03.00

    施術前

    PROGRAM SECTION:  0000952c Byte(s)  38188 バイト(10進数)
    ROMDATA SECTION:  00000f2e Byte(s)   3886 バイト(10進数)
    RAMDATA SECTION:  0000705d Byte(s)  28765 バイト(10進数)

     
    施術後

    PROGRAM SECTION:  00005e64 Byte(s)  24164 バイト(10進数)
    ROMDATA SECTION:  00000ec6 Byte(s)   3782 バイト(10進数)
    RAMDATA SECTION:  00006c29 Byte(s)  27689 バイト(10進数)

     
    以下、CC-RXプロジェクトの設定変更箇所の画面コピーです。(6枚)







     

  • こんにちは。NoMaYです。

    ここでまた(というか惰性かも?)、HS300x_RX65N_NonOSプロジェクトでMemory Usageビューを開いてみました。(CC-RXで未使用の変数/関数を削除する最適化を行った後のものです。)

    画面コピー(7枚)








     

  • NoMaYさん

    シェルティです。こんにちは。

    貴重なレポートありがとうございます。大変助かります。本件、開発チームまじえて議論中です。何らかの改善を施したいと考えています。今のところ以下抽出済です。

    ①RX環境のROMサイズは、BSPとIICバス制御のソフトが膨らんでいるのが原因

    ②RX環境のRAMサイズは、BSPが抱えるスタックが不必要な分量あるのが原因

    ③RX環境のROMサイズは、未使用シンボルがある場合削除する最適化項目がOFFになっていることが原因

    ④REファミリも調査を進める

    以上です

  • シェルティさん、こんにちは。NoMaYです。

    リプライありがとうございます。ところで、スタックサイズですけれど、今回のRAマイコンのプロジェクトでは以下の画面コピーの通り、NonOS版で1024バイト、FreeRTOS版で3072バイト、確保されていました。後者の場合に多く確保されている理由は分かりません。FreeRTOSを使うようなプロジェクトでは規模が大きく割り込み処理もスタック変数を多く使うし多重割り込みも良く使うということなのかも知れません、、、

    画面コピー(2枚)



     

  • こんにちは。NoMaYです。

    今回、以下の処置をしてみました。そうしたところ、FreeRTOS版でプログラムサイズの大小が逆転しましたね。(RX MCU+CC-RXの方がRA MCU+GNU ARM Embeddedより小さくなった!? これは追加調査が必要ですかね、、、)

    (1) BSPモジュールで使用するスタックはIスタックのみとする
    (1') Iスタックサイズは、NonOS版では1024バイト、FreeRTOS版では3072バイト、とする
    (2) ヒープサイズに関して後述の特記事項あり
    (3) printfサポートの下位階層ルーチンは除外する
    (4) Software Interruptサポートルーチンは除外する
    (5) RIICモジュールは除外する

    ヒープサイズに関する特記事項

    ・RXスマートコンフィグレータ/BSPモジュールではヒープ領域を明示的に変数として確保しますのでRAMサイズに計上されますが、GNUARMではヒープ領域は空きメモリに割り付けられていますのでRAMサイズに計上されません。

    なお、MAPファイルとビルドログファイルを以下のzipファイルに固めて置いておきます。また、この投稿の末尾にはCC-RXプロジェクトの設定変更箇所の画面コピー(2枚)とMemory Usageビューの画面コピー(7枚)もあります。

    r01an5897xx0110-hs300x_refactor_map_files_20211020.zip
    HS300x_RX65N_NonOS.build.log
    HS300x_RX65N_NonOS.map
    HS300x_RX65N_FreeRTOS.build.log
    HS300x_RX65N_FreeRTOS.map

    NonOS版

    RX65N: e2 studio 2021-10 & CC-RX V3.03.00

    施術前

    PROGRAM SECTION:  00005ba1 Byte(s)  23457 バイト(10進数)
    ROMDATA SECTION:  00000e7a Byte(s)   3706 バイト(10進数)
    RAMDATA SECTION:  00001f2d Byte(s)   7981 バイト(10進数)

     
    前回施術後

    PROGRAM SECTION:  00004343 Byte(s)  17219 バイト(10進数)
    ROMDATA SECTION:  00000e0a Byte(s)   3594 バイト(10進数)
    RAMDATA SECTION:  00001b0d Byte(s)   6925 バイト(10進数)

     
    今回施術後

    PROGRAM SECTION:  000025a0 Byte(s)   9632 バイト(10進数)
    ROMDATA SECTION:  0000082e Byte(s)   2094 バイト(10進数)
    RAMDATA SECTION:  00000c12 Byte(s)   3090 バイト(10進数)

     
    (参) RA6M4: e2 studio 2021-10 & FSP V3.4.0 & GNU ARM Embedded 9.3.1 2020q2

       text    data     bss     dec     hex filename
       6684      20    1684    8388    20c4 HS300x_RA6M4_NonOS.elf

     
    FreeRTOS版

    RX65N: e2 studio 2021-10 & CC-RX V3.03.00

    施術前

    PROGRAM SECTION:  0000952c Byte(s)  38188 バイト(10進数)
    ROMDATA SECTION:  00000f2e Byte(s)   3886 バイト(10進数)
    RAMDATA SECTION:  0000705d Byte(s)  28765 バイト(10進数)

     
    前回施術後

    PROGRAM SECTION:  00005e64 Byte(s)  24164 バイト(10進数)
    ROMDATA SECTION:  00000ec6 Byte(s)   3782 バイト(10進数)
    RAMDATA SECTION:  00006c29 Byte(s)  27689 バイト(10進数)

     
    今回施術後

    PROGRAM SECTION:  00004144 Byte(s)  16708 バイト(10進数) ← RX MCU+CC-RXの方がRA MCU+GNU ARM Embeddedより小さくなった?!
    ROMDATA SECTION:  000008f4 Byte(s)   2292 バイト(10進数)
    RAMDATA SECTION:  000061ae Byte(s)  25006 バイト(10進数)

     
    (参) RA6M4: e2 studio 2021-10 & FSP V3.4.0 & GNU ARM Embedded 9.3.1 2020q2

       text    data     bss     dec     hex filename
      20132      68    6140   26340    66e4 HS300x_RA6M4_FreeRTOS.elf ← RX MCU+CC-RXの方がRA MCU+GNU ARM Embeddedより小さくなった?!

     
    以下、CC-RXプロジェクトの設定変更箇所の画面コピー(2枚)とMemory Usageビューの画面コピー(7枚)です。











     

  • こんにちは。NoMaYです。

    今回、あえて未使用の変数/関数を削除する最適化を無効にしてプログラムサイズを比較したところ、ひとつの可能性として思い浮かんだのですが、同じソースに対してならはRX MCU+CC-RXはRA MCU+GNU ARM Embeddedの2/3ぐらいの小さいコードになるのでは?ということです。(なんというか、やはり、RX MCU+CC-RXでのルネサス クイックコネクトIoT センサミドルウェアの言わば土台の部分のサイズが大き過ぎて、その特質が表面に出られない状態なのかなぁ、と、、、)

                                NonOS版  FreeRTOS版  プログラムサイズ増加分(≒追加FreeRTOSソース分)
    RX MCU+CC-RX               12,421   27,296      14,875 ①
    RA MCU+GNU ARM Embedded    11,792   36,500      24,708 ②

    ① ÷ ② = 0.60 ≒ 2/3

     
    注1) いずれも、あえて未使用の変数/関数を削除する最適化を無効にした場合、でのプログラムサイズです
    注2) なお、その場合、RA MCU+GNU ARM Embeddedではリンクエラーが発生しますのでリンカスクリプトを修正しました

    以下、サイズ情報のコピペです。

    RX MCU+CC-RXでのNonOS版 (前回プロジェクトで未使用の変数/関数を削除する最適化を無効にした場合)

    PROGRAM SECTION:  00003085 Byte(s)  12421 バイト(10進数)
    ROMDATA SECTION:  00000892 Byte(s)   2194 バイト(10進数)
    RAMDATA SECTION:  00000c16 Byte(s)   3094 バイト(10進数)

     
    RX MCU+CC-RXでのFreeRTOS版 (前回プロジェクトで未使用の変数/関数を削除する最適化を無効にした場合)

    PROGRAM SECTION:  00006aa0 Byte(s)  27296 バイト(10進数)
    ROMDATA SECTION:  00000946 Byte(s)   2374 バイト(10進数)
    RAMDATA SECTION:  000065ba Byte(s) 26042 バイト(10進数)

     
    RA MCU+GNU ARM EmbeddedでのNonOS版 (未使用の変数/関数を削除する最適化を無効にした場合)

       text       data        bss        dec        hex    filename
      11792        416       1888      14096       3710    HS300x_RA6M4_NonOS.elf

     
    RA MCU+GNU ARM EmbeddedでのFreeRTOS版 (未使用の変数/関数を削除する最適化を無効にした場合)


       text       data        bss        dec        hex    filename
      36500        464       6344      43308       a92c    HS300x_RA6M4_FreeRTOS.elf