熱啟動代碼例程應用
對于工業控制計算機,往往設有有看門狗電路,當看門狗動作,使計算機復位,這就是熱啟動。熱啟動時,一般不允許從頭開始,這將導致現有的已測量到或計算到的值復位,導致系統工作異常。
因而在程序必須判斷是熱啟動還是冷啟動,常用的方法是:確定某內存單位為標志位(如0x7f位和0x7e位),啟動時首先讀該內存單元的內容,如果它等于一個特定的值(例如兩個內存單元的都是0xaa),就認為是熱啟動,否則就是冷啟動,程序執行初始化部份,并將0xaa賦與這兩個內存單元。
根據以上的設計思路,編程時,設置一個指針,讓其指向特定的內存單元如0x7f,然后在程序中判斷,程序如下:
void main()
{
char data *HotPoint=(char *)0x7f;
if((*HotPoint==0xaa)&&(*(--HotPoint)==0xaa)){else{ HotPoint=0x7e;
/*冷啟動的處進
{
else
{
*HotPoint=0xaa;
*(++HotPoint)=0xaa;
}
}
然而實際調試中發現,無論是熱啟動還是冷啟動,開機后所有內存單元的值都被復位為0,當然也實現不了熱啟動的要求。
用C語言編程時,開機時執行的代碼并非是從main()函數的第一句語句開始的,在main()函數的第一句語句執行前要先執行一段’起始代碼在執行到判斷是否熱啟動的代碼之前,起始代碼已將所有內存單元清零
1.首先修改源文件然后執行如下命令:Ax startup.ax 得到startup.obj文件。將此文件拷入HOTSTART.C所在目錄。
2.將編好的C源程序用Cx.EXE編譯好,得到目標文件HOTSTART.OBJ。
3.用 Lx HOTSTART, STARTUP.OBJ 命令連接,得到絕對目標文件HOTSTART。
4.用 OHS51 HOTSTART 得到HOTSTART.HEX文件,即可。 對于startup.ax的修改,根據自已的需要進行,如將IDATALEN EQU 80H中的80H改為70H,就可以使6F到7F的16字節內存不被清零。