日記帳だ! with Tux on Libserver

二度目の大改造!! 日記帳…か?を継承し、より柔軟でパワフルなBlogに変身しました。

RSSに対応しています。リンク・コメント・トラックバックは自由にしていただいてほぼ問題ありません。
RSS購読方法、僕のリンク・コメント・トラックバックについての考えを読むことをおすすめします。

スタック領域をどうするか

たいていの場合、プログラムを動作させるにはメモリ上のスタック領域を使う。

ローカル変数や関数呼び出しや割り込みしたときのプログラムカウンタやレジスタを待避させるのに使う。

当たり前の事ながら、このスタック領域のメモリを破壊すると、その後のプログラムの動作がおかしくなる。


ただ、マイコンの低レベルなプログラムではスタック領域を破壊するようなプログラムを書くこともある。

今回はスタック領域として使うメモリ領域を含めて、メモリ全体を特定の値で初期化するというものだったんだけど。

もちろん、スタック領域を壊すわけですから、関数の呼び出し元に戻ることは想定していない。

プログラムの初期化処理で行うわけですから、一方通行でよい。

しかし、今まさに使っている領域を破壊してしまうと、その時点で動作が狂ってしまうから問題である。


こういう場合、スタックを使用しないプログラムを作ればよく、じゃあアセンブラかと思ったんだけど、

うちの職場では、そういうプログラムも他のプログラムと同じようにCで記述されている。

当時のチームリーダーに聞いたら、できたとこ勝負らしい。

簡単なプログラムならスタックを使うまでもないわけで、Cでコンパイルしてもスタックを使わないプログラムが生成されることはある。

どうもそこを狙ってるらしい。そんなのアリかよと思うけど、ちゃんとコンパイル結果は確認しているのでご安心を。


ただ、今回の初期化処理はもうちょっと複雑なので、Cで書いてはスタックを使わずとはいかない。

じゃあどうしようかと考えた結果、このマイコンにはどうしても使い道のないRAMがあることに気づいた。

使い道がないというか、とある理由によりプログラムが通常動作になってからは使えないんだよね。

ただし、初期化処理の間に使うのはあまり問題がないので、すでに初期化処理の中で使用している領域だった。

初期化処理の前にスタックポインタを変更して、終わったところで本来のRAMへスタックポインタを戻すことにした。

こうすれば、RAMを初期化するプログラムでスタックを使ってしまっても問題はない。


ちなみにスタックポインタを変更する処理はアセンブラで書かれている。

ここでは数少ないアセンブラで書かれたプログラムである。

スタックポインタを変更してしまうと、基本的に元のプログラムには戻れないということで、

スタックポインタを変更して、指定されたプログラムへジャンプするというのがセットになっている。


今回、初期化処理中だけ使えるRAMがあったのは幸いだった。

メインRAMはとある都合により、全領域を初期化しなければ安心して使えないことが判明した。

「書きつぶすと初期化処理が長くなるから現実的とは言えないのでは」とは言われたが、

とある処理に紛れ込ませれば、処理時間が伸びないだろうと考えたわけである。実際にそうなった。

ただ、そうすると、なんとなく書いてスタックを使わないプログラムが生成されるわけはないし、

そこをなんとかするためにアセンブラで書くのも気が引ける。(類似するプログラムがアセンブラだったらやってたかもしれないけど)


もしも、スタック領域のRAMも含めて書きつぶさないといけないなら、2段階に分けてやってたかもね。

スタック領域として使っている部分を避けて書きつぶしてから、

スタック領域を使わない関数で残りを書きつぶして、スタックポインタを再設定するとか。

最初はそういうやり方も考えたのだが、めんどくさいしイマイチだなぁと思ったら、

そういえば、別のRAMにスタック置いても初期化処理なら許されるなと思ったのである。


こういうのはあんまり書かないプログラムだと思いますけどね。

このプログラムも1回作ってしまえば、同じものを同種のシステムでひたすら流用する予定だし。

出来てしまえば、初期化も何も考えなくて済むってことだし。


Author : Hidemaro
Date : 2020/01/07(Tue) 22:41
コンピュータ・インターネット | Comment | trackback (0)

Tools