H8/tinymon

H8/3694遊び

時間軸

  • 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