(SH2移植編第1回)SH2にも移植してみよう

2009/09/27

あなたは 人目のお客様です.

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用に移植したとき のかなりシェイプアップしたソースコードをベースにして移植を行った.

で,移植したソースコードは以下.

移植時に注意したこととかはまったことは以下.

まあこんなところかな.最初のシリアル送信できるようになるまでと, OS起動後のSCI割り込み受け付けでハマッた. まあ赤と白のLEDがあったので,LEDデバッグでなんとかなりはしたのだけど, 思いのほかハマッて苦戦した.やっぱし32ビットCPUは複雑さが全然違うね. H8よりずっと高機能で,動かすのにいろいろ設定も必要な感じ.

以下,実際に動かしてみたところ.動作方法は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ボードからはじめた方がいいかも.


メールは kozos(アットマーク)kozos.jp まで