ここまでで動作が確認できたので組込みソフトの開発に入ります。まずはデバッグを行うために作成したプログラムをRAMにロードする手順にトライします。

【作業の流れ】
ボードの作成
動作テスト
組込みソフトの開発 環境準備
ソースの作成
コンパイルと実行
DRAMの利用
PBポートの利用
トラブル
OSの改造


【環境準備】
gccとbinutilsを用意します。いくつかのサイトで紹介されていますのでそれらを参考にしてください。 例えば、http://www.nortepotosi.com/shibuya/mach8/MacH801.html等があります。
最新の環境が望ましいとは思いますが、バージョンによってはコンパイルに失敗するので、gcc-3.4.3、newlib-1.13.0、binutils-2.15を利用しました。


【ソースの作成】
組込むソフトウェアをテキストエディタ等で作成します。
ここではキットのCDに収録されているhttpサーバのサンプルを拡張して開発を進めるので、以下ではソースファイル名は http.cとなっています。
http.cのソースのIPアドレスを自分のネットワークに合わせて修正し(システムコールip_setupのパラメータの変更)、ブロードバンドルータのIPアドレスをゲートウェイアドレスに設定しました(システムコールset_gatewayを利用)。
これでHUBを経由しても通信できるようになりました。サブネットが同じならゲートウェイアドレスの設定は不要かと思いますが、 これを設定することでGapNAT環境でも接続できました。


【コンパイルと実行】
キットの付属CDにあるMakefileを参考にして改造しました。マニュアルにも記載されていますが手順は次のようになります。

(1) gccでコンパイル ~/H8/cross-env/h8300-hms/bin/gcc -mh -mrelax -mint32 -fno-builtin-vprintf -I~/H8/cross-env/h8300-hms/include -Wall -I~/H8/cross-env/include -T ~/H8/cross-env/h8_os/ram3068.x -nostartfiles ~/H8/cross-env/h8_os/crt/ramcrt0.S http.c -o http.coff -lc
(2) coffをmotに変更 ~/H8/cross-env/bin/h8300-hms-objcopy -O srec http.coff http.mot
(3) 実行権を付加 chmod -x http.mot
rm http.coff

ここで(1)(2)のそれぞれのパーツについて補足しておきます。それぞれのディレクトリはマシンの環境によって異なるので比較の参考にしてください。

(1) ~/H8/cross-env/h8300-hms/bin/gcc コンパイラです。【環境準備】で生成したものです。~/H8/cross-env/h8300-hms/bin/の配下には右のようなファイルがあります。
ar,as,gcc,ld,nm,ranlib,strip
~/H8/cross-env/h8300-hms/include 【環境準備】で作られたフォルダです。mallocやstring等のライブラリが入っていますがこれらを使わないなら(H8/OSのみを使うなら)不要です。以降では使わない条件で進めていますので、もしここのライブラリを利用するのであれば、リンカの設定等が必要になるかも知れません。
~/H8/cross-env/include H8/OSを利用するためのヘッダです。AKI H8キットのCD-ROM(/h8_os/include)に入っていた右のファイルです。3069ではreg3067.hとsyscall.hを利用します reg704x.h,reg3048.h,reg3067.h,reg3664.h,syscall.h
~/H8/cross-env/h8_os/ram3068.x リンカスクリプトと呼ばれるファイルで、-Tオプションでメモり割り付けを指定するものです。ram3068.xはAKI H8キットのCD-ROM(/h8_os)に入っていたファイルで、内蔵RAMにプログラムをロードして実行する場合のメモリ割り付けです。3069Fの内蔵RAMは高速アクセスが可能ですが、サイズはわずか16kなのでちょっとしたプログラムを書くとすぐにいっぱいになってしまいます。ライブラリの引き込み方にもyりますが、私の場合はわずか500line程度のプログラムでサイズをオーバしました。またプログラムサイズが大きくなると転送時間も延びてきます。サイズオーバぎりぎりのプログラムで12分ほどでした。 デバッグの効率化のためにもプログラムを分割してテストできるように作成することが望ましいでしょう。
外付けのDRAMの利用については後述します。
~/H8/cross-env/h8_os/crt/ramcrt0.S スタートアップルーチンのファイルです。ramcrt0.SはAKI H8キットのCD-ROM(/h8_os)に入っていたもので、 RAMにプログラムを転送する場合に利用します。
-fno-builtin-vprintf 必須のオプションではありませんが、コンパイル時に出る「conflicting types for built-in function 'vprintf'」のwarningを消すためのものです。H8/OSではvprintfを自前で定義しているので、標準の関数の名称とぶつかるようです。
(2) ~/H8/cross-env/bin/h8300-hms-objcopy 形式を変換するコマンドです。【環境準備】で生成したものです。~/H8/cross-env/bin/の配下には右のようなファイルがあります。 h8300-hms-gcc,h8300-hms-objdump 等



