H8/tinymon
時間軸
- h8300-hmsなgccのインストール
- H8/tinyのアドレス空間、動作モードに関するおさらい.
- Makefileの雛形を作る.
- ldscriptの雛形を作る.
- interrupt(Exception?) vectorのテーブルを作る.
- interrupt型の関数の書き方を調べる.
- monitorの原型を作成
- 全然動かないのでデバッグ
- 全然動かないので、出直してLEDピカピカを試す. --- これはok.
- sciのRx Txルーチンをスクラッチから書いてみる. でも全然動かない.
- 調べたら、I/Oの初期化がいろいろ抜けていたのと、while()ループの式の判断文が逆だった。がっくり。
- 結局LEDピカピカで動作確認するしかないじゃん、この基板。(モニタ書くときね)
- もう30回以上flush焼いた。あと70回しか残ってない・・・。
- やっと動いた <---- 今ここ
現在のステータス.
- ROMコード4k以内。
- 2k以内にしないとRAM上に載せて試せないじゃん。
- しかし、ライブラリをほとんどリンクしてない状態で4k。
- 下手にprintfとかscanfを入れようものなら、一気に32kBを越える。リンクエラーだ。
- RAMワークは256Byte以内。
- まだ、ダンプとエディットとフィルしかないんだよー。JmpがないしSレコードのロードもないし。
目次:
ここまでで分かったこと。
- H8の命令コードは、妙に洗練されていない。ドンクサイこと。
- 命令コードの割り当てがスカスカなので、コードが無駄に長い。
- 中途半端に32ビットなCPUなので、何でもmov.l になってしまって、長い。
- 32ビットの命令コードはあとで拡張したような感じで、長くなるようだ。
- 関数のプロローグコード、エピローグコードがこんな感じに・・・
void foo() { 270: 01 00 6d f6 01 00 6d f6 mov.l er6,@-er7 274: 0f f6 0f f6 mov.l er7,er6 276: 01 00 6d f0 01 00 6d f0 mov.l er0,@-er7 27a: 01 00 6d f1 01 00 6d f1 mov.l er1,@-er7 27e: 01 00 6d f2 01 00 6d f2 mov.l er2,@-er7 282: 01 00 6d f3 01 00 6d f3 mov.l er3,@-er7 本体はたいしたことしてないんだよう・・・ // 2ba: 01 00 6d 73 01 00 6d 73 mov.l @er7+,er3 2be: 01 00 6d 72 01 00 6d 72 mov.l @er7+,er2 2c2: 01 00 6d 71 01 00 6d 71 mov.l @er7+,er1 2c6: 01 00 6d 70 01 00 6d 70 mov.l @er7+,er0 2ca: 01 00 6d 76 01 00 6d 76 mov.l @er7+,er6 2ce: 56 70 56 70 rte
こんだけー
- まあ、-mint32 をやめればいいんだけど、そうするとh8/3048とかとソース共有するときに intのサイズが16bitなのか32bitなのかで書き分けないといけないし、
- だいたい8086じゃあるまいしintがいまどき16bitってどうよ。
- まあh8/tinyだけなら16bitでも困らないけど、h8って、品種が多いからねぇ・・・
- tinyだけにしか通用しないソースってのもどうかと。
- tinyじゃないh8では強制的に上のようなプロローグコードになります。駄目さ加減が爆発!
もうね、ここで半分匙は投げられた気分になる。
- あと、h8300-hms-objdumpの変な二重HEXダンプはなんとかしてほすい。
H8の開発環境について
H8開発環境の独善的選択ガイド
- 趣味、もしくはゼロから構築するなら、普通にh8300-hms-gccだ。環境はWindowsならMinGWがあるし、Linuxのrpmもある。
実はh8用のgccにはいくつかの派生があるらしい。
- 秋月で配布(ボードの付属)されているcc38h.exeとか。
- 自分が購入したAKI-H8/3048ボードにはまだCコンパイラは付属せず、DOS版のアセンブラだけが付いて来た。
- 入手しようと思えばCDROMだけ500円で買える。
- KPIT GNU Tools http://www.kpitgnutools.com/ --このサイトは日本語OK。
- GCC Developer Lite http://www.besttechnology.co.jp/index.htm
- 実行ファイルフォーマットがelfなので良さげ。
- ちなみに、sourceforgeのh8300-hms-gccは coffだった。
派生はいろいろ便利そうだが、とりあえずsourceforgeのやつで行くつもり。
使えそうなモニタデバッガのソースはないのか?
- ルネサス(元日立)のモニタデバッガを探してみたが、見当たらず。
- H8以外の品種では存在しているようだが・・・。もうH8用の配布はやめたのか?
- 全部アセンブラ(HEW)
- 苫小牧高専のモニタ
- GPLv2で公開されている。
- 残念ながらフルアセンブラ。ビルド環境はgcc(のアセンブラ)とmake
- H8/Tiny用はない。
- 秋月H8ボード用のモニタ(フリーウェア)
- 半分アセンブラ
- ライブラリ部分のソースがなく、改造不能だった。
結局、これは良いというものがなかった。
- モニターのソースが欲しいのではなくて、普通にCでアプリを書くときのフレームワークが欲しいだけ。
- つまり、Makefileとldscriptとcrt0.SとUARTの割り込みハンドラ。
- これだけ揃っていてCで書き始められればそれで充分。
- 何かやりたい場合は、モニターに機能追加する形で実装すればよい。
- SレコードのローダーとGDBスタブまで用意できれば、モニタでなくても良いわけだが。
H8用のGDBスタブはここにある。
H8のGDB用スタブモジュール
>田沢さんが、H8のGDB用にスタブモジュールを実装されました。ターゲットは (株)秋月電子通 商製 H8/3067FとH8/3069Fで、GDB用にSCI0を使用します。スタブのソースプログラムは、以下にあります。
とのこと。
- リンク先にあるGDBスタブはgcc用。(そりゃGDBだからね)
- 残念ながらH8/tiny用はない。--->作るしか。
- これまでは、H8とH8/tiny間の違いがなんなのか良くわからず、移植方法も不明だった。
- が、monitorを書いたことで、おぼろげながら分かるようになった。
要点としては、
- H8/tinyではメモリー空間は64kBしかないこと。
- 割り込みベクターが2バイトの配列に縮退していること。
- I/Oのアドレスや種類が全く異なっていること。
- デバイス依存の割り込みは品種ごとに違っている。
- シリアル割り込みに関しては3694Fでは全部ひっくるめて1つのベクターに飛んでくる。
しかし、
- toppers.jp にUPされているH8用GDBスタブがあれば、H8のスタートアップやデバッグには十分だと思われる。
- このGDBスタブは書き方がしっかりしている。
というわけで、
- H8/tinyに移植すれば使えそうだ。
- おまけでメモリーダンプ等のモニターコマンドを入れておくと(GDBなしでも使えるので)便利かも。
実際にやってみた。
- GDBスタブのコードサイズは5k程度。
- .dataと.bssの合計(RAMサイズ)が4kくらいある。
- .stackも2Kくらいある。
- H8/3694Fには入らない。
よって、GDBスタブはH8/tinyではサポートされていない。
H8/tiny用のGDBスタブを発見
トラ技の2004.4基板にGDBスタブを移植している人を発見した。
答えは全部ここにあった。
- もはや私はコードを書かなくてもGDBが使えるということだ。
- コンパイラがh8300-elfで作成されていた。
- coffのコンパイラで通るようにmakefileとldscriptを改造した。
- ビルドした。
- コードサイズはやや大きく、13kBある。
- .data+.bss+.stackは 0xfd80〜0xff80を使用している。以外と小さい。
- 仮想vectorテーブルをRAM上の0xf780〜0xf7ffに置けば、間接的に呼んでくれる。
- デバッグしたいプログラムは0xf800〜0xfd7fの1.3kBにロードする.(正確には、0xf780からvectorテーブルを先頭にコードを配置するのでベクターテーブルの余りはコードが置ける)
ここまで分かったから、オチを書いておこう。
- トラ技基板のH8/3694FはRAMが2Kしか実装されていない。
- GDBデバッグは出来るのだが、置けるコード(+ワーク)サイズは1.3kBしかない。
- これを補うために、ライブラリの類をROMに詰め込んでおいて、そっちを呼ぶようにすれば、少しは節約できる。
- だとしても、H8の冗長コードをたったの1.3kBしか置けないなんて・・・。
- だったら、高効率なAVRのコードが2kBも置けるATtiny2313のほうが使いやすくね?
あーAVRの補完に使おうと思ったH8/tinyだったが、使えねー。
- 残る利点はI/Oのピン数とA/Dコンバータのみとなる。
GCC Developer Liteは良さげ
- Embeddedの集大成、ARM,AVR,H8,SH用のgccと周辺ツールが入っている。
- gcc 4.1.2ベースだ。(AVRにはどちらかというと鬼門のgcc-4だ)
- OpenOCD http://openocd.berlios.de/web/ というのも含まれていた。なかなか興味深い。
実は、GCC Developer Liteに含まれるH8tiny用のサンプルに各種H8内蔵デバイスを使ったプログラム例が入っていた。
- シリアルドライバー等はgccのライブラリに含まれている。
- コンパクトで使いやすそうだった。
- コンパクトなprintfの実装とかもある。
立ち上げてみると、統合環境風なGUIが起動する。
- gdb-6.1のGUI版(GNU Insight Debugger)まで統合されているようだ。
- gdbスタブを書けばGUI上でソースレベルデバッグ出来るのか?
ある意味、これは凄いぞ。Embedded界のVisualStudioだ。
- しかし、冷静に考えると、これはBestTechnology社製のH8などのマイコンボードを購入した人を対象としたサービスであろう。
- 秋月のボードを買った人とか、トラ技の付録基板の人は、若干の後ろめたさを感じながら使おう。
- まあ、gcc,gdbに関してはGPLなので使用には問題はないと思う。
- GUIで纏められていて使いやすい上に、ライブラリとかスタートアップがある程度用意されているので、特に初心者にはお勧めだ。
- 以前は購入者以外には公開されていなかったらしい。
- GNUH8のリンク先をクリックするとKPIT GNU Toolsのページに飛ぶので、結局のところ、派生品とは、KPITと秋月CDROM(dos版gcc)の2種類ということになる。
H8/tinyにはE8aエミュレータがあるらしい。
今頃知った。
- 価格は、1万3000円程度。
- 但し、H8/tinyとかR8/tinyとか機種が限定されている。
- tinyでないH8には対応していないっぽい。
- H8/tinyなどには、デバッグ専用のピンが1本だけ用意されている。
- そのピンと接続して、HEW経由でデバッグ出来るらしい。
- gdb(insight)には対応していないのか?
- 不明
続き
H8/gdbstub