0

8051 プロセッサ、AT89C51CC03 ボードを使用し、Keil uVision で C をコーディングしています。

プッシュ ボタンが押されたかどうかを確認し、プログラムをメイン コードの先頭に戻すループを作成しようとしています。

ボタンは任意のピン、つまり P0_0 にあります。そのピンがlow = 0になった場合、プログラムがコードの先頭に戻るようにします。

これまでのところ、私が思いついた唯一のアイデアは次のとおりです。

if (P0_0 == 0) {
  /* Reset */
} else {
  /* Body of the rest of the program */
}

コードの本体を実行するまでリセットボタンをもう一度見ないため、これでプロセスが満足に完了するとは思いません。エラーまたはグリッチが発生した場合、リセットに戻らない可能性があります。

4

3 に答える 3

1

あなたのアプリケーションについてはよくわかりませんが、これは同じ問題に遭遇するいくつかの機能の最初の 1 つに過ぎないかもしれません。多くの解決策がありますが、最初に使用するのに適しているのはsuperloopです。Michael Pont はEmbedded Cという組み込み C プログラミングの入門書を著しています。彼の大学のウェブサイトから入手できる主題に関する彼の講義からのメモがいくつかあり ます。

要約すると、プログラムの流れは次のようになります。

initialization_stuff();
other_inititialization_stuff();

while(1)
{
    do_something();
    do_something_else();
    do_something_also();
} // do it again!

関数は、do_something()アプリケーションが実際に実行することを意図したものです。何らかのセンサーを読み取り、それについて決定を下し、決定の結果を実行する場合があります。ほとんどすべての組み込みアプリケーションで、もう一度やり直したいと思うでしょう。プログラムは、誰かがプラグを抜くまで続きます。ループ内でそのボタン行 (if上で書いたステートメントですが、 はありません) をチェックします。elsewhile(1)

実行したいこの特定のアクションであるソフトウェア リセットは、お使いのデバイスでは簡単ではありません。リセットを誘発するために突くことができるレジスタはありません。グランドに閉じたボタンを RST に接続するだけでよいでしょう。そうすれば、プログラミングについて心配する必要さえありません。ただし、ソフトウェアで行う必要がある場合は、ARMのこのドキュメントを参照してください。main()もう一度呼び出すことはできません。

void reset (void)
{
    ((void (code *) (void)) 0x0000) ();
}

周辺機器はリセットされませんが、少なくともコードは再初期化されます。

于 2013-10-18T22:24:47.993 に答える
1

RST通常、ピンとグランドの間にリセットボタンを接続します。ピンは弱いプルアップ抵抗でハイに保持するRST必要がありますが、ボタンを押すとこのピンが接地され、ハード リセットが実行されます。

ボタンを再配線できない場合は、そのピンを割り込みにベクトルすることができます。次に、割り込みで、プロセッサのソフトリセットをトリガーできます。これは、現在の関数が終了するのを待つ必要はありません。

Phil が上で指摘したように、とにかく最上位にスーパーループが必要になる可能性が最も高いでしょう。main を自分で呼び出すことはまったく普通ではありません。

于 2013-10-19T02:07:01.887 に答える