質問
Cコードを使用してPic18をリセットする最良の方法は何ですか HiTech Pic18 Cコンパイラを使用
編集:
私は現在使用しています
void reset()
{
#asm
reset
#endasm
}
しかし、もっと良い方法があるはずです
解決
よくある質問があります。
Q:マイクロをリセットするにはどうすればよいですか
1つの方法は、すべての変数を PICにリストされているデフォルト マニュアル。次に、アセンブリ言語を使用します 位置0x0000にジャンプするには マイクロ。
#asm ljmp 0x0000
#endasm
これは、次の場合でも非常に安全に使用できます。 割り込み内で呼び出されるか、 手順。 PIC 16xシリーズマイクロ 8つのスタックレベルがあります。毎回 プロシージャが呼び出され、1スタックレベル 戻りアドレスに使用されます。それ 循環バッファなので、たとえ microは7プロシージャレベルの深さで、 リセット時の割り込みで と呼ばれる、これはの新しいスタートです スタックバッファ、およびマイクロ 通常どおり続行します。
別の方法は、ウォッチドッグを設定することです チップがプログラムされているときのタイマー、および CLRWDT()命令をすべて使用する コード。マイクロにしたいとき リセット、ウォッチドッグビットのクリアを停止 そして、マイクロは周りにリセットされます に応じて18ミリ秒から2秒 プリスケーラ。
他のヒント
コンパイラーには通常、独自のreset()関数が組み込まれていますが、関数が実行することは正確に行われ、実際の名前はコンパイラーごとに異なる場合があります。
既に可能な限り最善の方法で実行しています。
あなたの答えは私が知っている最良の方法です。重要な点は、関数呼び出し内にアセンブリ命令をすべて単独で持つことです。 コンパイラは、インラインアセンブリを含む関数を最適化しません。したがって、非常に大きな関数にインラインでリセット命令を含めると、コンパイラはその関数のコードを最適化しません。これを回避するには、Resetを独自の関数に配置します。この関数のコードは最適化されませんが、それは非常に小さな関数であるため、誰が気にします。
コンパイラベンダーのランタイムライブラリで定義されているライブラリ関数がない限り(そのようなライブラリがマイクロコントローラの世界に存在する場合でも...)、そうではありません。 C自体は確かに「リセット」を行うのに役立ちません。 Cがそれをカバーするにはプラットフォーム固有の問題が多すぎます。
私はccsinfo.comコンパイラを使用します。これには、PICをリセットするための同様のAPIコールがありますが、コンパイラのソリューションは正しいことをすると思います。