SNSへはこちら

EPSONマイコンC17で遊んでみよう(3) - Tipsなど

スローにやっていきます。

今回は IDE 周辺や、それ以外でのコマンド操作などを調べて、中でも便利だなあとか頻繁に使いそうだなあと思う内容を Tips としてまとめてみました。
現状はただデバッグしているだけなので、謎がまだまだ多いですからね。

主にセイコーエプソンの FAQ サイトを参考にしました。簡潔に書かれていてすごくわかりやすいですね。ある程度上級者でも見ていて勉強になります。

ビルド生成物の説明

Eclipse を使っている組み込み開発環境なので、ビルド時には Debug というディレクトリ内に各種ファイルが出力されます。
これまでに STM32 の STM32CubeIDE などでも種々の生成物がありましたが、この機会を期に整理していきます。ASCII バイナリに関しては結構独特かと思います。

  • elf バイナリ
    • 言わずと知れた実行ファイル。当然 PC ではネイティブに実行できないが、ここにデバッグ情報やソースコードなども(意図的に strip していなければ)含まれる。
    • 書き込み先のアドレス情報も含まれているので、これ1つあればデバッグ含めて容易に可。
  • bin バイナリ
    • elf からデバッグに必要な情報を取り去り、とある先頭アドレスからのデータをただバイナリ形式で表現したファイル。このサイズがそのままマイコンの ROM に書き込まれるファイルサイズになる。ターゲットの ROM 容量ピッタリのファイルサイズである。
    • gpdata.bin は Gang Programmer 用のバイナリ。純粋なプログラムバイナリよりも 84 Bytes 多い。僕みたいな用途では使わない。
  • ASCII バイナリ
    • PA, psa, sa, saf で始まるもの。これは モトローラ srec 形式
    • ここまでの情報はここに書かれているんだけどね。
    • 結局、psa 形式が重要らしい。もし好みならば後述のコマンド操作で Intel HEX 形式でも出力可能。
  • map ファイル
    • リンカの配置情報を見られる。
    • シンボル(関数やグローバル変数)の配置セクションやアドレスを確認できるので、ちゃんと希望通りにデータがオミットされずにバイナリに含まれていることが確認できる。

バイナリの逆アセンブル

できます。そもそもこの開発環境は、ツールチェインとして素の GNU Binutils / GCC を使っているので通常の Unix コマンドのように実行できます。

例えば elf ファイルを見たければ以下のようにコマンドを打ちます。コード領域のみが必要だったら -d オプションで十分でしょう。その他アーキテクチャ情報は elf に含まれているので必要ありません。

> C:\EPSON\GNU17V3\gcc6\objdump.exe -d .\W18_FromScrach.elf

bin ファイルを見たければ -b オプションが必要になり、以下のようにコマンドを打ちます。

> C:\EPSON\GNU17V3\gcc6\objdump.exe -D -m c17 -b binary .\W18_FromScrach.bin

psa であればこれは srec 形式なので、-b srec とします。

> C:\EPSON\GNU17V3\gcc6\objdump.exe -D -m c17 -b srec .\W18_FromScrach.psa

デバッグが遅いのを解消

どうやらよくわかりませんが、書き込み前に Flash 領域を事前読み出し(?)している影響で遅いようです。
これはそのまま FAQ の内容になってしまうのですが、プロジェクトフォルダ内、gdbmini3.inic17 model で始まるところに @NOREAD を付けることで事前読み出しを省略し、爆速になりました。例えば今回の W18 だったら...

c17 model 17W18@NOREAD

と言った感じです。そもそも事前読み出しってなんじゃ!?

コマンドでの書き込み

これは完全独自、と言うか試行錯誤で見つけました。

結局のところ、書き込みは gdb を用います。これによって書き込みをしているわけですね。
現状書き込み後でのリセット方法は分かりませんでした。各自書き込んだ後にリセットボタンを押しましょう。
...しかし、gdb のコマンドライン引数についても詳しくなれました。

> C:\EPSON\GNU17V3\gdb -q -batch -f .\W18_FromScrach.elf -x ..\gdbmini3.ini

書き込んだ後、デバッグに入らずすぐに終了します。ターゲットのリセットはコマンドでは効きませんでした。

書き込まずにデバッグ

gdbmini3.ini に以下のクソ長コマンドを挿入するだけです。

c17 model 17***@NOVCCIN,NOREAD,NOWRITE,NOERASE

今回だったら c17 model 17W18@NOVCCIN,NOREAD,NOWRITE,NOERASE ってなります。

gccなどが32bitバイナリである

実はこれ、Linux や Mac で動かせないかなあと思って wine を使おうとしたら無理でした。エラーメッセージを見るに怪しいと思ったので調べたら、32bit バイナリでした。

Windows はバイナリの種類を判定できるコマンドが無い OS なので、WSL から見てみたのが以下。

yuki: /mnt/c/EPSON/GNU17V3/gcc6 $ file xgcc.exe
xgcc.exe: PE32 executable (console) Intel 80386 (stripped to external PDB), for MS Windows

Windows 11 では i386 バイナリのサポートは続く (WOW64 は継続) らしいのでまあ良いかと思いますが、今後の OS のサポート状況によってはアップデートで 64bit にスイッチするかと思います。

シミュレータ

デバッグ設定で、gdb に読ませる設定ファイルを gdbsim.ini に設定すると出来ます。デバッグを開始すると専用のウィンドウが開いて各ピンの状態や LCD 表示情報などが描写されます。
動作は結構遅めなので、リアルタイムに動くというよりかはゆっくりと確認したい人向けですね。