開発日記

SWD 切り替えの回路に不具合があったものの放置していたのをいまさら対応. 原因はICの単なるハンダづけの不良.

MCU 用の build で text mode で DMA のあとに文字を打つと1文字無視されることがあるバグの原因調査. 原因はおそらく2つ.

1つ目が5Vの電源投入後に待ち時間があるときに timercallback をちゃんと実装せずに WFI() で止めていたのを修正. これは各種オブジェクトもどきの構造の変更が非常に多く、非常に手間がかかった. ただしバグは直らなかった. 1次的に WFI() を止めたら改善したので本腰をいれて直したが、頻度は下がった気がするので不具合の原因は複数あった気がする(自信なし).

2つめが文字入力の割り込みはちゃんと動いているのに文字として認識されていないところまで判明し、escape sequence の変数がプログラム上ありえない値になっていた. escape sequence の変数のメモリ配置を確認したところ、メモリ節約のため自前で動的に配置していた部分でそこのポインタ算出がものすごく間違っていた.
binary mode のメモリ使用量が増えたことでスタック領域が浅くなり、そこにその変数を配置していた. よって DMA の呼び出しでスタックが深く積まれるとその変数を書き換えてしまうということであった. text mode はシミュレータで確認していないため、もしシミュレータで動かしたら即 segmentation fault でわかったバグである.

1つめの修正でシミュレータも関数の引数がかなり変わってしまったのでそれの対応. こちらは MCU に比べて修正箇所が少なく、1発で対応完了.

以上によりファームウェアの開発は1つの山を越えた. 次回はシミュレータにつくった mruby のスクリプトMCU でも動くように改善する. 半年前に作ったものはシミュレータとMCUと通信するために似たようなソースコードを作っていたものの別々になっていた.

シミュレータ用の flash programmer の構成が異常に複雑になってしまったために、似たものを作るととんでもない手間になる. これをさけるためにシミュレータで作った使い回せるソースコードを取り込む方針で、MCU の通信するソフトを作り直す.