こんにちわ、青木です。
個人的に進めていたプロジェクト「MacでRXマイコンの開発環境を構築する」がもう少し続きます。
過去の記事は、以下からアクセスできます。
第1回:クロスコンパイラを作るためのコンパイラを作る方法
第2回:RXマイコンのクロスコンパイラを作る方法
第3回:CS+のMAIN関数が実行されるまでの流れ
第4回:GCC環境のスタートアップファイルの作成
第5回:GCC環境で用意するファイルの作成
前回、GCC環境で用意するファイルを紹介しましたが、一部紹介しきれていないところがありましたので、今回は、紹介しきれなかったベクタファイル(vecttbl.cとvech.h)の修正内容を紹介します。環境設定ファイルxxx.ldは次回紹介します。
RX631のベクタは、固定ベクタと可変ベクタの2種類あります。固定ベクタは、アドレスが固定されており、変更することができません。例えばリセットのベクタアドレスは0xffff_fffcと固定されています。可変ベクタは、intbレジスタに可変ベクタの先頭アドレスを入れ、そのアドレスからベクタ番号を加算したアドレスに割り込み先のアドレスがある構造になっています。例えば、intbレジスタに0xffff_0000をセットとし、CMT0の割り込みベクタ28の場合は、0xffff_0000+28*4=0xffff_0070番地にあるアドレスにジャンプするというものです。
その辺りは、第3回の記事のルネサスのリンク先を見ていただけるとイメージがつかめると思います。
ベクタの動作は、関数ポインタ配列と同じ動作をしているので、同じように関数名を用意して配列に入れれば、同じ動作ができます。固定ベクタは、次のように記述しています。
__attribute__(( ))はGCCの環境に用いられているもので関数属性というものです。__attribute__((.section(“name”)))はnameというセクション名のコードをビルド任せではなくユーザーが指定したメモリ空間に置くことができます。固定ベクタは、0xffff_ffd0から開始されるので、__attribute__((.section( )))を使って固定ベクタの関数は、ここに置いてねとリンカに知らせています。.section( )のアドレスの設定は、次回のxxx.ldで紹介します。
ここでは、固定ベクタの配列名をFixed_Vectors[]としています。固定ベクタは、0xffff_ffd0から0xffff_fffcまで全てベクタが埋まっておらず、ベクタがないところは、Dummy関数を入れています。PowerOn_Reset_PCのベクタだけは、スタートアップファイルstart.s(詳細は第4回を参照)に”.global _PowerON_Reset_PC”の記述で外部で公開されているシンボルとして定義しています。PowerON_ResetがC言語の関数ではないので記述が少し違っています。
コメントアウトしているのでおそらくお気づきだと思いますが、このファイルはCS+で生成されるvecttbl.cを修正して作っています。
次に可変ベクタですが、可変ベクタも同じように記述します。
ここでは、可変ベクタの配列名をRelocatable_Vectors[]としています。固定ベクタと同じように記述します。CS+のvecttbl.cには可変ベクトのテーブルの記述がないため、CS+で生成されるvect.hからコピーして作成しました。ベクタ番号が連番ではないところもあり、vect.hからコビーしたベクタ番号を消さずにコメントアウトして間違えにくいようにしています。
最後にvect.hは割り込み関数の羅列だけなのですが、ここでも__attribute__((interrupt))の関数属性を使ってこれらの関数は、「割り込みで使用します」と定義します。
割り込みの関数で高速割り込み(優先レベルを15)にした場合、割り込み前のところに戻る時に通常ではアセンブル言語でRTE命令で戻るところをRTFI命令で戻る必要があり、普通の関数とはちょっと違ったことをする必要があるので、関数属性を使う必要があります。
次回は、環境設定ファイルxxx.ldの紹介をします。