質問: MPLAB_X IDEと、XC8コンパイラの組み合わせ環境です。 PIC16F1938を使用し、普段はスリープさせておいて、外部割り込み(RB0)を意図的に発生させる事でスリープから復帰。 そして割り込みプログラムにて、希望の動作をさせると言ったフローでプログラムを製作したいです。 その割り込みプログラムの最初で、条件分岐をさせ、1次のプログラムに進むか、もしくは、2プログラムを終了させて、また、改めてスリープに戻り、外部割り込みの発生を待機させると言った事をさせたいです。 この希望を実現させる為に、普段は『goto』を使用しています。 条件YESなら、次のプログラム。noなら『goto END_PROGRAM;』と言う風にして、プログラムの最後に、一気に飛ばします。 そうすれば、また、sleepに戻り、外部割り込み発生するまで待機してくれます。 しかしながら、今回製作しているプログラムが、異常に長く、どうやら許容範囲を超えてしまったみたいで、XC8コンパイラエラーが発生。 『error~fixup overflow string~』と言うエラー文が表示されてしまいます。 そこで、プログラムのスリム化や、効率化をして、なんとか、プログラムを短くする様に努力したのですが、それでも長いみたいで、コンパイルエラーが発生し、同じエラー文が表示されます。 以上を踏まえた上で、今のプログラムの内容は変えずに、私の希望を実現させる為のスマートな方法は、どのような方法がありますか? そこの所を、ご教示頂けると嬉しいです。 自分でも色々と考えました。 (1)exit(0);を採用する。 最初の条件に置いてnoの場合、exit(0);// 強制終了。 これで、私の希望は実現できますか? また、exit関数利用の為の実装(stdlib.h)がなされていれば、この1命令だけで、他は何もしなくて大丈夫でしょうか? 更に、プログラムを終了して元に戻るみたいな、今回の使用の仕方としてなら、exit(0);関数は、プログラム中に2つ以上使用しても問題はないでしょうか? (2)return(0);を採用する。 最初の条件に置いてnoの場合、return(0);// 強制終了。 これで私の希望は実現できますか? また、return関数利用の為の実装がなされていれば、この1命令だけで、他は何もしなくて大丈夫でしょうか? 更に、私の希望するプログラム製作においては、exit、returnのどちらを採用するのが適切でしょうか? それと、プログラムを終了して元に戻るみたいな、今回の使用の仕方としてなら、return(0);関数は、プログラム中に2つ以上使用しても問題はないでしょうか? (3)WDTを採用する。 条件noの場合、while(1){}で永久ループを意図的に発生させ、WDTでリセットをかける事で、改めてsleepから始める。 この方法はインターネットを探して見つけました。 これをやる場合は、コンフィグも合わせて、どの様な設定をすれば宜しいでしょうか? (4)RESET();を採用する。 これもインターネットで探しました。 データシートで、ざっと調べてみましたが、どこに記載されているのか、わかりませんでした。 もし、これを採用する場合は、具体的にどの様なソースを記述する事で希望する動作をしてくれるプログラムが作れますか? 以上4点について、この中に、今回の、私が製作している様な、長いプログラムに最適な、スマートな方法がありますでしょうか? それとも、上記以外で、一般的に採用されているスマートな方法がありますか? XC8コンパイラについては、現在、free版を使用してプログラミングしています。 元々、長いプログラムが原因で、許容範囲を超えてしまった為、『goto』が採用できないと言う事で、有償版に変更して最適化させ、そして『goto』で飛ばした方が、すっきりしてよろしいのでしょうか? 色々と、申し訳ありませんが、ご教示の方、どうぞよろしくお願い申し上げます。
回答: exitとreturnの結果が同じような動作となるのは、main関数内だけかと思います。 通常はexitにてプログラムを終了すれば事足りるかと思います。 exit