こんにちは、しゅうです。
前回に引き続き、必要なプログラムファイルを用意していきます。でも1から書いていくのは結構大変なのでなるべく流用していきたいですね・・・
流用できそうなもの
次の表は過去の記事から引用しています。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 | ベクタ変数のヘッダ |
最初の3つのファイルに関しては前回の記事で既に作成しています(resetprg.cがstart.s、dbsct.cとstacksct.hがR5F5631M.ldにあたります)。この中で、sbrk.cとsbrk.hについてはsbrk関数が不要であれば必要がなく今回は使用しない方針です。typedefine.hも今回は使いませんが、そのまま使ってもコンパイルエラーはなさそうです。
ということで、今回はintprg.c・iodefine.h・vecttbl.c・vect.hの4つのファイルを流用します。そのままではコンパイルはできないので修正を加えていきます。
intprg.c
こちらはほぼそのまま使えます。次の画像のように修正箇所は使わないmachine.hをコメントアウトするのと、#pragmaをコメントアウトするところです。
この#pragmaは環境に依存する指示で、コンパイラに指示を送っています。今回のGCC環境ではエラーが出るのでコメントアウトしています。また、後々本格的に迷路探索などのプログラムを組み込む際にextern void int_cmt(void)のように割り込み関数を追加していきます!
iodefine.h
こちらも#pragmaの部分をコメントアウトしていきます。ここでコメントアウトして#pragmaの1つがbit_order leftとしています。これはビットフィールドの順番を左詰にして並べて、という命令になります。今回のGCC環境では右詰となっているため、順番を逆にしなければなりません。次の画像(左が修正後、右が修正前)はその一部を示しており、unionのstruct { … } BIT;の中の順番を逆にしています。めちゃめちゃたくさんあります・・・!10000行あたりからのenumや#defineに関しては順番を変えなくても問題ありません。
vecttbl.c
vecttbl.cとvect.hの2つのファイルは結構修正していきます。ベクタは固定と可変の2種類ありますが、どちらも記述の仕方としては関数名を用意して配列にベクタのアドレスを入れれば良いです。
固定ベクタ
今回も#pragmaをコメントアウトします。これの代わりに次の2行を書き加え、固定と可変ベクタ用の配列のためのtypedefを定義しています。
#define FIXEDVECT_SECTION __attribute__ ((section (".fvectors"))) #define RELVECT_SECTION __attribute__ ((section (".rvectors"))) typedef void (*FUNC_PTR) (void);
ここで、__attribute__ ((section(“name”)))はGCCの環境に用いられている関数属性というものです。これによってnameがメモリ空間のどこにおかれるかをコンパイラに任せずにユーザが指定することができます。どこにおかれるかは環境設定ファイル(.ldファイル)に書きました。この後は次の画像のように編集していきます。
元々書かれていたvoid (*const Fixed_Vectors[])(void) = {をコメントアウトして、次の1行を書き足しています。
void* const Fixed_Vectors[] FIXEDVECT_SECTION = {
つまり固定ベクタの配置に関してはFixed_Vectors[]という配列で置いていきます。特に使わないアドレスに関してはDummyと書いて1つずつ埋めていきます。次の画像のようになります。PowerON_Reset_PCまでかけたら次は可変ベクタについて編集します。
可変ベクタ
vecttbl.cにCS+で生成されたvect.hからコピペします、Excep_BRK(vect=0)からExcep_IEB_IEBINT(vect=253)までです。その一部を次の画像に示します。Relocatable_Vectors[256]という配列で定義しています。
#pragmaをコメントアウトして、代わりにinterrupt(name(vect=XX))のnameをそのまま抜き出しましょう。vectの番号に関しては書かなくてもいいですが、Dummyのあとなどにコメントアウトで番号を振っておくと良いです。
そして最後に、このファイルのしたから14行ほどは使わないのでコメントアウトしましょう。
vect.h
こちらでは__attribute__((interrupt))という関数属性を使っています。これにより「この関数は割り込みようです」という定義ができます。これで#pragmaをコメントアウトして次のように修正していくことが可能です。
#define __INTERRUPT_FUNC __attribute__ ((interrupt)) //Exception (Supervisor Instruction) //#pragma interrupt (Excep_SuperVisorInst) void Excep_SuperVisorInst(void) __INTERRUPT_FUNC ;
残りの#pragmaについても同様に(沢山ありますが)修正していきましょう。
そして残すはmain.cとmakefileだけです。
まとめ
前回と今回で、必要なプログラムを用意することができました。流用したとはいえ修正する箇所が沢山ありましたね。。。
次回はmain.cとmakefileを用意してコンパイルして書き込みます!!