MacでルネサスのRX631マイコンの開発〜GCC環境の環境ファイルの作成〜


こんにちわ、青木です。

個人的に進めていたプロジェクト「MacでRXマイコンの開発環境を構築する」が今回を含めてあと2回でこの連載が終わります。

過去の記事は、以下からアクセスできます。
第1回:クロスコンパイラを作るためのコンパイラを作る方法
第2回:RXマイコンのクロスコンパイラを作る方法
第3回:CS+のMAIN関数が実行されるまでの流れ
第4回:GCC環境のスタートアップファイルの作成
第5回:GCC環境で用意するファイルの作成
第6回:GCC環境のベクタファィルの作成

環境設定ファイルxxx.ldを紹介するとビルドに必要なファイルは全て揃ったことになります。ビルドは、makefileと言われるスクリプトを作ると完成です。ビルトが終わると残りは、プログラムの転送になります。プログラムの転送は、次回紹介します。

環境設定ファイルは、GCC環境を構築した時に、prefix/rx-elf/lib/rx.ldが生成されています。これを修正してRX631の環境にします。左が、オリジナル、右がRX631用に修正したものです。

最初にMEMORY{ }の中身を修正します。オリジナルは一番大きいメモリサイズで記述されているので使い物になりません。RX631のハードウェアマニュアルのメモリマップをみてRAM、ROMの開始アドレスと終了アドレスを確認します。今回紹介しているRX631のRAMのサイズは64k、ROMのサイズは256kです。オリジナルには、STACKしかありませんが、修正後には、ユーザースタック(ustack)と割り込みスタック(istack)の2種類に分けています。CS+の環境がユーザーと割り込みに分かれていたので修正後の環境も分けています。スタックポインタは、スタックが増えるとアドレスがデクリメントの方向に進むので、指定するときは、最後のアドレスになります。それも、スタックが入ると設定したアドレスからその前のアドレスから開始されるのでISTACKは0x0000_FFFFではなく、0x0001_0000を指定しています。ISTACKは0x300byte使う予定なので、USTACKは0x0000_FD00を指定しています。USTACKは0x100byte使う予定なので、 RAMの最後は0x0000_FBFFとなり、RAMのサイズが0x0000_FC00となります。そのサイズをLENGTHに記述しています。
 ROMのサイズは、ROMの最後に固定ベクタが入るため、固定ベクタを除いたサイズを指定します。CS+を無償で使用するとコンパイルのサイズ制限(128kまで)がありますが、GCCの場合は、その制限がないため、マイコンにあるROMを全て使う事ができます。
 SECTIONS{ }にも、差分があります。KEEP(*(.init))、KEEP(*(.fini))はベクタ関連の記述です。ベクタは、CS+の環境をそのまま使えるように細工していますので、KEEP(*(.init))、KEEP(*(.fini))は使わないので削除しています。

そのほかに修正したのは、ベクタのところです。

オリジナルでは、ベクタの関数名をこのファイルで設定していますが、修正後は、別のファイルで設定しているため記述が異なっています。ベクタで注意するところは、固定ベクタ(.fvectors)は、0xFFFF_FFD0から開始されるので直接アドレスを記述していますが、可変ヘクタ(.rvectors)の方は、開始アドレスが決まっているわけではなく、ROM上に置くので、”>ROM”の指示でROM上のどこかにリンカーによって配置されています。配置されれば、vecttbl.cにある可変ベクタのRelocatable_Vectorsの配列のアドレスが決まり、そのアドレスが、スタートアップのstart.sでintbレジスタにセットされる仕組みになっています。
あと、stackのところもistackとustackに分けたので、記述も分けています。
makefileを紹介すると長くなりそうなので今回はここまでとします。


Posted in 技術情報