RXマイコンの開発環境をアップグレード
気がつくと、gcc は 10.1.0 がリリースされており、RX マイコンも RXv3 コアがリリースされた事などから、そろそろ、開発環境を見直す時期なのかもしれない。
RX72N の RXv3 コアで大きく変わった事と言えば、倍精度の浮動小数点演算命令がサポートされた事だと思う。
※RXv3 コアでも、倍精度浮動小数点演算をサポートしない、RX66T、RX72T、などがあり多少複雑だ。
※他に、三角関数演算器が追加された。(ただ、この演算器については、使い方が隠蔽されており、実際に使える状態になるのは、メーカーのサポートが必要になると思われる。)
CC-RX では、当然サポートされるだろうけど、GNU-RX でサポートされるかは、今の処不明となっている。
※GNU-RX は gcc-4.8.x をベースにしており、本流のツリーにマージしていない事から、gcc でサポートされる可能性は非常に低いと考えられる。
それもあって、倍精度の命令を生成する仕組みを gcc に実装するにはどうしたら良いかを考え始め、情報を集めている。
binutils-2.34(アセンブラ)は、RXv3 の命令をアセンブル出来るようになっており、問題は無いものと思う。
まずは、binutils をアップグレード
今まで、binutils-2.30 を利用してきたが、このバージョンでは、RX マイコンの RXv3 で新設された命令をアセンブルする事が出来ない。
GNU assembler (GNU Binutils) 2.30
RX specific command line options:
--mbig-endian-data
--mlittle-endian-data [default]
--m32bit-doubles [default]
--m64bit-doubles
--muse-conventional-section-names
--muse-renesas-section-names [default]
--msmall-data-limit
--mrelax
--mpid
--mint-register=<value>
--mcpu=<rx100|rx200|rx600|rx610|rxv2>
--mno-allow-string-insns
そこで、binutils-2.34 を使う
GNU assembler (GNU Binutils) 2.34
RX specific command line options:
--mbig-endian-data
--mlittle-endian-data [default]
--m32bit-doubles [default]
--m64bit-doubles
--muse-conventional-section-names
--muse-renesas-section-names [default]
--msmall-data-limit
--mrelax
--mpid
--mint-register=<value>
--mcpu=<rx100|rx200|rx600|rx610|rxv2|rxv3|rxv3-dfpu>
--mno-allow-string-insns
rxv3、rxv3-dfpu が追加されている。
C/C++ コンパイラは、gcc-7.5.0 を使う
現在、gcc-10.1.0 がリリースされているので、色々試してみたが・・・
gcc-9.x 系 ---> デバッグビルド(最適化 -O0 で、割り込みベクターを伴った関数で、gcc がストールする)
gcc-8.x 系 ---> デバッグビルド(最適化 -O0 で、割り込みベクターを伴った関数で、gcc がストールする)
gcc-7.5.0 ---> 問題無し
本来、gcc のストールは、フルバグレポートを送る必要があると思うが、レポートの作り方や送り方を調べるのは時間がかかりそうなので、それは追々対応してみたいと思う。
RX マイコンの専用コードは、6.4.0 とあまり変わらないが、とりあえず、7.5.0 をビルドして実行バイナリーの動作をテストしてみた。
※色々、テストしたが、7.5.0 が安定しているようだー
gcc version 7.5.0 (GCC)
The following options are target specific:
-fpu Enable the use of RX FPU instructions. This is
the default.
-m32bit-doubles Stores doubles in 32 bits. This is the default.
-m64bit-doubles Store doubles in 64 bits.
-mallow-string-insns Enables or disables the use of the SMOVF, SMOVB,
SMOVU, SUNTIL, SWHILE and RMPA instructions.
Enabled by default.
-mas100-syntax Generate assembler output that is compatible with
the Renesas AS100 assembler. This may restrict
some of the compiler's capabilities. The default
is to generate GAS compatible syntax.
-mbig-endian-data Data is stored in big-endian format.
-mcpu= Specify the target RX cpu type.
-mgcc-abi Enable the use of the old, broken, ABI where all
stacked function arguments are aligned to 32-bits.
-mint-register= Specifies the number of registers to reserve for
interrupt handlers.
-mjsr Always use JSR, never BSR, for calls.
-mlittle-endian-data Data is stored in little-endian format.
(Default).
-mlra Enable the use of the LRA register allocator.
-mmax-constant-size= Maximum size in bytes of constant values allowed
as operands.
-mpid Enables Position-Independent-Data (PID) mode.
-mrelax Enable linker relaxation.
-mrx-abi Enable the use the standard RX ABI where all
stacked function arguments are naturally aligned.
This is the default.
-msave-acc-in-interrupts Specifies whether interrupt functions should save
and restore the accumulator register.
-msim Use the simulator runtime.
-msmall-data-limit= Maximum size of global and static variables which
can be placed into the small data area.
-mwarn-multiple-fast-interrupts Warn when multiple, different, fast interrupt
handlers are in the compilation unit.
-nofpu Disable the use of RX FPU instructions.
newlib は、2.4.0 のままとした。
newlib は、バージョンを上げる場合に注意を要するので、無難な選択として、2.4.0(変更しない)とした。
RX フレームワークをビルドする。
コンパイラが出来たら、全体のプロジェクトをビルドする、まず「debug」ビルドからー
sh all_project_build.sh -debug clean
...
sh all_project_build.sh -debug
問題無い!
次にリリースビルド・・・
sh all_project_build.sh clean
...
sh all_project_build.sh
これも問題無い!、いくつかのバイナリーを実際に動かしてみたが、特に問題になるような動作は認められなかった。
gcc に倍精度命令を出力させる件は時間がかかりそうなので、調査を続ける事として、当面、開発環境は、これで行く事にする。
binutils-2.34
gcc-7.5.0
newlib-2.4.0
MSYS2 で作成した gcc のバイナリーをリンクにアップロードしてある。