今日は忘年会ということで、明日は休暇にして仕事納め。
そんな仕事納めの日に、ICEからROMにプログラムではないデータを書き込むという方法を検討していた。
プログラムが格納されるROMの一部に各種の情報を保存しておく機能があるが、
書き込み機能はとりあえずなくても動くということで、
試作品の評価の初期ではその部分を作り込まずに開始する予定だという。
ところがその保存しておくデータの1つにユニークな番号があり、
この番号が試作品間で重複すると正常に動かないのだという。
このため、この番号を仮に固定値とすると、試作品ごとに異なる固定値を設定したプログラムを焼かなければならない。
そこでこの番号を読み出す機能については最初から作り込んでおき、
書き込み機能はデバッグ環境のICEからプログラムを焼く機能で代替しようという話になった。
ROMにプログラムを書き込むことが出来るならば、
同じROMにプログラム以外のデータを書き込むこともできるはずじゃないかというわけである。
デバッグ環境もいろいろだと思うのだけど、今回使っている環境はELF形式のオブジェクトファイルでなければ書き込めない。
バイナリデータを与えればダウンロードできるようなデバッグ環境もありましたが。
それでFAQとか調べてみたのだけど、バイナリデータをダウンロードするにも、
プログラムデータという体裁を作らないといけないようである。
バイナリファイルを読み込んで指定のセクションに配置する機能があるので、
この機能を使ってバイナリデータをROM上の所定の場所に配置させる。
その上でダミーのCファイルとともにビルドしてやると、
ROM上にバイナリデータが配置されただけのELFイメージができる。
これをダウンロードしてやれば、ICEからROMに任意のデータを書き込めるわけである。
今回の場合、書き込みたいデータというのはユニークな番号なので、
それならもはやCのコードで書いてしまえばよいのである。
const char DATA[4]={0xDE,0xAD,0xBE,0xEF};
これでDATAをROM上の所定のアドレスに配置すればよいと。
この番号を書き換えて、試作品1台1台にダウンロードしていけばよいわけである。
というわけでユニークな番号を振る作業については、
まさに1台1台に異なるプログラムを書き込む作業になってしまった。
ただ、この番号が書き込まれる領域はプログラムが格納される領域とは別だから、
プログラムの修正を行っても揮発しないわけで、最初の1回だけで済むという点では確かにメリットはある。
というわけで一件落着と。
マニュアルも書いて年内の仕事を終えることが出来てよかった。