MacでルネサスのRX631マイコンの開発〜GCC環境で用意するファイル〜


こんにちわ、青木です。

まだまだ個人的に進めていたプロジェクト「MacでRXマイコンの開発環境を構築する」が続きます。

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

第5回目は、GCC環境に必要なファイルの紹介とGCC用にカスタマイズしないといけないファイルについて説明します。
ここで目指すMacでRX631環境の構築は、今までの資産を可能な限り流用し開発時間を短くすることです。つまり、今までCS+で開発してきたマイクロマウスのプログラムを可能な限り修正せずに流用することが大きな目標となります。

まずは、CS+の環境で新規のプロジェクトを作るときに生成されるファイルの確認をします。これ以外のファイルは、ユーザーが追加したファイルとなります。
生成させるファイルは、以下のものです。
 resetprg.c・・・初期設定ルーチン (リセットベクタ関数)
 dbsct.c・・・セクションの初期化処理(テーブル)
 stacksct.h・・・スタックサイズの設定
 intprg.c・・・ベクタ関数の定義
 sbrk.c・・・低水準インタフェースルーチン(sbrk関数)
 sbrk.h・・・低水準インタフェースルーチン(sbrk関数のヘッダ)
 main.c・・・main関数
 typedefine.h・・・型定義ヘッダ
 iodefine.h・・・内蔵周辺I/Oレジスタ定義
 vecttbl.c・・・固定ベクタテーブル
 vect.h・・・ベクタ関数のヘッダ

resetprg.cに関しては前回紹介したスタートアップのファイルです。そのほかのファイルは、そのまま使えそうな気がしますが、いろいろと落とし穴があります。

dbsct.c(セクションの初期化処理)は、GCC環境では環境設定ファイルに記述します。GNUtoolsのサンプルプログラムでは”Rx62t_led_flasher.ld”のxxx.ldファイルが環境設定ファイルになります。クロスコンパイラを作成したディレクトリにも同じようなrx.ldファイルがあります。このファイルの修正に関しては、後日紹介します。

stacksct.h(スタックサイズの設定)、割り込みスタックのサイズとユーザスタックのサイズが記述されています。GCC環境では、スタートアップのファイルで設定しています。実際の値はxxx.ldファイル内で記述しています。

intprg.c(ベクタ関数の定義)は、ほぼそのまま使えます。使えないところはコンパイラ指示の#pragmaです。#pragmaは、コンパイラに対して特殊なことをするように伝える役割をしています。#pragmaは環境依存であるため、コンパイラによって使えないことがあります。今回のGCC環境では、エラーとなってしまったので、コメントアウトしています。修正したものを下記に示します。左が修正前、右が修正後となります。修正後のファイルは、実際マイクロマウスで使用しているファイルなので余分なものもありますが・・・気にしないでください。#include machine.hでもエラーになり、ここでは使っていないのでコントアウトしています。

sbrk.c、sbrk.h(低水準インタフェースルーチン)ファイルは、sbrk関数を使わなければ不要なので、今回は、使用しない方針です。

typedefine.h(型定義ヘッダ)ファイルは、使っていないのでなんともいえませんが、そのまま使えると思います。

iodefine.h(内蔵周辺I/Oレジスタ定義)は、行数が多いですが、修正する内容は簡単です。ここでも#pragmaでエラーとなったため、コメントアウトしてGCCのエラーを回避しています。コメントアウトしてエラーは回避できるのですが、ただコメントアウトしてしまうとiodefine.hがそのまま使えないという問題がありました。その問題になったのは、#pragam bit_order leftのビットフィールドの順番でした。C言語は、アドレス管理をリンカがするので特にユーザーは気にせずにプログラミングすることができますが、レジスタに直接アクセスする場合、レジスタのアドレスとそのレジスタのビットの並びを気にする必要があります。レジスタのアドレスは、byte単位で管理されているため問題にならないのですが、ビットに関しては、ビルドによっては、ビットフィールドの並びが右からなのか左からなのか決まっていません。CS+は左詰、GCC環境は右詰となっており、すべて書き直しをしました。書き直した一部を以下に示します。unionの中にあるビットフィールドが上下逆になっているのがわかりますでしょうか。

vecttbl.c(固定ベクタテーブル)は、かなり手を加えています。

vect.h(ベクタ関数のヘッダ)も変更しています。

ベクタのところは、いろいろ変更しているので、次回修正した内容を説明します。


Posted in 技術情報