main関数を再度呼び出す

散々遅れていたマイコンのコーディング作業を進めている。

つぎはぎだらけだが部分的に動くことを優先したらこの有様。

後で綺麗に整理しますけど。


この機器にはボタン操作で設定情報を変更できる機能がある。

設定情報を変更したら再起動という動作になっている。

再起動という観点ではウォッチドッグタイマを作動させるという方法も考えられるが、

設定情報による再起動であることを認識できるという観点では、

スタートアップルーチンにジャンプさせるのがよいだろうと。


というわけでまず最初はmain関数を再度呼び出すものを書いたが、

よく考えたら、これではスタックポインタがだんだんズレていく。

ジャンプ元の関数に戻ってくることはないのに、無駄にスタックを残している。

というわけでスタックポインタを再設定するコードをアセンブラで書いて、

これを経由してmain関数を再呼び出しするようにした。


ところがこれでも問題があって、それはRAMの初期化をしていなかったこと。

本来0で初期化されているはずの領域が0に初期化されていないことにより、不思議な動作をしてしまった。

これはこれでコーディングミスという側面もあったのだが、やはり問題である。

ということでゼロ埋めして、初期値付き変数セクションを初期化する処理を追加した。


最初はこの処理は設定情報の書換にだけ使うつもりで考えていた。

ただ、後にCPU例外発生後にも使うとよいことに気づいた。

というのもCPU例外が発生した場合、エラー情報を表示する必要がある。

このエラー情報の表示がそこそこ複雑な処理なので、例外ハンドラから直接駆動するのは難しいのではないかと。

そこで、同様の方法でmain関数に戻ってくればよいじゃないかと。

このとき引数を渡すこともできるので、そこに例外情報を埋め込めば、

その情報を表示したり記録したり出来るねと。


他にもやり方はあるとは思いますが。

リセットしても残るレジスタに情報を残しておくとか。

というわけでけっこういろいろアセンブラでも書いているという話だった。