プロが教えるわが家の防犯対策術!

PICマイコン+PICKit3で簡単なプログラムを作成して遊んでいるのですが、
ふと疑問に思ったことがあるので、質問します。

プログラムは2種類の値を用意し、スイッチの入力を見て片方をLCDに表示するといった
簡単なものですが、デバッグ中にmainプログラムの最終行まで実行した後、
再度mainプログラムの頭に戻ったとき、RAMの値がすべてクリアされている
ことに気が付きました。

当初の目論見ではRAMの値を使用して表示を切り替えるつもりだったので、少し困りましたが、
方法を変えて完成させました。少し調べてみると、mainプログラムが頭に戻ってきた時、startup.asm
のファイルを通り、RAMの値をクリアしていることが分かりました。

そこで質問なのですが、mainプログラムが頭に戻ってくるとRAMの値は必ずクリアされてしまう
ものなのでしょうか?そうだとすると、RAMの値を残したい場合はどうすれば良いのでしょうか?

ちなみにコンパイラはHITEC PICC-18です。

A 回答 (5件)

main関数が終わる事は、そのプログラムを全て終わす事です。


一般にmain関数の作りは、初期処理を行った後にループするロジック
が入り、そのロジック内で再処理の方法や、終了判定を行う様に作ります。
終了判定された場合等に、後処理を行ったり直接main関数の最後を実行します。
→break関数、return関数、exit関数やgoto命令でも制御を移行出来ます。
 従って、再処理やタイミング取りは、main関数の頭には戻らず、ループロジック内
や割込みルーチン等を利用して行う様に作ります。
    • good
    • 0

main関数が終わる事は、そのプログラムを全て終わす事です。



一般にmain関数の作りは、初期処理を行った後にループするロジック
が入り、そのロジック内で再処理の方法や、終了判定を行う様に作ります。
終了判定された場合等に、後処理を行ったり直接main関数の最後を実行します。
break関数、return関数、exit関数やgoto命令でも制御を移行出来ます。

 従って、再処理やタイミング取りは、main関数の頭には戻らず、ループロジック内
や割込みルーチン等を利用して行う様に作ります。
    • good
    • 0

main関数が再度起動されているのは、意図的に行われてるのですか。


startup.asmは、あなたが書いたコードなのですか。

単に制御を失ったマイコンが、リセットされたか何かの理由で、初期状態に戻ってmain関数が呼ばれてルのではないかと推測してます。
もしそうなのであれば、ここでの質問の内容って意味無いですよね。
    • good
    • 0

もし、本当にmain()からのリスタートが仕様だとすればEPROM等を実装して覚えておきたい変数をEPROMに記憶する必要があると思います。



そのプログラムはmain()からのリスタートが本当に正しい動作なのでしょうか、そこ確認した方が良いと思います。
    • good
    • 0

>少し調べてみると、mainプログラムが頭に戻ってきた時、startup.asm


>のファイルを通り、RAMの値をクリアしていることが分かりました。

プログラムが終了し、再起動されている。
という状態になっているのでしょう。
であればmain()関数をコールするスタートアップ処理が走りますからクリアされることになるかと。

>そうだとすると、RAMの値を残したい場合はどうすれば良いのでしょうか?

「RAMの値」とやらがローカル変数の値…ということならば、グローバル変数にするかstatic変数に…となるのでしょうが……
今回の場合はスタートアップ処理が走っているので無理でしょう。
グローバル変数などはこの時に初期化されますし。

ということで、真っ当なら「main()を終了しないようなコードを書く」ということになるかと。
# そもそも…電源投入されたら動き続けるハズのPICでmain()を終了していいのでしょうか?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!