H8への移植がひと段落したけれど,実はH8のボードを買ったときについでに SH2のボードも買っていて,なんとなくSH2のマニュアルを見ていたのだけど, なんか割り込み周りとかSCIのレジスタとか,H8とほとんど同じなので, 実はKOZOS/H8をベースにしてSH2にもサクッと移植できてしまうのでは... と思ってSH2への移植をやってみた.
ターゲットボードは秋月電子の「AKI-7125マイコンボード」というもの. やはり完成品で,シリアルコネクタも実装済みなので半田づけは一切不要で 買ってきたその日からすぐ遊べる.値段も4800円なので個人レベルで買える金額だ. シリアル経由でフラッシュROMを書き換えできるのもH8と同じ. ついでに,電源にH8/3069Fで使った電源アダプタがそのまま使えてさらに嬉しい. (SH/7144のボードは電源電圧が3.3Vなので,H8/3069Fボードと電源アダプタを 共用できない)
このボードなのだけど,SH2の7125というCPUが載っている.SH2の中でも「SH/Tiny」 とか呼ばれているやつで,SH2の中では比較的新しい,廉価版のSH2のようだ.
で,SH2への移植なのだけど,まず開発環境から. クロスコンパイラはH8のときとほとんど同じで,以下で作成できた. 環境はいつもどおりFreeBSDね.
(binutils)
% ./configure --target=sh-elf --prefix=/usr/local --disable-nls % gmake # gmake install(gcc)
% setenv SHELL /usr/local/bin/bash % ./configure --target=sh-elf --prefix=/usr/local --disable-nls --disable-threads --disable-shared --enable-languages=c % gmake # setenv SHELL /usr/local/bin/bash # gmake install次にフラッシュROMの書き込みソフトなのだけど,ちょっといろいろ探してみたのだけど どうもFreeBSDから使えるもので,SH/7125に対応してるものが無い. 実はSH/7144のボードも買ってあって,こっちだとfw(だったかな?)という シェアウエアがFreeBSD上で使えるみたいなのだけど,まあ最初だしよくわからん ところではまってもしょうがないので,とりあえず添付CD-ROMに付属のWindows用の 書き込みソフトを使うことにした.割と有名な「FDT」ってやつね.
移植はH8と同様に,ブートローダーとKOZOS本体の両方を移植する. 理由はH8のときと同じ.ブートローダーはH8用に作ったものをそのまま移植.
ただしOSに関しては,SH/7125はRAMが8KBしかなくて,これはかなりきつい (H8/3069Fは16KB). OSが入りきるか心配だったのだけど,実際にH8用のソースコードを持ってきて SH2用にビルドして見ると,RAMのサイズが全然足りなくて入りきらない. ということでKOZOS/H8をベースにするのはあきらめて, Interface誌にPowerPC用に移植したとき のかなりシェイプアップしたソースコードをベースにして移植を行った.
で,移植したソースコードは以下.
移植時に注意したこととかはまったことは以下.
void interrupt(int vec);のようになっていて,割り込み発生時にはintr.Sで割り込み番号を引数にして interrupt()を呼び出すのだけど,割り込み番号をアセンブラで設定する際に 即値としてレジスタに設定するため,int型の値でなく1バイトの数値として 符号拡張されてレジスタに値が入る.このためシリアル受信割り込み(221)が charの上限を越えてしまい符号拡張されて,負の値になって interrupt() が 呼ばれてしまうため,シリアル受信時に interrupt() がおかしなソフトウエア割り込み ベクタを実行してしまい,誤動作していた. (割り込みが入ってもハンドラが呼ばれず,これはかなりハマッた)
以下,実際に動かしてみたところ.動作方法はH8/3069Fとほとんど同じ. 1点だけ,フラッシュROMの書き込みに h8write でなく FDT を使うので, このときだけはWindowsで作業する必要がある.
kzboot (kozos boot loader) started. kzboot> load ~CLocal command? lsx kozos.mot Sending kozos.mot, 94 blocks: Give your local XMODEM receive command now. Bytes Sent: 12160 BPS:865 Transfer complete eceive succeeded. kzboot> run starting from entry point: ffffa010 kozos boot succeed! start command thread. > echo test test OK > threads extintr idle command OK >ブートローダーを起動してOSをダウンロードし,起動してコマンド受け付け できている.いやー,なんとか動いたね.よかったよかった.
雑感として,tinyといえどやはりSH2は32ビットRISCプロセッサだなあ,と思った. アセンブラとか,割り込み処理とか,レジスタ周りとか,I/Oポートまわりの設定の 必要性とか,H8よりもはるかに複雑で,パッと見は似てるけど,路線というか ポリシーはまったく違うCPUなのだなあ,と思った. 対してH8は,やっぱしマイクロコントローラだなあ,という感じ.
そう思うとH8は移植が簡単だったなあ.シリアルとかタイマとか,たいして設定せずに あっさり動いたし.H8移植を先にやっといてよかったかも.
あとやっぱし8KBというのはOS動かすには少なくて,ROM上で動かすか, ライブラリ周りをROMに持っていってBIOSみたいにするか,なんか考えないと これ以上の機能追加は現実,厳しい.H8/3069Fのボードは16KBある上におまけで 2MBのDRAMがついている(マニュアルでは「あったらラッキーなおまけ」と書いてあるの だけど,web上のカタログでは必ずついているように書かれている.よくわからんけど まあだいたいついているもんだと思ってしまっていいみたいな気がする)ので, 機能拡張していく楽しみがある.
H8はCISCなので最初はちょっとうーんと思っていたのだけど,逆にSH2はRISCなので 32ビット即値をレジスタに直接代入することができず,値を近くのてきとうな場所に 置いとく必要がある(このへんは,startup.s でのスタックポインタ設定とか main()へのジャンプとかを参照してほしい).これがけっこう面倒で,32ビット即値を 一撃で代入できるH8は楽で初心者にはいいなあ,と思う. 初心者はH8ボードからはじめた方がいいかも.