




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
精心整理精心整理MCS-51系統(tǒng)軟復(fù)位的深入研究摘要在沒有硬件看門狗的系統(tǒng)以及一些對單片機I/O口線狀態(tài)高度敏感的系統(tǒng)中,軟復(fù)位功能相當(dāng)重要。標(biāo)準(zhǔn)MCS-51以及很多常見的51內(nèi)核單片機沒有提供“軟復(fù)位”方法。本文分別以5lasm子程序和C51函數(shù)的形式,為MCS-51單片機系統(tǒng)提供完善的“軟復(fù)位”方法。關(guān)鍵詞MCS-51單片機軟復(fù)位51asmC51引言???復(fù)位是單片機的初始化操作,其作用是使單片機和系統(tǒng)中其他部件處于一個確定的初始狀態(tài),并從這個狀態(tài)開始工作。???標(biāo)準(zhǔn)MCS-51的復(fù)位邏輯比較簡單,只有通過復(fù)位引腳RST進(jìn)行外部擴展。對于具有外部看門狗芯片的系統(tǒng),當(dāng)單片機由于某種原因程序“跑飛”而沒有按時“喂狗”,或由軟件陷阱捕捉到程序運行的異常,而故意不“喂狗”時,看門狗芯片會給單片機的RST引腳提供一個復(fù)位信號,讓單片機進(jìn)行一次“硬”復(fù)位,以恢復(fù)程序的正常運行;有些51內(nèi)核的單片機具有片內(nèi)的看門狗,或者提供可訪問的寄存器實現(xiàn),軟件復(fù)位”。一般實現(xiàn)的也都是與在RST引腳提供復(fù)位信號等價的“硬”復(fù)位。???在有些應(yīng)用中,由于單片機所接外設(shè)嚴(yán)格依附干單片機口線的時序,甚至不允許硬件復(fù)位時對口線的復(fù)位操作;或由于系統(tǒng)沒有外部
看門狗,只能用軟件監(jiān)測程序運行異常并重新對單片機進(jìn)行初始化操作,這時就需要所謂的“軟復(fù)位”了。???在互聯(lián)網(wǎng)上可以找到一些軟復(fù)位的方法,但都不夠完善或不方便使用,基于C51的軟復(fù)位更是一個難點。本文提出一種功能完善、占
用資源少的實現(xiàn)方法,在51asm和C51下都可方便使用。1“軟復(fù)位”要實現(xiàn)的功能???對于MCS-51系統(tǒng),所謂“軟復(fù)位”是一種由用戶軟件控制的復(fù)位活動,利用一系列指令來模擬硬件復(fù)位所實現(xiàn)的各種操作內(nèi)容,并且重新從頭開始執(zhí)行用戶程序。其內(nèi)容包括:???①程序計數(shù)器PC的復(fù)位,從0000H開始執(zhí)行程序;???②中斷優(yōu)先級狀態(tài)觸發(fā)器的復(fù)位;???③特殊功能寄存器的復(fù)位;???④程序跑飛前狀態(tài)的盡量恢復(fù)。???其中,特殊功能寄存器的復(fù)位可根據(jù)具體系統(tǒng)的需要,在軟復(fù)位以前對相關(guān)寄存器逐個賦值再軟復(fù)位的方法完成,或在復(fù)位以后的初始化程序中實現(xiàn);程序跑飛前狀態(tài)的恢復(fù)也可根據(jù)RAM中存留的數(shù)據(jù)來進(jìn)行判斷處理。本文重點討論關(guān)于程序計數(shù)器的復(fù)位和中斷優(yōu)先級狀態(tài)觸發(fā)器的復(fù)位,在此基礎(chǔ)上不難再增加特殊功能寄存器的復(fù)位和程序跑飛前狀態(tài)的恢復(fù),下文不再涉及相關(guān)代碼。???程序計數(shù)器的復(fù)位容易實現(xiàn),一條’LJMPOOOOH”即可。中斷優(yōu)先級狀態(tài)觸發(fā)器的復(fù)位則比較困難,由于它們對于用戶程序是不可見的,無法直接讀寫其內(nèi)容,只有用RETI指令才能清除。又由于51單片機兩級中斷機制,低優(yōu)先級中斷有可能被高優(yōu)先級中斷再次中斷而形成中斷再入,而一次RET1只能退出當(dāng)前優(yōu)先級中斷并清除相應(yīng)的中斷優(yōu)先級狀態(tài)觸發(fā)器,因此最壞情況下需要兩次RETI才能確保中斷優(yōu)先級狀態(tài)觸發(fā)器的復(fù)位。綜合考慮,可先用壓棧的方法準(zhǔn)備跳轉(zhuǎn)后的入口地址,再用RETI來完成跳轉(zhuǎn)和清除中斷優(yōu)先級狀態(tài)觸發(fā)器的雙重任務(wù),把以上過程執(zhí)行兩次,前一次的目標(biāo)地址是后一次的入口,后一次則跳轉(zhuǎn)到0000H,完成復(fù)位過程。2軟復(fù)位的實現(xiàn)方法???前已述及軟復(fù)位要完成的功能,包含程序計數(shù)器PC的復(fù)位、中斷優(yōu)先級狀態(tài)觸發(fā)器的復(fù)位、特殊功能寄存器的復(fù)位略)和程序跑飛前狀態(tài)的恢復(fù)(略)。下面分別用匯編程序和C51程序來實現(xiàn),重點介紹C51程序的實現(xiàn)方法。2.151asm匯編程序?qū)崿F(xiàn)PUSHrusHRET1RETPUSHPUSH;OOOOH^???使用時,在軟件陷阱處理程序段或軟件看門狗中用“LJMP#RST_O”指令跳轉(zhuǎn)到此段程序入口處即可。2.2C51程序?qū)崿F(xiàn)???用C語言實現(xiàn)MCS-51系統(tǒng)的軟復(fù)位,互聯(lián)網(wǎng)上出現(xiàn)過多種版本,但都不夠完善。以下基于業(yè)界應(yīng)用最廣泛的編譯器KeilC51來討論。如:CLREA;關(guān)屮斷,避免軟復(fù)位過程被中斷CLRRSO;置寄存器組為第0紐,消除町能出現(xiàn);的隱患(下文有詳述)CLRRSIP(JPACC字彈出堆棧中2字背.避免原來堆找可;能已經(jīng)溢出造成后續(xù)壓棧錯誤POPACCMOVDJH'R,#RST_1;軟復(fù)位入口;準(zhǔn)備第1次RET1的返冋地址,;返回地址壓棧;清除中斷優(yōu)先級狀態(tài)觸發(fā)器?并跳轉(zhuǎn)到訂藥丁一I.若調(diào)用RST-0之前未進(jìn)入中;斷?則相當(dāng)于"LJMPtRST'準(zhǔn)備第2次RETI的返冋地址.設(shè)溝匚返回地址壓棧;再次清除中斷優(yōu)先級狀態(tài)觸發(fā)器.若進(jìn);人此軟復(fù)位程序段前單片機處于中斷再;人狀態(tài),則需由RETI來清除余F的低優(yōu):先級中斷的中斷激活標(biāo)志若未進(jìn)人中斷*;則此段程序相當(dāng)于TJMF#OOOOH"精心整理精心整理頁眉內(nèi)容voidrcsct?n(}t_hest_()(void)£({void(code*Xvoid))0x0000)();???這段程序,用強制類型轉(zhuǎn)換把地址0000H轉(zhuǎn)換成re-set_not_best_O()函數(shù)的入口。實際上調(diào)用函數(shù)reset_not_best_O()等價于"LJMP0000H”,沒有處理可能的中斷狀態(tài)問題。???又如:voidreset_not_bcst_l()彳unsignedcharcoderstI]={0xe4.OxcO>OxcO?OxcO,OxcO?0x32};(*(〔void(*)0)(rst)))();}???這段代碼中,一維字符數(shù)組中為復(fù)位代碼的機器碼?!?*((Void(*)())(rst)))()”是把rst這個字符數(shù)組的地址強制轉(zhuǎn)換成函數(shù)指針,并調(diào)用。實際上調(diào)用函數(shù)reset_not_best_1()是執(zhí)行了一段如下代碼:CLRAPUSHACCPUSHACCRETI??????可見,調(diào)用一次reset_not_best_l()函數(shù)相當(dāng)于執(zhí)行了1次清除中斷優(yōu)先級狀態(tài)觸發(fā)器的動作,然后跳轉(zhuǎn)到0000H重新執(zhí)行。但此段代碼仍然可能被再次中斷失效,或者當(dāng)原來堆棧已經(jīng)溢出時導(dǎo)致對0000H地址的壓棧錯誤,不能正確實現(xiàn)“軟復(fù)位”功能。除此之外,由于KeilC5l在把控制權(quán)交給函數(shù)main()之前對內(nèi)部RAM進(jìn)行初始化的代碼是:CLRRAM:MOVCLRL()()P:MOVLOOP1:DJNZ???R0>M7FH???AARO,LOOP???此處RO作為循環(huán)變量使用,對內(nèi)部RAM從7FH單元開始,按照每次遞減的方法對內(nèi)部RAM逐一進(jìn)行清零。當(dāng)R0指向00H時,以上程序可以很好地完成清零工作;然而R0依據(jù)RSO、RSl取值的不同,可以指向OOH、08H、10H或18H單元。當(dāng):R0指向08H、10H或18H時,上面所列清零程序?qū)⑾萑胨姥h(huán)。分析如下:???以RS0=1、RSl=O,即RO指向08H為例。自標(biāo)號LOOP處起始的循環(huán)進(jìn)入時的狀態(tài)是:R0=7FH,PC=#LOOP。設(shè)程序已執(zhí)行到R0=08H,PC=#LOOP,此時執(zhí)行PC指向處的指令“MOV@RO,A”,將把(RO)清零,也即08H單元清零。由于R0指向08H,實際上R0也被清零了,此時RO=00H,PC=#LOOPl;再執(zhí)行一條指令“DJNZR0,LOOP”,R0將由00H自減為OFFH,回到R0=OFFH,PC=#L頁眉內(nèi)容頁眉內(nèi)容OOP的狀態(tài);繼續(xù)執(zhí)行,將再次出現(xiàn)R0==08H,PC=#LOOP的狀態(tài),陷入死循環(huán)。當(dāng)R0指向10H或18H單元時也類似會陷入死循環(huán)。為了避免上述問題,可以把字符數(shù)組中機器碼改為與以下程序段對應(yīng):CLREAi關(guān)中斷.避免軟復(fù)位過程被中斷POPACC$彈出堆棧中兩字節(jié)卞避免原來堆??赡?已經(jīng)溢出造成后續(xù)錯誤POPACCCLRRS0,置寄存器組為第0組,消除可能出現(xiàn)的;死循環(huán)CLRRSICLRA;準(zhǔn)備第2次RETI的返回地址?設(shè)為"00OOH"PUSHACC;返回地址低位壓棧PUSHACC;返回地址高位壓棧RETI;清除中斷優(yōu)先級狀態(tài)觸發(fā)器即改為:unsignedcharcoderst^J=(0xc2,0xaft0xd0,0xe0t0xdO,0xe0>0xc2,0xd3,0,0xd4?0xe4,0xc0,0xe0.OxcO,OxeO,Ox32}??????調(diào)用改造后的reset_not_best_l()函數(shù)將清除中斷優(yōu)先級狀態(tài)觸發(fā)器,并跳轉(zhuǎn)到0000H單元繼續(xù)執(zhí)行,從而實現(xiàn)了軟復(fù)位。但由于只執(zhí)行了1次RETT指令,在復(fù)位前出現(xiàn)了中斷再入的極端情況下,仍會出現(xiàn)低優(yōu)先級中斷放鎖死的現(xiàn)象。由于無法在字符數(shù)組中實現(xiàn)對最終代碼地址的取得,無法如2.1節(jié)匯編程序中的“MOVDPTR,#RSTI”一樣讀取絕對地址,因此也無法實現(xiàn)如同2.1節(jié)中的兩次RETl來保證清除全部的中斷優(yōu)先級狀態(tài)觸發(fā)器。解決的辦法是,在內(nèi)存中設(shè)置標(biāo)志flag,每次復(fù)位后都檢查特定標(biāo)志,接如下偽代碼來判定(假定復(fù)位標(biāo)志設(shè)為0x55,若復(fù)位后發(fā)現(xiàn)標(biāo)志字為0x55則轉(zhuǎn)正常初始化程序,否則置復(fù)位標(biāo)志為0x55,再次復(fù)位):若(flag--0x55),則{已進(jìn)行兩次復(fù)位,轉(zhuǎn)正常初始化程序段運行■}否則{置flag=0x55?調(diào)用函數(shù)rcsei_not_best_l(),再進(jìn)行一次復(fù)位???????但這種辦法有兩個弊端:其一,萬一在程序跑飛時剛好處在中斷再入中,且flag所在的RAM地址中由于某種原因恰好是0x55,低級中斷仍是被鎖死的;其二,KeilC5l的缺省編譯模式是加上了初始化程序段startup.A51的,在這段程序中對全部的內(nèi)部RAM都進(jìn)行了初始化,復(fù)位標(biāo)志也會被清0,flag將失效。因此要正常使用標(biāo)志flag必須手工修改startup.A5l,不要清除flag單元,或者禁止stanup.A5l的使用,自己對內(nèi)部RAM進(jìn)行初始化,都比較繁瑣。???若用以下reset_best()函數(shù),則可順利解決上述問題:精心整理頁眉內(nèi)容頁眉內(nèi)容精心整理精心整理voidrcsel_best(){typedefstruct{unsignedcharrsrcode^27];intaddr;)ResetSrruct;RtsetStructcodeRST={{0xc2.Oxaf,OxdO,OxeO,OxdO.OxcQ,0xc2,0xc2,Oxdl,0x74,OxOf,0x83,OxcO,QxeO>0x74,0x09,0x83,QxcO?OxcO,0x32,0xe4,OxcO,0xe0,0xcOrOxcO?0x32}T{RST.rstcode+0x15}(架((void(*)0)(RSf.rstcode)))0;??????在此函數(shù)中,首先定義了結(jié)構(gòu)體類型ResetStruct,它包含字符數(shù)組rstcode和16位整型數(shù)addr兩個成員。在結(jié)構(gòu)體變量的RST實例中,RST.rstcode是復(fù)位代碼對應(yīng)的機器碼,RST.addr的值是RST.rstcode這個數(shù)組的首地址+偏移量0x15。其實是以下匯編代碼中標(biāo)號rstl處的地址,也即是“#rstl”,由KeilC51在編譯時自動計算得到。M()VCA,@A+PC;取#FnGH(rstcodc—0FH)到ACC,F實際是#HlGH(rstl)PUSHACC;把^HIGH(rstl)壓人堆棧RETT;清除中斷優(yōu)先級狀態(tài)觸發(fā)器,桃傳到rstlel:CLRA;準(zhǔn)備第2次RETI的返回地址,設(shè)為0000HPUSHACC;返冋地址壓棧PUSHA(X:RETI;再次清除中斯優(yōu)先級狀態(tài)觸發(fā)器.若進(jìn)人軟復(fù),位前單片機處于屮斷再入狀態(tài).則需由RETI來;清除余下的低級中斷的中斷優(yōu)先級狀態(tài)觸發(fā)器;$若未進(jìn)人中斷,則此段程序相當(dāng)干“口何P#OOOOFT泊ck:DBttL()W(rstuo<lc+OFTT);實為"4rstl"的低位字節(jié)DB#HitrlI(rstcode4-09H);實為■就1”的高位字節(jié)???此reset_best()函數(shù)巧妙地利用C語言中數(shù)組名即是數(shù)組首地址(其實質(zhì)就是這一段“軟復(fù)位”代碼的入口地址!),把數(shù)組名+偏移量0x15賦值給結(jié)構(gòu)體的int型的成員addr,則正好把軟復(fù)位代碼中標(biāo)號rstl的入口地址兩個字節(jié)取了出來(由KeilC51在編譯連接時完成),存放在RST.addr中,由于結(jié)構(gòu)體連續(xù)存儲,RST.addr會緊接著軟復(fù)位代碼RST.rstcode存放。見上段程序中的“DB#LOW(rstcode+OFH)”精心整理精心整理頁眉內(nèi)容和“DB#HIGH(rstcode+09H)”°???當(dāng)本程序被調(diào)用并執(zhí)行到“MOVCA,@A+PC”時,分兩次取到的分別是“#rstl”的低位和高位字節(jié),把它們壓棧以后再調(diào)用RETI指令,除了清除可能有的中斷優(yōu)先級狀態(tài)記錄外,還會跳轉(zhuǎn)到rstl執(zhí)行后續(xù)的連續(xù)兩次壓棧操作,把第2次RETI的返回地址設(shè)為0000H,再通過緊接著的RETI指令,清除可能還有的中斷優(yōu)先級狀態(tài)記錄,并跳轉(zhuǎn)到0000H完成完整的復(fù)位操作。???本程序使用一個C51函數(shù)完成了完整的包含兩次RETI在內(nèi)的復(fù)位操作,消除了所有已知隱患,只需在應(yīng)用程序中包含此reset_best()
函數(shù),在需要軟復(fù)位時調(diào)用即可。2.1節(jié)中所列匯編語言的子程序也可使用本節(jié)分析時所用匯編代碼代替。
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 公司貨款擔(dān)保合同范本
- cso公司合同范本
- 專題一第2課五、《軟件系統(tǒng)》教學(xué)設(shè)計 2023-2024學(xué)年青島版(2018)初中信息技術(shù)七年級上冊
- 15《我與地壇》教學(xué)設(shè)計 2024-2025學(xué)年統(tǒng)編版高中語文必修上冊
- 修房子木材出售合同范本
- 凍庫工程銷售合同范本
- 公裝合同范本
- 個人郊區(qū)房屋買賣合同范本
- 個人餐廳轉(zhuǎn)讓合同范本
- 2024年新鄉(xiāng)市長垣市公益性崗位招聘筆試真題
- 企業(yè)管理概論-課件全書課件完整版ppt全套教學(xué)教程最全電子教案電子講義(最新)
- 圍手術(shù)期肺部感染
- 餐飲服務(wù)食品安全監(jiān)督量化分級動態(tài)等級評定檢查表
- 北師大版語文選修《蕭蕭》ppt課件1
- 大學(xué)生職業(yè)素養(yǎng)課件-5第五單元學(xué)會有效溝通-PPT課件
- 《談骨氣》課文閱讀(共2頁)
- 病原生物與免疫學(xué)(中職)緒論PPT課件
- 新起點小學(xué)英語一年級上冊單詞卡片(共23頁)
- 蝴蝶蘭PPT課件
- 譯林版五下英語1-3單元電子稿
- 節(jié)后復(fù)工安全溫馨提示
評論
0/150
提交評論