【DRAMの利用】
H8/3069Fの内蔵RAMはわずか16kなのであまり大きなプログラムはのりません。 H8/3069Fボードには2Mの外付けDRAMが搭載されているものがあるので、このDRAMにプログラムを転送して実行することにトライしました。
DRAMでプログラムを実行するには次の2つの手続きが必要です。
(1) リンカスクリプトの修正
(2) DRAMモードの修正

リンカスプリプトは-Tオプションで指定していたファイルに記載されています。 ram3068.xを次のように修正しコンパイル時にこれを-Tで指定します。

オリジナル 修正後


MEMORY
{
syscall(r) : o = 0x000100, l = 0x0200
ram(rwx) : o = 0xffde40, l = 0x1800
}



MEMORY
{
syscall(r) : o = 0x000100, l = 0x0200
ram(rwx) : o = 0x400000, l = 0xFFFF
}


上記の例は、 DRAMの先頭アドレス H'400000からサイズ0xFFFFまでを割当ています。

これで putを利用してプログラムを書き込みます。
ところがそれだけではうまく実行できませんでした。いろいろ調べてみるとどうもRAMの種類によるもののようでした。キットに付属していた説明書にも記載がありますが、EDOと呼ばれる高速アクセスモードを利用できるRAMとそうでないRAMでDRCRAレジスタの設定を変える必要があります。 CDROMに収録されいたOSではEDO RAMを利用するためのバーストアクセス(BE)がONになっていますが(確認方法は下記参照)、これをOFFに設定したところ実行できることを確認しました。EDOはRAMからのデータの読み出しを高速化するものなので、書き込み後に下記に示すようにDRCRAレジスタを設定しなおしてから exec 400000で実行しました。ただし、この方法では、リセットボタンを押すと BEの設定はもとに戻るので execする前にはその度に設定する必要があります。
なお、EDOは最近のDRAMでは採用されていないようです。購入したボードに実装されていた2MのDRAMはTOSHIBA TC5117805CFTS-60という型番でその仕様は不明です。

DRCRAレジスタの確認 BE OFFの設定と確認
H8/OS >dump ffee026
0FFEE026 : 3C98B7030A987F00 0000FFFFFFFFFFFF
0FFEE036 : FFFFFF00FFFF00FF 00F0FFFFFFFFFFFF
H8/OS >setbyte ffee026 35
3C -> 35 updated.

H8/OS >dump ffee026
0FFEE026 : 3598B7070A987F00 0000FFFFFFFFFFFF
0FFEE036 : FFFFFF00FFFF00FF 00F0FFFFFFFFFFFF


【PBポートの利用】
出力ポートにPBポートを利用しようとしましたがなぜかコントロールできません。 H3069Fのマニュアルとにらめっこしながらレジスタの設定状態をdumpコマンドを 使いながら調べてみると、どうもSCR2レジスタでPBがシリアルポート利用に設定されている。そこでH8OSをトレースしたところ、sio.cで該当の設定していました。
レジスタを再設定することでPBポートを出力ポートに利用できるので、H8OSには 手を加えず、アプリケーションの初期設定時に、

SCR2 = 0x00 ;

の設定を行うようにしました。


【トラブル】
当初は何も問題なく動作していたのに(1)-(3)のような症状が徐々にひどくなってきました。
(1) putコマンドがきかない
(2) jermで接続してリセットボタンを押してもプロンプトが返ってこない
(3) Ethernetの送受信LEDが点灯したままになる
(4) h8writeコマンドは常に正常に動作する
秋月にフォームで問い合わせても応答なし。OSに手を加えたりして調べたところどうもCPUが起動してない様子。ボードを何度も確認してやっと不具合箇所を発見。動作モードを切り替えるDIPSWのPIN3が接続不良でした。OFF状態のままになっているようで、 (4)が正常だったのはそのためでした。半田コテを当て直したところ問題は解消しました。見た目ではわからないイモ半田でテスターを当ててやっとわかりました。かなり微細な回路パターンなのでやはり完成済みのボードの購入をお勧めします。

前<目次 | >次