コードのC51ホットスタートの準備

産業用制御コンピュータの場合は、多くの場合、ウォッチドッグの動作は、ホットスタートであるコンピュータを、リセット、ウォッチドッグ回路が設けられて。ウォームブートは、一般的に異常なシステム動作をもたらす、リセットに既存の測定または計算された値につながるスクラッチから開始することができません。起動時に特定の値と等しい場合(例えば、0x7Fのビットと0x7Eをビットのような)メモリユニットフラグビットは、最初に、メモリユニットの内容を読み取るかどうかを決定する。従って、プログラムウォームスタートまたはコールドスタートは、一般的なアプローチはであるかどうかを決定しなければなりませんそうでなければ、それはコールドスタートで、ホットスタートであると考えられる(例えば0xAAを2つのメモリユニットである)、プログラムの実行は、一部を初期化し、0xAAを両方のメモリセルに恵まれ。
例えば0x7Fを上記のように設計コンセプト、プログラミング、特定のメモリセルを指すようにポインタを設定することによれば、プログラムが決定され、以下のように、手順は次のとおり
ボイドメイン()
{CHAR *データHOTPOINT =(CHAR *)から0x7F;
IF( (* == HOTPOINT 0xAAを)&&(*( - HOTPOINT)== 0xAAを))
{/ *熱処理の開始* / 
}
他は
{HOTPOINT = 0x7Eを; / *コールドスタートにで
* HOTPOINT = 0xAAを、
(* HOTPOINT)= 0xAAを; 
}
/ *ワークコード* /
}
しかし、実際のデバッグがホットスタートまたはコールドスタートの両方は、ブーツの全てのメモリセルの値が0にリセットされることを見出し、当然のことながら、必要なホットスタートを達成することができません。Cプログラミング言語を使用した場合、メインに文の最初の文を開始するmain()関数は、()段落文関数の実行"の最初の文の前に実行されなければならないからこれはなぜですか?オリジナルのコードは、ブートの実装ではありませんコード」を開始します。これは、このコードは交換作業を実行しています。Cコンパイラは、ファイルを開く、CSTARTUP.A51と呼ばれ、このコードの最初のソースを提供し、次のコードを見ることができます:

IDATALEN EQUの80H、バイト単位IDATAメモリの長さ 

STARTUP1:
IF IDATALEN <> 0
。MOV R0、#IDATALEN - 1
CLR A
IDATALOOP:R0、A @ MOV
DJNZ R0、IDATALOOP
ENDIF

可視かどうかの決定を実行ホットスタートコードの前に、スタートコードは、全てのメモリセルの消去されました。?ソースファイルを変更して、コンパイルstartup.a51、GET startup.objファイルに、コンパイラが付属していますa51.exeプログラム、およびその後、使用startup.a51:それは、変更することができますどのようにこの問題を解決するために、幸いにも、ブートコードコードは、元の開始コードを交換してください。具体的な手順(Cソースは、名前のHOTSTART.Cに配置された):
変更startup.a51ソースファイル(ディレクトリC51LIBにこのファイル)。
次のコマンドを実行します。
A51 STARTUP.A51はstartup.objファイルを取得します。このファイルは、ディレクトリHOTSTART.Cにコピーします。
CソースC51.EXEでプログラムされたターゲットファイルHOTSTART.OBJを与えることをコンパイル。
L51ホットスタート、アブソリュートオブジェクトファイルのホットスタートを取得するには、接続するSTARTUP.OBJコマンドで。
HOTSTART.HEXファイルを取得し、あなたはOHS51ホットスタートを使用することができます。
7Fに6Fにstartup.a51の変更、であることを自分たちのニーズに応じて、80Hの70HにIDATALEN EQU 80Hののように、それは可能であるが、16バイトのメモリがクリアされません。

 

:から転送https://zhuanlan.zhihu.com/p/64285507

おすすめ

転載: www.cnblogs.com/WayneKhouTech/p/12032380.html