SNSへはこちら

MacでSHの開発環境を作る

続いてルネサスの SH (Super Hitachi) マイコンです。本記事では最もよく使われているであろう SH7125 を対象にします。秋月の商品ページは以下。

このマイコンボード、先の H8/3694 と同じく品薄みたいです。

コンパイラ

H8 の記事と同じく、binutils は 2.30、gcc は 8.2.0、newlib は 2.4.0 です。

# binutils
$ ../configure --prefix=/usr/local/sh-elf --target=sh-elf --disable-werror --disable-bootstrap

# gcc(1回目)
$ ../configure --prefix=/usr/local/sh-elf --target=sh-elf --enable-languages=c --disable-libssp --with-newlib --disable-nls --disable-threads --disable-libgomp --disable-libmudflap --disable-libstdcxx-pch --enable-multilib --enable-lto --with-system-zlib --disable-werror --disable-bootstrap

# newlib
$ ../configure --prefix=/usr/local/sh-elf --target=sh-elf --enable-multilib --disable-werror --disable-bootstrap

# gcc(2回目)
$ ../configure --prefix=/usr/local/sh-elf --target=sh-elf --enable-languages=c,c++ --disable-libssp --with-newlib --disable-nls --disable-threads --disable-libgomp --disable-libmudflap --disable-libstdcxx-pch --enable-multilib --enable-lto --with-system-zlib --disable-werror --disable-bootstrap

書き込み時のピン

ピン番号 機能 備考
CH1-27, CH1-28 VCC 5V電源
CH2-27, CH2-28 GND
CH1-25 MD1 起動モード選択端子
CH1-26 FWE 起動モード選択端子
CH2-4 RXD1 書き込みに使用 ホスト側の TXD に接続
CH2-5 TXD1 書き込みに使用 ホスト側の RXD に接続
CH2-22 RES Active Low

MD1 と FWE の電圧レベルは以下のようです。

モード MD1 FWE
ユーザー(通常起動) 1 0
ブート(書き込み) 0 1

これだと手動だと切り替えが面倒くさいから、スイッチとインバータの組み合わせで回路を作ったほうが良い気がします。

書き込みソフト

このシリーズに対応しているものとして、Python を用いた SH Tiny ライター があります。
こちらのライタは、出来上がる mot ファイルのアドレスが 128byte 境界にアラインメントされていないとエラーを吐くので、リンカスクリプトでうま〜く調節してやってください。これけっこう大変だったのよ。

プロジェクト例

ご査収ください。疲れた...
割り込みベクタは必要最低限しか組んでいないので、必要な分はマニュアルを読みながらご自身で実装してみてください。

sh_proj

アセンブリする際の注意点

分岐命令・ジャンプ命令は遅延分岐の場合があります。というかよく使う分岐命令は大体遅延です。遅延スロットを用いた遅延分岐では、1つ後の命令を先に実行してから分岐が始まります。不幸にもこのアセンブラにはそれを考慮して命令順を入れ替えるとか、nop を挟むとかやってくれないので、自分でやりましょう。
この遅延分岐の際、更に分岐命令を実行しようとするとエラーが出て落ちるので、そこも要注意です。
意味がわからない人は「分岐命令の直後には nop を置け」と理解しておけばいいです。

また、リンカスクリプトで書いた変数へアクセスする際も大変です。ARM のように一旦実行部に近いところに変数アドレスを配置して用いる必要があります。例えばアセンブリでリンカスクリプト上の変数 _sbss のアドレスをレジスタにロードしようとすると「遠すぎる」と怒られます。

mov.l _sbss, r1
# 遠すぎると怒られる

なので、一度配置してからロードします。

mov.l addr_sbss, r1
# 自動的にPC相対に置換される

# long のアラインメント
.align 4
addr_sbss:
    .lomg _sbss