こんにちは。NoMaYです。ウェブで調べ物をしていて気付いたのですが、RenesasさんはLLVM(今はGCCと並ぶ著名なフリーコンパイラ)にRL78をPortingしようとしているのかも、、、[llvm-dev] New LLVM backend for Renesas RL78 MCUSebastian Perta via llvm-dev llvm-dev at lists.llvm.org Wed Apr 1 10:26:05 PDT 2020 lists.llvm.org/pipermail/llvm-dev/2020-April/140546.html
NoMaYさん、こんにちは。情報ありがとうございます。上記のプログラムサイズは、ライブラリ分と実プログラム分の比率は大体どのような比率かわかりますでしょうか?
Stevieさん、こんにちは。NoMaYです。> ライブラリ分と実プログラム分の比率は大体どのような比率かわかりますでしょうか?明日以降になりますが、調べて、投稿しようと思います。
ありがとうございます!サイズ向けの最適化能力を見る場合はライブラリ分は除いた方がよいのかなと思いました。こちらもLLVMを試している所なので、情報があれば共有させて頂きますね
こんにちは。NoMaYです。ライブラリ分その他を除いた手元のソースから生成されたコードのサイズは以下の通りでした。手持ちのプログラムその2
LLVM-RL78 41,195 バイト@10.0.0.202107CC-RL 33,258 バイト@V1.10.00
なお、ライブラリ分その他を含んだサイズは以下の通りでした。(先日投稿した内容です。)手持ちのプログラムその2
LLVM-RL78 46,198 バイト@10.0.0.202107CC-RL 34,766 バイト@V1.10.00
以下、元データです。なお、マップファイル全体や生成されたリストファイルやダンプファイルを以下のzipファイルに固めてあります。rl78g14_llvm_rtosdemo_map_dump_20210804.zipLLVM-RL78(10.0.0.202107)の場合:手元のソースから生成されたコードのサイズ = (2c2 - d8) + (39c4 - 3820) + (d82a - 3acd) = a0eb = 41195 バイトmapファイルより抜粋
VMA LMA Size Align Out In Symbol...略... d8 d8 1ea 2 .lowtext d8 d8 0 2 <internal>:(.plt) d8 d8 4 1 ./src/FreeRTOS/Source/portable/Renesas/LLVMRL78/port.o:(.lowtext) d8 d8 4 1 _prvTaskExitError dc dc 47 1 ./src/FreeRTOS/Source/portable/Renesas/LLVMRL78/portasm.o:(.lowtext.vPortYield) dc dc 0 1 _vPortYield dc dc 0 1 _vSoftwareInterruptISR...略... 29a 29a 15 1 ./src/r_cg_serial_user.o:(.lowtext.u_wdt_interrupt) 29a 29a 15 1 _u_wdt_interrupt 2af 2af 13 1 ./src/r_cg_serial_user.o:(.lowtext._u_wdt_interrupt) 2af 2af 13 1 __u_wdt_interrupt 2c2 2c2 0 1 . = ALIGN ( 2 )...略... 3820 3820 aa84 4 .text 3820 3820 0 1 . = ALIGN ( 2 ) 3820 3820 ae 4 ./src/FreeRTOS_Demo/Full_Demo/RegTest.o:(.text) 3820 3820 0 1 _vRegTest1Task 3831 3831 0 1 .loop1 3878 3878 0 1 _vRegTest2Task 3889 3889 0 1 .loop2 38d0 38d0 f2 4 ./generate/start.o:(.text) 38d2 38d2 0 1 _PowerON_Reset...略... 39b4 39b4 0 1 __rl78_init 39bd 39bd 0 1 __rl78_fini 39c4 39c4 11 4 C:\Renesas\LLVM\RL78\10.0.0.202107\lib\clang\LLVM for Renesas RL78 10.0.0.202107\..\..\..\rl78\lib\s3\libc_nano.a(lib_a-memcpy.o):(.text) 39c4 39c4 11 1 _memcpy 39d8 39d8 13 4 C:\Renesas\LLVM\RL78\10.0.0.202107\lib\clang\LLVM for Renesas RL78 10.0.0.202107\..\..\..\rl78\lib\s3\libc_nano.a(lib_a-memset.o):(.text) 39d8 39d8 13 1 _memset 39ec 39ec f 4 C:\Renesas\LLVM\RL78\10.0.0.202107\lib\clang\LLVM for Renesas RL78 10.0.0.202107\..\..\..\rl78\lib\s3\libc_nano.a(lib_a-memchr.o):(.text) 39ec 39ec f 1 _memchr 39fc 39fc 24 4 C:\Renesas\LLVM\RL78\10.0.0.202107\lib\clang\LLVM for Renesas RL78 10.0.0.202107\..\..\..\rl78\lib\s3\libc_nano.a(lib_a-memmove.o):(.text) 39fc 39fc 24 1 _memmove 3a20 3a20 11 4 C:\Renesas\LLVM\RL78\10.0.0.202107\lib\clang\LLVM for Renesas RL78 10.0.0.202107\..\..\..\rl78\lib\s3\libc_nano.a(lib_a-strcmp.o):(.text) 3a20 3a20 11 1 _strcmp 3a34 3a34 d 4 C:\Renesas\LLVM\RL78\10.0.0.202107\lib\clang\LLVM for Renesas RL78 10.0.0.202107\..\..\..\rl78\lib\s3\libc_nano.a(lib_a-strcpy.o):(.text) 3a34 3a34 d 1 _strcpy 3a44 3a44 b 4 C:\Renesas\LLVM\RL78\10.0.0.202107\lib\clang\LLVM for Renesas RL78 10.0.0.202107\..\..\..\rl78\lib\s3\libc_nano.a(lib_a-strlen.o):(.text) 3a44 3a44 b 1 _strlen 3a50 3a50 1b 4 C:\Renesas\LLVM\RL78\10.0.0.202107\lib\clang\LLVM for Renesas RL78 10.0.0.202107\..\..\..\rl78\lib\s3\libc_nano.a(lib_a-strncat.o):(.text) 3a50 3a50 1b 1 _strncat 3a6c 3a6c 16 4 C:\Renesas\LLVM\RL78\10.0.0.202107\lib\clang\LLVM for Renesas RL78 10.0.0.202107\..\..\..\rl78\lib\s3\libc_nano.a(lib_a-strncmp.o):(.text) 3a6c 3a6c 16 1 _strncmp 3a84 3a84 14 4 C:\Renesas\LLVM\RL78\10.0.0.202107\lib\clang\LLVM for Renesas RL78 10.0.0.202107\..\..\..\rl78\lib\s3\libc_nano.a(lib_a-strncpy.o):(.text) 3a84 3a84 14 1 _strncpy 3a98 3a98 26 4 C:\Renesas\LLVM\RL78\10.0.0.202107\lib\clang\LLVM for Renesas RL78 10.0.0.202107\rl78\s3\lib\baremetal\libclang_rt.builtins-rl78.a(mulsi3.S.obj):(.text) 3a98 3a98 0 1 __COM_lmul 3a98 3a98 0 1 ___mulsi3 3ac0 3ac0 d 4 C:\Renesas\LLVM\RL78\10.0.0.202107\lib\clang\LLVM for Renesas RL78 10.0.0.202107\rl78\s3\lib\baremetal\libclang_rt.builtins-rl78.a(ashlhi3.S.obj):(.text) 3ac0 3ac0 0 1 ___ashlhi3 3acd 3acd 5 1 ./src/frtos_startup/freertos_helper.o:(.text.__malloc_r) 3acd 3acd 5 1 __malloc_r 3ad2 3ad2 4 1 ./src/frtos_startup/freertos_helper.o:(.text.__free_r) 3ad2 3ad2 4 1 __free_r 3ad6 3ad6 5 1 ./src/frtos_startup/freertos_helper.o:(.text.__realloc_r) 3ad6 3ad6 5 1 __realloc_r 3adb 3adb 2f 1 ./src/frtos_startup/freertos_helper.o:(.text._vTaskNotifyGiveFromISR_R_Helper) 3adb 3adb 2f 1 _vTaskNotifyGiveFromISR_R_Helper...略... d819 d819 11 1 ./src/r_main.o:(.text._main) d819 d819 11 1 _main d82a d82a 42 1 C:\Renesas\LLVM\RL78\10.0.0.202107\lib\clang\LLVM for Renesas RL78 10.0.0.202107\..\..\..\rl78\lib\s3\libc_nano.a(lib_a-sprintf.o):(.text._sprintf) d82a d82a 42 1 _siprintf d82a d82a 42 1 _sprintf d86c d86c 112 1 C:\Renesas\LLVM\RL78\10.0.0.202107\lib\clang\LLVM for Renesas RL78 10.0.0.202107\..\..\..\rl78\lib\s3\libc_nano.a(lib_a-nano-svfprintf.o):(.text.___ssputs_r) d86c d86c 112 1 ___ssputs_r d97e d97e 2a0 1 C:\Renesas\LLVM\RL78\10.0.0.202107\lib\clang\LLVM for Renesas RL78 10.0.0.202107\..\..\..\rl78\lib\s3\libc_nano.a(lib_a-nano-svfprintf.o):(.text.__svfprintf_r) d97e d97e 2a0 1 __svfiprintf_r d97e d97e 2a0 1 __svfprintf_r dc1e dc1e 13 1 C:\Renesas\LLVM\RL78\10.0.0.202107\lib\clang\LLVM for Renesas RL78 10.0.0.202107\..\..\..\rl78\lib\s3\libc_nano.a(lib_a-nano-svfprintf.o):(.text._OUTLINED_FUNCTION_0) dc1e dc1e 13 1 _OUTLINED_FUNCTION_0 dc31 dc31 a 1 C:\Renesas\LLVM\RL78\10.0.0.202107\lib\clang\LLVM for Renesas RL78 10.0.0.202107\..\..\..\rl78\lib\s3\libc_nano.a(lib_a-nano-svfprintf.o):(.text._OUTLINED_FUNCTION_1) dc31 dc31 a 1 _OUTLINED_FUNCTION_1 dc3b dc3b f 1 C:\Renesas\LLVM\RL78\10.0.0.202107\lib\clang\LLVM for Renesas RL78 10.0.0.202107\..\..\..\rl78\lib\s3\libc_nano.a(lib_a-nano-svfprintf.o):(.text._OUTLINED_FUNCTION_2) dc3b dc3b f 1 _OUTLINED_FUNCTION_2 dc4a dc4a c 1 C:\Renesas\LLVM\RL78\10.0.0.202107\lib\clang\LLVM for Renesas RL78 10.0.0.202107\..\..\..\rl78\lib\s3\libc_nano.a(lib_a-nano-svfprintf.o):(.text._OUTLINED_FUNCTION_3) dc4a dc4a c 1 _OUTLINED_FUNCTION_3 dc56 dc56 a 1 C:\Renesas\LLVM\RL78\10.0.0.202107\lib\clang\LLVM for Renesas RL78 10.0.0.202107\..\..\..\rl78\lib\s3\libc_nano.a(lib_a-nano-svfprintf.o):(.text._OUTLINED_FUNCTION_4) dc56 dc56 a 1 _OUTLINED_FUNCTION_4 dc60 dc60 8 1 C:\Renesas\LLVM\RL78\10.0.0.202107\lib\clang\LLVM for Renesas RL78 10.0.0.202107\..\..\..\rl78\lib\s3\libc_nano.a(lib_a-nano-svfprintf.o):(.text._OUTLINED_FUNCTION_5) dc60 dc60 8 1 _OUTLINED_FUNCTION_5 dc68 dc68 8 1 C:\Renesas\LLVM\RL78\10.0.0.202107\lib\clang\LLVM for Renesas RL78 10.0.0.202107\..\..\..\rl78\lib\s3\libc_nano.a(lib_a-nano-svfprintf.o):(.text._OUTLINED_FUNCTION_6) dc68 dc68 8 1 _OUTLINED_FUNCTION_6 dc70 dc70 8 1 C:\Renesas\LLVM\RL78\10.0.0.202107\lib\clang\LLVM for Renesas RL78 10.0.0.202107\..\..\..\rl78\lib\s3\libc_nano.a(lib_a-nano-svfprintf.o):(.text._OUTLINED_FUNCTION_7) dc70 dc70 8 1 _OUTLINED_FUNCTION_7 dc78 dc78 6 1 C:\Renesas\LLVM\RL78\10.0.0.202107\lib\clang\LLVM for Renesas RL78 10.0.0.202107\..\..\..\rl78\lib\s3\libc_nano.a(lib_a-nano-svfprintf.o):(.text._OUTLINED_FUNCTION_8) dc78 dc78 6 1 _OUTLINED_FUNCTION_8 dc7e dc7e 1b8 1 C:\Renesas\LLVM\RL78\10.0.0.202107\lib\clang\LLVM for Renesas RL78 10.0.0.202107\..\..\..\rl78\lib\s3\libc_nano.a(lib_a-nano-vfprintf_i.o):(.text.__printf_common) dc7e dc7e 1b8 1 __printf_common de36 de36 449 1 C:\Renesas\LLVM\RL78\10.0.0.202107\lib\clang\LLVM for Renesas RL78 10.0.0.202107\..\..\..\rl78\lib\s3\libc_nano.a(lib_a-nano-vfprintf_i.o):(.text.__printf_i) de36 de36 449 1 __printf_i e27f e27f 7 1 C:\Renesas\LLVM\RL78\10.0.0.202107\lib\clang\LLVM for Renesas RL78 10.0.0.202107\..\..\..\rl78\lib\s3\libc_nano.a(lib_a-nano-vfprintf_i.o):(.text._OUTLINED_FUNCTION_0) e27f e27f 7 1 _OUTLINED_FUNCTION_0 e286 e286 7 1 C:\Renesas\LLVM\RL78\10.0.0.202107\lib\clang\LLVM for Renesas RL78 10.0.0.202107\..\..\..\rl78\lib\s3\libc_nano.a(lib_a-nano-vfprintf_i.o):(.text._OUTLINED_FUNCTION_1) e286 e286 7 1 _OUTLINED_FUNCTION_1 e28d e28d 6 1 C:\Renesas\LLVM\RL78\10.0.0.202107\lib\clang\LLVM for Renesas RL78 10.0.0.202107\..\..\..\rl78\lib\s3\libc_nano.a(lib_a-nano-vfprintf_i.o):(.text._OUTLINED_FUNCTION_2) e28d e28d 6 1 _OUTLINED_FUNCTION_2 e293 e293 a 1 C:\Renesas\LLVM\RL78\10.0.0.202107\lib\clang\LLVM for Renesas RL78 10.0.0.202107\..\..\..\rl78\lib\s3\libc_nano.a(lib_a-nano-vfprintf_i.o):(.text._OUTLINED_FUNCTION_3) e293 e293 a 1 _OUTLINED_FUNCTION_3 e29d e29d 6 1 C:\Renesas\LLVM\RL78\10.0.0.202107\lib\clang\LLVM for Renesas RL78 10.0.0.202107\..\..\..\rl78\lib\s3\libc_nano.a(lib_a-nano-vfprintf_i.o):(.text._OUTLINED_FUNCTION_4) e29d e29d 6 1 _OUTLINED_FUNCTION_4 e2a3 e2a3 1 1 . = ALIGN ( 2 ) e2a4 e2a4 0 1 .textf e2a4 e2a4 0 1 . = ALIGN ( 2 )...略...
CC-RL(V1.10)の場合:手元のソースから生成されたコードのサイズ = 24b + 7f9f = 81ea = 33258 バイト(10進)mapファイルより抜粋
SECTION START END SIZE ALIGN...略....text 00000273 000004bd 24b 1.RLIB 000004cb 000004e9 1f 1.SLIB 000004ea 00000aef 606 1...略....textf 00003912 0000b8b0 7f9f 1...略... SECTION=FILE= START END SIZE SYMBOL ADDR SIZE INFO COUNTS OPT...略...SECTION=.textFILE=.\generate\CallWalker\cstart.obj 00000273 000002bb 49 _start 00000273 0 entry,g 0...略... _u_wdt_interrupt@1 00000497 13 func ,l 0 __u_wdt_interrupt@1 000004aa 14 func ,l 1 chSECTION=.RLIBFILE=memcpy 000004cb 000004db 11 _memcpy 000004cb 0 none ,g 8FILE=memset 000004dc 000004e9 e _memset 000004dc 0 none ,g dSECTION=.SLIBFILE=sprintf_tiny 000004ea 000005a3 ba _sprintf_tiny 000004ea a2 func ,g 6 __REL_sp@1 0000058c 18 func ,l 2FILE=strcmp 000005a4 000005b4 11 _strcmp 000005a4 0 none ,g 1FILE=strcpy 000005b5 000005c1 d _strcpy 000005b5 0 none ,g 5FILE=strlen 000005c2 000005cc b _strlen 000005c2 0 none ,g dFILE=strncat 000005cd 000005e7 1b _strncat 000005cd 0 none ,g 4FILE=strncmp 000005e8 000005fd 16 _strncmp 000005e8 0 none ,g 1FILE=strncpy 000005fe 00000611 14 _strncpy 000005fe 0 none ,g 3FILE=_REL_print_tiny 00000612 00000ae5 4d4 __REL_print_tiny 00000612 41b func ,g 1 __CommonCode@17 00000a2d 6 func ,l 3 __CommonCode@16 00000a33 6 func ,l 5 __CommonCode@14 00000a39 a func ,l 4 __CommonCode@13 00000a43 9 func ,l 2 __CommonCode@12 00000a4c a func ,l 2 __CommonCode@11 00000a56 10 func ,l 2 __CommonCode@10 00000a66 f func ,l 2 __CommonCode@9 00000a75 12 func ,l 2 __CommonCode@8 00000a87 7 func ,l 2 __CommonCode@7 00000a8e 6 func ,l 3 __CommonCode@18 00000a94 8 func ,l 2 __CommonCode@6 00000a9c 7 func ,l 2 __CommonCode@15 00000aa3 3 func ,l 2 __CommonCode@5 00000aa6 3 func ,l 8 __CommonCode@4 00000aa9 9 func ,l 2 __CommonCode@3 00000ab2 1d func ,l 5 __CommonCode@2 00000acf 5 func ,l 6 __CommonCode@1 00000ad4 7 func ,l 5 __CommonCode@0 00000adb b func ,l 2FILE=isdigit 00000ae6 00000aef a _isdigit 00000ae6 0 none ,g 1...略...SECTION=.textfFILE=.\generate\CallWalker\cstart.obj 00003912 00003959 48 _INIT_BSS 00003912 0 none ,g 1 _INIT_DATA 00003931 0 none ,g 1 _exit 00003958 0 none ,g 2FILE=.\generate\CallWalker\resetprg.obj 0000395a 00003968 f _PowerON_Reset_PC 0000395a f func ,g 1 ch...略...FILE=.\src\UART3.obj 0000b7fc 0000b8b0 b5 _u_uart3_init_bf 0000b7fc 16 func ,g 1 ch _u_uart3_get_blk 0000b812 79 func ,g 1 ch _u_uart3_callback_receivedata 0000b88b 26 func ,g 1
中の人です。
コンパイラ開発チームに見解を確認しましたので、展開します。
CC-RLは長年の追加/改善によりリリース当初より大幅に最適化能力を向上させてきました。(ULPMark世界最高スコア獲得もこの最適化が貢献してます。)
LLVM for RL78も最適化能力は高いですが、プログラムにも因りますが、CC-RLと比較するとまだ差が大きいケースもあります。
今後、LLVM for RL78へも技術支援を行って最適化を強化していきたいと思います。
NoMaYさんが指摘されていたビット操作命令の問題やレジスタバンク0固定の問題にも技術支援を行わせて頂きました。ありがとうございました。
結果は7月修正版に反映されています。
NoMaYさんの上記データ&ファイルも参考にさせて頂きます。
今後もRulzあるいはCyberThorへの積極的なアクセスを頂けると助かります。
チョコです。
>CC-RLは長年の追加/改善によりリリース当初より大幅に最適化能力を向上させてきました。
そうなんですか。
私は、アセンブラの時代の人間ですが(実はハードの人間ですが)CC-RLの吐き出したコードを逆アセンブラで眺めて、「無駄なことをやっているなぁ」と感じていたんです。やはり、普通とは感覚がずれているのかなぁ。
こんにちは。NoMaYです。ものは試しとしてLLVM-RL78&C++&RL78スマートコンフィグレータ&Renesas RL78 Simulator&FreeRTOSという組み合わせのプロジェクトをe2 studio 2021-07で作ってみました。ソース一式はGitHubの以下の場所に置いてあります。(FreeRTOSのLLVM-RL78ポートレイヤは独自対応版です。FreeRTOSのカーネルソースはV10.4.4です。)github.com/NoMaY-jp/RL78_SmartConfigurator_examples_RL78FPB_LLVMRL78/tree/main/00_SimDebuggerConsole_printf/rl78g23_64p_fpb以下、e2 studioの画面コピーです。
こんにちは。NoMaYです。以前、(旧バージョンの)LLVM-RL78でビット操作命令を使ったコードが出力されていなかった件を書いたのですが、つい先日、RXマイコンのFITモジュールにおいてCソースが(ソースの書き方により)ビット操作命令を使ったコードに展開されていなかったことに起因する割り込み関連の不具合の不具合通知が出ていましたね。【注意事項】RX ファミリ SCI モジュールFirmware Integration Technology, RX Driver Packagewww.renesas.com/jp/ja/document/tnn/notes-rx-family-sci-module-firmware-integration-technology-rx-driver-package「1.3 内容と発生条件プログラムで調歩同期式R_SCI_Send() またはR_SCI_Receive() がコールされると、エラーが発生する可能性があります。特定の状況下では、不要な1バイトデータが送信されます。原因は調歩同期式の受信ルーチン中にコールされる非アトミックマクロDISABLE_RXI_INTとENABLE_RXI_INTの影響による、IENxビットのデータ破壊です。」[追記]まだFITモジュールのSCIモジュールのソースを再確認していないですけど、上記の2つのマクロがタスク切り替えに対して安全でないという以下の件はどうなのかな、、、e2 studio v7.5.0のFreeRTOS ProjectでVisual Expression+Renesas RX Simulator/TB-RX65Nで試せるSample Programを作ってみたjapan.renesasrulz.com/cafe_rene/f/forum21/5970/e2-studio-v7-5-0-freertos-project-visual-expression-renesas-rx-simulator-tb-rx65n-sample-program/34046#34046「RTOS未使用時は大丈夫だけれどもRTOS使用時は拙い排他制御のやり方(通常処理側と割り込み処理側の排他制御)・個別の割り込みマスクフラグを使用して割り込み一旦禁止と割り込み再度許可を行う理由・RTOSによるタスク切り替えが上記による割り込み禁止期間中に発生すると禁止期間がミリ秒オーダーになってしまう(タスク切り替えにより暫くの間は他タスクに行ってしまうから)対応・RTOS側で用意されているクリティカルセクションへの出入り関数(FreeRTOSならtaskENTER_CRITICAL()とtaskEXIT_CRITICAL()など)を使用するように手を加える」
こんにちは。NoMaYです。RL78/G15?(少ピン、少ROM/RAM、という製品ですかね。)以下、e2 studio 2022-10の画面コピーです。
こんにちは。NoMaYです。こんなページが出来ていました。コンパイラはLLVM-RL78ですね。ArduinoCore-rl78g15_fpb_20pgithub.com/renesas/ArduinoCore-rl78g15_fpb_20p[追記]Renesas Electronics RL78/G15 Low Power Microcontrollerswww.mouser.jp/new/renesas/renesas-rl78-g15-mcus/