PICマイコン+PICKit3で簡単なプログラムを作成して遊んでいるのですが、
ふと疑問に思ったことがあるので、質問します。
プログラムは2種類の値を用意し、スイッチの入力を見て片方をLCDに表示するといった
簡単なものですが、デバッグ中にmainプログラムの最終行まで実行した後、
再度mainプログラムの頭に戻ったとき、RAMの値がすべてクリアされている
ことに気が付きました。
当初の目論見ではRAMの値を使用して表示を切り替えるつもりだったので、少し困りましたが、
方法を変えて完成させました。少し調べてみると、mainプログラムが頭に戻ってきた時、startup.asm
のファイルを通り、RAMの値をクリアしていることが分かりました。
そこで質問なのですが、mainプログラムが頭に戻ってくるとRAMの値は必ずクリアされてしまう
ものなのでしょうか?そうだとすると、RAMの値を残したい場合はどうすれば良いのでしょうか?
ちなみにコンパイラはHITEC PICC-18です。
No.1
- 回答日時:
>少し調べてみると、mainプログラムが頭に戻ってきた時、startup.asm
>のファイルを通り、RAMの値をクリアしていることが分かりました。
プログラムが終了し、再起動されている。
という状態になっているのでしょう。
であればmain()関数をコールするスタートアップ処理が走りますからクリアされることになるかと。
>そうだとすると、RAMの値を残したい場合はどうすれば良いのでしょうか?
「RAMの値」とやらがローカル変数の値…ということならば、グローバル変数にするかstatic変数に…となるのでしょうが……
今回の場合はスタートアップ処理が走っているので無理でしょう。
グローバル変数などはこの時に初期化されますし。
ということで、真っ当なら「main()を終了しないようなコードを書く」ということになるかと。
# そもそも…電源投入されたら動き続けるハズのPICでmain()を終了していいのでしょうか?
No.2
- 回答日時:
もし、本当にmain()からのリスタートが仕様だとすればEPROM等を実装して覚えておきたい変数をEPROMに記憶する必要があると思います。
そのプログラムはmain()からのリスタートが本当に正しい動作なのでしょうか、そこ確認した方が良いと思います。
No.3
- 回答日時:
main関数が再度起動されているのは、意図的に行われてるのですか。
startup.asmは、あなたが書いたコードなのですか。
単に制御を失ったマイコンが、リセットされたか何かの理由で、初期状態に戻ってmain関数が呼ばれてルのではないかと推測してます。
もしそうなのであれば、ここでの質問の内容って意味無いですよね。
No.4ベストアンサー
- 回答日時:
main関数が終わる事は、そのプログラムを全て終わす事です。
一般にmain関数の作りは、初期処理を行った後にループするロジック
が入り、そのロジック内で再処理の方法や、終了判定を行う様に作ります。
終了判定された場合等に、後処理を行ったり直接main関数の最後を実行します。
→break関数、return関数、exit関数やgoto命令でも制御を移行出来ます。
従って、再処理やタイミング取りは、main関数の頭には戻らず、ループロジック内
や割込みルーチン等を利用して行う様に作ります。
No.5
- 回答日時:
main関数が終わる事は、そのプログラムを全て終わす事です。
一般にmain関数の作りは、初期処理を行った後にループするロジック
が入り、そのロジック内で再処理の方法や、終了判定を行う様に作ります。
終了判定された場合等に、後処理を行ったり直接main関数の最後を実行します。
break関数、return関数、exit関数やgoto命令でも制御を移行出来ます。
従って、再処理やタイミング取りは、main関数の頭には戻らず、ループロジック内
や割込みルーチン等を利用して行う様に作ります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# このプログラミングの問題を教えて欲しいです。 キーボードから整数kを入力し、kが配列aの中に何個存在 2 2022/12/19 22:50
- C言語・C++・C# このプログラミングの問題を教えてほしいです。 キーボードからデータ数nとn個のデータを入力し、平均値 3 2022/12/19 22:51
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分 1 2022/07/19 17:03
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 malloc関数を使ってください!お願いします! 最 1 2022/07/21 09:28
- C言語・C++・C# 至急お願いします。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分母 3 2022/07/19 17:09
- Visual Basic(VBA) VBA リボンののリカバリーでオーバーフローエラーになります 2 2023/07/04 19:07
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
小数点を含む数値かどうか判断...
-
Excelでのセル内容の高速消去方法
-
SQLの速度をあげるには・・・
-
win10で、正確な待ち時間の作り方
-
Excel VBAにて、2GB超の点群デ...
-
ヤフーファイナンスからデータ...
-
プログラミングの授業でPython...
-
再帰呼び出しを使いますか?
-
プログラム上のCPU稼働率低減に...
-
偶数次魔方陣のプログラム
-
絶対パスの取得について
-
ゲームプログラミングの乱数で...
-
ノットイコールを教えて下さい
-
PCの並列化
-
WebBrowserの読み込み待ちの処...
-
LINUX QT上でパソコンのシャッ...
-
DoEvents関数って何?
-
ナップザック問題?をエクセル...
-
関数呼び出しの処理
-
C言語 時刻差分の算出方法
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excelでのセル内容の高速消去方法
-
DoEvents関数って何?
-
SQLの速度をあげるには・・・
-
小数点を含む数値かどうか判断...
-
win10で、正確な待ち時間の作り方
-
Excel(VBA)でSetTimer関数を使...
-
絶対パスの取得について
-
WebBrowserの読み込み待ちの処...
-
Excel VBAにて、2GB超の点群デ...
-
VBでの簡易電卓の作成(減算方...
-
テキストファイルの空行をスキ...
-
ノットイコールを教えて下さい
-
ナップザック問題?をエクセル...
-
If Not c Is Nothing Then ~延...
-
プログラム上のCPU稼働率低減に...
-
逆ポーランド記法における単項...
-
符号付きにすべきか、符号なし...
-
C言語 時刻差分の算出方法
-
C言語:関数を使うメリットとデ...
-
Excel VBA データ削除の高速化
おすすめ情報