ROMライタ本体のファームウェアは開発中はデバッガでRAMにロードして動作確認し、フィックスしたところでCPU内蔵のフラッシュROMに焼き付けるつもりでした。
対応デバイス、書込みアルゴリズムの追加や軽微なバグでしょっちゅう修正もあるだろうし本番でもCPU側デバッガカーネルはそのまま残し、ファームウェアはその都度ダウンロードしRAM上で実行することにしました。
そのためホスト側デバッガの機能を一部アプリケーションに組み込む必要があります
モトローラSフォーマットのヘキサファイルをCPUにロードする「Load」コマンド
指定したアドレスからプログラムを実行させる「Goto」コマンドがあれば良いのですが
この実装に苦戦しました
1.コマンド文字列のターミネータ
単にコマンド文字列をシリアルから送出すればいいと思っていたのですが
「エンター」に相当するのが「CR」+「LF」ではなく「CR」だけでよい。
「LF」も送ると次のコマンドがエラーになる
→ 例えばLoadコマンドは 「”L\xd”」
2.ファイルの改行文字
HEXファイルも1行の終端は「CR」+「LF」になっていますが、送出するとき
は同様に「CR」だけにしなくてはいけない。「LF」も送ると次の行がエラーに
なる
→ HEXファイルはバイナリオープンし「LF」=0x0aは読み捨てる
3.レスポンス処理
コマンドに対してメッセージ等のレスポンスがある場合、それを受け捨てる待ち
時間が必要
→ロード完了時にロケート情報のメッセージを返してくるのでこれを200ms
スリープして受け流してからGotoコマンドを発行する
・・・ここらへんが悩んだところです。
結局、ダウンロード処理の中心部分は以下のようになりました
モトローラSフォーマットの構造は解析しなくてもそのまま送ればCPU基板側で解釈してくれるので楽です。これを起動時にポップアップするダイアログ処理に組み込んで、このような表示になります。
ファイルを最後まで読むループ中にあるDoEvents()はOS側で処理すべきメッセージが無いか見ており、別に無くても動きますが、最初これが抜けていたときに、上の図のようなダイアログの画面キャプチャが何故かどうしてもできず、しばらく悩みました