SH/TinyにHOS-V4を載せよう TASK1 [HOS]
さて開発キットを注文したはいいが、直ぐに来る訳でもないし、その間にHOS-V4でも実装してみましょう。
重要!スロット不当命令の仕様変更に伴う、カーネルのCPU依存部の改造
ハードウエアマニュアルの5.8.4を参考にして下さい。従来のSH2からSH/Tinyとなってスロット不当命令に該当する命令に変更がなされています。
この変更の影響を、カーネルソースコードのCPU依存部のpacctx.srcの中の何箇所かで受けています。
具体的にはステータスレジスタへのロード命令
ldc r0,sr
を遅延スロットに使う事が出来ないので、遅延スロットにこれを使っている所全てを修正します。
例えば従来
rts ldc r0, sr
だったのを、
ldc r0, sr rts nop
とします。
これはGCCを使った場合にも該当します。
カーネルのCPU依存部の改造
ここからは従来通りのCPU別依存部の修正です。
やる事はカーネルのCPU依存部、具体的にはCPUコアの変更は無いのだからsrc/sh/sh2htに有るHOSソースのpacctx.srcには手を付けず、pacint.srcにSH2/7125で使用する割り込みベクターに対応する改造を行います。うわ!このマイコン、小さいくせにベクター番号が227まで有るんですね。スカスカですが。
_hos_vecter224: mov.l r4, @-r15 bra int_handler mov #224,r4 _hos_vecter225: mov.l r4, @-r15 bra int_handler mov #225,r4 _hos_vecter226: mov.l r4, @-r15 bra int_handler mov #226,r4 _hos_vecter227: mov.l r4, @-r15 bra int_handler mov #227,r4
簡単だが煩雑な作業を終了し修正が完了しましたら、カーネルの再構築を行います。
アプリケーションの割り込みベクターテーブルの修正
次にアプリケーション用のプロジェクトを作成し、そのプロジェクトファイルの一部に割り込みベクター用ファイル(vector.src)を用意しますが、これらはHOSのサンプルプログラムとして提供されている物を流用するのが一番楽な訳で、左のリンクの「Interface付属SH2基板のSRAM有り/無しデバックモニタとHOS-V4同梱バージョン」辺りに入っているSH2/7144用のプロジェクトファイルから持ってきて下さい。
カーネル再構築でやったように、必要なコードの追加や、不要なコードの削除を行います。
あまりにも面倒になったので、簡単なベクターテーブル生成ツールを作成しています。
.ORG VECT + 216 * 4 .data.l _hos_vecter216 ;_hos_vecter216 ;ERI_0 .data.l _hos_vecter217 ;_hos_vecter217 ;RXI_0 .data.l _hos_vecter218 ;_hos_vecter218 ;TXI_0 .data.l _hos_vecter219 ;_hos_vecter219 ;TEI_0 .data.l _hos_vecter220 ;_hos_vecter220 ;ERI_1 .data.l _hos_vecter221 ;_hos_vecter221 ;RXI_1 .data.l _hos_vecter222 ;_hos_vecter222 ;TXI_1 .data.l _hos_vecter223 ;_hos_vecter223 ;TEI_1 .data.l _hos_vecter224 ;_hos_vecter224 ;ERI_2 .data.l _hos_vecter225 ;_hos_vecter225 ;RXI_2 .data.l _hos_vecter226 ;_hos_vecter226 ;TXI_2 .data.l _hos_vecter227 ;_hos_vecter227 ;TEI_2
アプリケーションのC Runtime Routineの修正
やはり先のSH2/7144用のcrt0.cを修正して使います。
うーん、このファイルは以下の所くらいですね。
#define INTERNAL_RAM_ADDR (volatile char *)0xFFFFA000 #define INTERNAL_RAM_SIZE (0x2000 - 16)
内部で呼んでいる「BusInit()」が有るファイルを開いて、BusInitの中身にCPUクロック(Iφ)、バスクロック(Bφ)、周辺クロック(Pφ、MPφ)の設定等を行います。
void BusInit( void ) { CPG.FRQCR.WORD = 0x16db; /*Iφ=48MHz、Bφ=24MHz、Pφ=24MHz、MPφ=24MHz*/ }
システムコンフィギュレーションファイル(system.cfg)の修正
まあこれはそれぞれユーザー毎にカーネルオブジェクトの構成が違うので一律にどうこうと言う部分は少ないのですが、割り込みスタックの初期値と、割り込み番号の最大、最小くらいでしょうか。一応参考まで。
HOS_IDL_STK(256,NULL); /*IDEL時のスタック領域*/ HOS_INT_SP(0xFFFFC000); /*割込み時のスタックの初期値*/ HOS_MAX_TPRI(8); /* 最大優先度(省略時 16) */ HOS_TIM_TIC(1,1); /* タイムティックの設定(省略時 1/1 ) */ HOS_MIN_INTNO(64); /* 割り込み番号の最小値(省略時 0) */ HOS_MAX_INTNO(227); /* 割り込み番号の最大値(省略時 0) */ /* インクルードファイルの指定 */ INCLUDE("\"hos_7125.h\""); /* 初期化ルーチンの追加 */ ATT_INI({TA_HLNG, 0, CMT0_Init}); ATT_INI({TA_HLNG, 0, Initialize}); /* 割り込みハンドラ */ ATT_ISR({TA_HLNG, 0, 184, CMT0_Int}); /* タスク */ CRE_TSK(TID_TSK1,{TA_HLNG | TA_ACT, 1, tasks, 1, 256,NULL}); CRE_TSK(TID_TSK2,{TA_HLNG | TA_ACT, 2, tasks, 1, 256,NULL}); CRE_TSK(TID_TSK3,{TA_HLNG | TA_ACT, 3, tasks, 1, 256,NULL}); CRE_TSK(TID_TSK4,{TA_HLNG | TA_ACT, 4, tasks, 1, 256,NULL}); /* セマフォ */ CRE_SEM(SEMID_SCI1, {TA_TFIFO, 1, 1}); /*SCI1の競合を避ける*/
動かしてみよう
もちろん上記以外の修正、例えばタイマーの設定とか、シリアルの設定とか、それぞれCPUに合わせて適宜変更を入れますが、面倒なのでそこまでは書きません。
左のリンクのSH2/7144(CQ7144)用のそれを、SH/Tiny用にアレンジして動かした物が左の図です。タスクが同時に4本走っているのが判ります。
これが動けば!あとはガンガン前に進むのみです。
コメント 0