午前中は、来週早々に出荷予定の装置のファームウェアへの機能の追加を試みた。追加しようとしたのは、装置の設定値を不揮発メモリに記録しておいて、次回起動時に読み出すという機能。実はこの機能、出荷までに試験する時間が取れそうに無かったので今回は見送る予定でいた。ところが昨日になって初めて実機を操作した上司が急遽追加するように言い出した。出荷まで日が無いので今さらソースに手を入れるのは気が進まなかったが、実装の道筋は見えてたので「やるだけやってみて、間に合わなかったらあきらめる」ということで承諾した。
この装置のマイコン基板にはシリアル通信タイプのRAMが実装されていて、マイコンのI2Cインターフェースでデータを読み書きるようになっている。既に一部の設定情報はこのRAMに記録するようにしてあるので、一定の使いかたでは正常に動作することが分かっていた。そこで今回もこれまでと同じ手順でデータを読み書きさせてみたのだが、困ったことに、連続して書き込みを行うと問題が起こることが分かった。
これまでの使い方ではRAMへの書き込み頻度が低かったので問題にならなかったが、今回のように連続で2回以上書き込みを行うと、2回目以降の書き込みに失敗した上に無限ループに陥ってしまう。書き込みごとにウェイトを入てやれば動作はするが、どのくらい待てば十分かがはっきりしないため、経験的に待ち時間を決めるには抵抗がある。
昼の時点でこの問題が解決できなかったので、今回の出荷品への実装はあきらめましょうと上司に報告したら、「約束が違う」と怒られてしまった。
えー?。
元々間に合わせるのは難しいと言ってあったし、「できるだけのことはやるけど…」という話だったはずだろうに。たしかに「理由はよくわからんけど動作はする」ところまでは持っていけるだろうけど、こちらとしてはそんな危なっかしい状態で出荷するのは避けたい。で、またしても少しばかり口論になったが、結局、懸念がすっきり解消すれば実装して出荷するということになった。
その後、後輩の仕事(組み立てが終わった装置の簡単な検査)を手伝ったり、別件の動作試験のために件の装置を使っていた別の社員からの質問に答えたりしていたため、問題の調査の時間はあまり取れなかった。
終業後、会社を抜け出して歯医者へ行った。この時点では「すっきり解決」はほとんどあきらめていたのだが、幸か不幸か、歯医者から戻ってくると出荷日が1日延びたと知らされた。少しだけ余裕が出来たので、そのまま夜遅くまでARMとシリアルROMとのI2C通信についてあちこち調べた。外国のサイトに掲載されていたソースコードにヒントになりそうな記述を見付けてARMのデータシートを調べてみたのだが、日本語版には詳しい説明が無い。英語版にはもう少し詳しく書かれていたかもしれないが、そろそろ会社を閉めることになったので、続きは来週にする。
すっかり遅くなってしまったので、夕飯を外でとるついでに本屋に寄り道した。