




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、MCS-51系統軟復位的深入研究摘要 在沒有硬件看門狗的系統以及一些對單片機IO口線狀態高度敏感的系統中,軟復位功能相當重要。標準MCS-51以及很多常見的51內核單片機沒有提供“軟復位”方法。本文分別以5lasm子程序和C51函數的形式,為MCS-51單片機系統提供完善的“軟復位”方法。關鍵詞 MCS-51單片機軟復位51asm C51 引 言 復位是單片機的初始化操作,其作用是使單片機和系統中其他部件處于一個確定的初始狀態,并從這個狀態開始工作。 標準MCS-51的復位邏輯比較簡單,只有通過復位引腳RST進行外部擴展。
2、對于具有外部看門狗芯片的系統,當單片機由于某種原因程序“跑飛”而沒有按時“喂狗”,或由軟件陷阱捕捉到程序運行的異常,而故意不“喂狗”時,看門狗芯片會給單片機的RST引腳提供一個復位信號,讓單片機進行一次“硬”復位,以恢復程序的正常運行;有些5l內核的單片機具有片內的看門狗,或者提供可訪問的寄存器實現“軟件復位”。一般實現的也都是與在RST引腳提供復位信號等價的“硬”復位。 在有些應用中,由于單片機所接外設嚴格依附干單片機口線的時序,甚至不允許硬件復位時對口線的復位操作;或由于系統沒有外部看門狗,只能用軟件監測程序運行異常并重新對單片機進行初始化操作,這時就需
3、要所謂的“軟復位”了。 在互聯網上可以找到一些軟復位的方法,但都不夠完善或不方便使用,基于C5l的軟復位更是一個難點。本文提出一種功能完善、占用資源少的實現方法,在51asm和C51下都可方便使用。1 “軟復位”要實現的功能 對于MCS-51系統,所謂“軟復位”是一種由用戶軟件控制的復位活動,利用一系列指令來模擬硬件復位所實現的各種操作內容,并且重新從頭開始執行用戶程序。其內容包括: 程序計數器PC的復位,從0000H開始執行程序; 中斷優先級狀態觸發
4、器的復位; 特殊功能寄存器的復位; 程序跑飛前狀態的盡量恢復。 其中,特殊功能寄存器的復位可根據具體系統的需要,在軟復位以前對相關寄存器逐個賦值再軟復位的方法完成,或在復位以后的初始化程序中實現;程序跑飛前狀態的恢復也可根據RAM中存留的數據來進行判斷處理。本文重點討論關于程序計數器的復位和中斷優先級狀態觸發器的復位,在此基礎上不難再增加特殊功能寄存器的復位和程序跑飛前狀態的恢復,下文不再涉及相關代碼。 程序計數器的復位容易實現,一條“LJMP 000
5、0H”即可。中斷優先級狀態觸發器的復位則比較困難,由于它們對于用戶程序是不可見的,無法直接讀寫其內容,只有用RETI指令才能清除。又由于51單片機兩級中斷機制,低優先級中斷有可能被高優先級中斷再次中斷而形成中斷再入,而一次RETl只能退出當前優先級中斷并清除相應的中斷優先級狀態觸發器,因此最壞情況下需要兩次RETI才能確保中斷優先級狀態觸發器的復位。綜合考慮,可先用壓棧的方法準備跳轉后的入口地址,再用RETI來完成跳轉和清除中斷優先級狀態觸發器的雙重任務,把以上過程執行兩次,前一次的目標地址是后一次的入口,后一次則跳轉到0000H,完成復位過程。2 / 112 軟復位的實現方法
6、160; 前已述及軟復位要完成的功能,包含程序計數器PC的復位、中斷優先級狀態觸發器的復位、特殊功能寄存器的復位(略)和程序跑飛前狀態的恢復(略)。下面分別用匯編程序和C51程序來實現,重點介紹C51程序的實現方法。21 51asm匯編程序實現 使用時,在軟件陷阱處理程序段或軟件看門狗中用“LJMP #RST_O”指令跳轉到此段程序入口處即可。22 C51程序實現 用C語言實現MCS-51系統的軟復位,互聯網上出現過多種版本,但都不夠完善。以下基于業界應用最廣泛的編譯器Keil C51來討論。如: &
7、#160; 這段程序,用強制類型轉換把地址0000H轉換成re-set_not_best_O()函數的入口。實際上調用函數reset_not_best_O()等價于“LJMP 0000H”,沒有處理可能的中斷狀態問題。 又如: 這段代碼中,一維字符數組中為復位代碼的機器碼。“(*(Void(*)()(rst)()”是把rst這個字符數組的地址強制轉換成函數指針,并調用。實際上調用函數reset_not_best_1()是執行了一段如下代碼:
8、; 可見,調用一次reset_not_best_l()函數相當于執行了1次清除中斷優先級狀態觸發器的動作,然后跳轉到0000H重新執行。但此段代碼仍然可能被再次中斷失效,或者當原來堆棧已經溢出時導致對0000H地址的壓棧錯誤,不能正確實現“軟復位”功能。除此之外,由于KeilC5l在把控制權交給函數main()之前對內部RAM進行初始化的代碼是: 此處R0作為循環變量使用,對內部RAM從7FH單元開始,按照每次遞減的方法對內部RAM逐一進行清零。當R0指向00H時,以上程序可以很好地完成清零工作;然而R0依據RS0、RS
9、l取值的不同,可以指向00H、08H、10H或18H單元。當:R0指向08H、10H或18H時,上面所列清零程序將陷入死循環。分析如下: 以RS0=1、RSl=0,即RO指向08H為例。自標號LOOP處起始的循環進入時的狀態是:R0=7FH,PC=#LOOP。設程序已執行到R0=08H,PC=#LOOP,此時執行PC指向處的指令“MOV RO,A”,將把(RO)清零,也即08H單元清零。由于R0指向08H,實際上R0也被清零了,此時RO=00H,PC=#LOOPl;再執行一條指令“DJNZ R0,LOOP”,R0將由00H自減為OFFH,回到R0=OFFH,
10、PC=#LOOP的狀態;繼續執行,將再次出現R0=08H,PC=#LOOP的狀態,陷入死循環。當R0指向10H或18H單元時也類似會陷入死循環。為了避免上述問題,可以把字符數組中機器碼改為與以下程序段對應: 調用改造后的reset_not_best_l()函數將清除中斷優先級狀態觸發器,并跳轉到0000H單元繼續執行,從而實現了軟復位。但由于只執行了1次RETT指令,在復位前出現了中斷再入的極端情況下,仍會出現低優先級中斷放鎖死的現象。由于無法在字符數組中實現對最終代碼地址的取得,無法如21節匯編程序中的“MOV DPT
11、R,#RSTl”一樣讀取絕對地址,因此也無法實現如同21節中的兩次RETl來保證清除全部的中斷優先級狀態觸發器。解決的辦法是,在內存中設置標志flag,每次復位后都檢查特定標志,接如下偽代碼來判定(假定復位標志設為0x55,若復位后發現標志字為0x55則轉正常初始化程序,否則置復位標志為0x55,再次復位): 但這種辦法有兩個弊端:其一,萬一在程序跑飛時剛好處在中斷再入中,且flag所在的RAM地址中由于某種原因恰好是0x55,低級中斷仍是被鎖死的;其二,Keil C5l的缺省編譯模式是加上了初始化程序段startupA
12、51的,在這段程序中對全部的內部RAM都進行了初始化,復位標志也會被清0,flag將失效。因此要正常使用標志flag必須手工修改startupA5l,不要清除flag單元,或者禁止stanupA5l的使用,自己對內部RAM進行初始化,都比較繁瑣。 若用以下reset_best()函數,則可順利解決上述問題: 在此函數中,首先定義了結構體類型ResetStruct,它包含字符數組rstcode和16位整型數addr兩個成員。在結構體變量的RST實例中,RSTrstcode是復位代碼對應的
13、機器碼,RSTaddr的值是RSTrstcode這個數組的首地址+偏移量0x15。其實是以下匯編代碼中標號rstl處的地址,也即是“#rstl”,由Keil C51在編譯時自動計算得到。 此reset_best()函數巧妙地利用C語言中數組名即是數組首地址(其實質就是這一段“軟復位”代碼的入口地址!),把數組名+偏移量0x15賦值給結構體的int型的成員addr,則正好把軟復位代碼中標號rstl的入口地址兩個字節取了出來(由KeilC51在編譯連接時完成),存放在RSTaddr中,由于結構體連續存儲,RSTaddr會緊接著軟復位代碼RSTrstcode存放。
14、見上段程序中的“DB #LOW(rstcode+OFH)”和“DB #HIGH(rstcode+09H)”。 當本程序被調用并執行到“MOVC A,A+PC”時,分兩次取到的分別是“#rstl”的低位和高位字節,把它們壓棧以后再調用RETI指令,除了清除可能有的中斷優先級狀態記錄外,還會跳轉到rstl執行后續的連續兩次壓棧操作,把第2次RETI的返回地址設為0000H,再通過緊接著的RETI指令,清除可能還有的中斷優先級狀態記錄,并跳轉到0000H完成完整的復位操作。 本程序使用一個C51函數完成了完整的包含兩次RETI在內的復位操作,消除了所有已知隱患,只需在應用程序中包含此reset_best()函數,在需要軟復位時調用即可。21節中所列匯編語言的子程序也可使用本節分析時所用匯編代碼代替。結 語 本文對MCS-51單片機的“軟復位”進行了深入討論,給出了分別基于51asm的匯編子程序和基于C5
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 建筑初步清吧設計方案
- 2025-2026學年無錫市數學三年級第一學期期末質量檢測試題含解析
- 備考公共關系學的重點與試題及答案
- 公共關系學的挑戰與機遇試題與答案討論
- 2025年中級經濟師考試的校園系列活動試題及答案
- 2022 年中級會計師考試《中級財務管理》真題及解析(9 月 3 日)
- 環保設備維護與更新手冊
- 建筑學建筑設計原則題庫
- 日用百貨供應協議
- 2025市政工程考試答案解析試題及答案
- 《榮安地產公司財務風險研究與防范研究(定量論文)》8200字
- 【MOOC】理性思維實訓-華南師范大學 中國大學慕課MOOC答案
- (翻譯)UL6A標準中文版-2019版電氣剛性金屬導管-鋁紅黃銅和不銹鋼
- 2024年信息系統項目管理師(綜合知識、案例分析、論文)合卷軟件資格考試(高級)試題與參考答案
- 小學班會 以“心”迎新 攜手同行-二年級數學開學家長會 課
- 疑似新冠肺炎的應急演練
- 資治通鑒介紹課件
- 2025年湖北省武漢市高考數學模擬試卷(附答案解析)
- 賽迪顧問一線調研第36期:中國人工智能醫療器械:前路漫漫仍需披荊斬棘
- 配電工程 投標方案(技術方案)
- GB/T 19274-2024土工合成材料塑料土工格室
評論
0/150
提交評論