當(dāng)前位置:首頁 > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]標(biāo)準(zhǔn)MCS-51以及很多常見的51內(nèi)核單片機(jī)沒有提供“軟復(fù)位”方法。本文分別以5lasm子程序和C51函數(shù)的形式,為MCS-51單片機(jī)系統(tǒng)提供完善的“軟復(fù)位”方法。

摘要 在沒有硬件看門狗的系統(tǒng)以及一些對(duì)單片機(jī)I/O口線狀態(tài)高度敏感的系統(tǒng)中,軟復(fù)位功能相當(dāng)重要。標(biāo)準(zhǔn)MCS-51以及很多常見的51內(nèi)核單片機(jī)沒有提供“軟復(fù)位”方法。本文分別以5lasm子程序和C51函數(shù)的形式,為MCS-51單片機(jī)系統(tǒng)提供完善的“軟復(fù)位”方法。
關(guān)鍵詞 MCS-51單片機(jī)軟復(fù)位51asm C51


引 言
    復(fù)位是單片機(jī)的初始化操作,其作用是使單片機(jī)和系統(tǒng)中其他部件處于一個(gè)確定的初始狀態(tài),并從這個(gè)狀態(tài)開始工作。
    標(biāo)準(zhǔn)MCS-51的復(fù)位邏輯比較簡(jiǎn)單,只有通過復(fù)位引腳RST進(jìn)行外部擴(kuò)展。對(duì)于具有外部看門狗芯片的系統(tǒng),當(dāng)單片機(jī)由于某種原因程序“跑飛”而沒有按時(shí)“喂狗”,或由軟件陷阱捕捉到程序運(yùn)行的異常,而故意不“喂狗”時(shí),看門狗芯片會(huì)給單片機(jī)的RST引腳提供一個(gè)復(fù)位信號(hào),讓單片機(jī)進(jìn)行一次“硬”復(fù)位,以恢復(fù)程序的正常運(yùn)行;有些5l內(nèi)核的單片機(jī)具有片內(nèi)的看門狗,或者提供可訪問的寄存器實(shí)現(xiàn)“軟件復(fù)位”。一般實(shí)現(xiàn)的也都是與在RST引腳提供復(fù)位信號(hào)等價(jià)的“硬”復(fù)位。
    在有些應(yīng)用中,由于單片機(jī)所接外設(shè)嚴(yán)格依附干單片機(jī)口線的時(shí)序,甚至不允許硬件復(fù)位時(shí)對(duì)口線的復(fù)位操作;或由于系統(tǒng)沒有外部看門狗,只能用軟件監(jiān)測(cè)程序運(yùn)行異常并重新對(duì)單片機(jī)進(jìn)行初始化操作,這時(shí)就需要所謂的“軟復(fù)位”了。
    在互聯(lián)網(wǎng)上可以找到一些軟復(fù)位的方法,但都不夠完善或不方便使用,基于C5l的軟復(fù)位更是一個(gè)難點(diǎn)。本文提出一種功能完善、占用資源少的實(shí)現(xiàn)方法,在51asm和C51下都可方便使用。

1 “軟復(fù)位”要實(shí)現(xiàn)的功能
   
對(duì)于MCS-51系統(tǒng),所謂“軟復(fù)位”是一種由用戶軟件控制的復(fù)位活動(dòng),利用一系列指令來模擬硬件復(fù)位所實(shí)現(xiàn)的各種操作內(nèi)容,并且重新從頭開始執(zhí)行用戶程序。其內(nèi)容包括:
    ①程序計(jì)數(shù)器PC的復(fù)位,從0000H開始執(zhí)行程序;
    ②中斷優(yōu)先級(jí)狀態(tài)觸發(fā)器的復(fù)位;
    ③特殊功能寄存器的復(fù)位;
    ④程序跑飛前狀態(tài)的盡量恢復(fù)。
    其中,特殊功能寄存器的復(fù)位可根據(jù)具體系統(tǒng)的需要,在軟復(fù)位以前對(duì)相關(guān)寄存器逐個(gè)賦值再軟復(fù)位的方法完成,或在復(fù)位以后的初始化程序中實(shí)現(xiàn);程序跑飛前狀態(tài)的恢復(fù)也可根據(jù)RAM中存留的數(shù)據(jù)來進(jìn)行判斷處理。本文重點(diǎn)討論關(guān)于程序計(jì)數(shù)器的復(fù)位和中斷優(yōu)先級(jí)狀態(tài)觸發(fā)器的復(fù)位,在此基礎(chǔ)上不難再增加特殊功能寄存器的復(fù)位和程序跑飛前狀態(tài)的恢復(fù),下文不再涉及相關(guān)代碼。
    程序計(jì)數(shù)器的復(fù)位容易實(shí)現(xiàn),一條“LJMP 0000H”即可。中斷優(yōu)先級(jí)狀態(tài)觸發(fā)器的復(fù)位則比較困難,由于它們對(duì)于用戶程序是不可見的,無法直接讀寫其內(nèi)容,只有用RETI指令才能清除。又由于51單片機(jī)兩級(jí)中斷機(jī)制,低優(yōu)先級(jí)中斷有可能被高優(yōu)先級(jí)中斷再次中斷而形成中斷再入,而一次RETl只能退出當(dāng)前優(yōu)先級(jí)中斷并清除相應(yīng)的中斷優(yōu)先級(jí)狀態(tài)觸發(fā)器,因此最壞情況下需要兩次RETI才能確保中斷優(yōu)先級(jí)狀態(tài)觸發(fā)器的復(fù)位。綜合考慮,可先用壓棧的方法準(zhǔn)備跳轉(zhuǎn)后的入口地址,再用RETI來完成跳轉(zhuǎn)和清除中斷優(yōu)先級(jí)狀態(tài)觸發(fā)器的雙重任務(wù),把以上過程執(zhí)行兩次,前一次的目標(biāo)地址是后一次的入口,后一次則跳轉(zhuǎn)到0000H,完成復(fù)位過程。


2 軟復(fù)位的實(shí)現(xiàn)方法
   
前已述及軟復(fù)位要完成的功能,包含程序計(jì)數(shù)器PC的復(fù)位、中斷優(yōu)先級(jí)狀態(tài)觸發(fā)器的復(fù)位、特殊功能寄存器的復(fù)位(略)和程序跑飛前狀態(tài)的恢復(fù)(略)。下面分別用匯編程序和C51程序來實(shí)現(xiàn),重點(diǎn)介紹C51程序的實(shí)現(xiàn)方法。
2.1 51asm匯編程序?qū)崿F(xiàn)


   
使用時(shí),在軟件陷阱處理程序段或軟件看門狗中用“LJMP #RST_O”指令跳轉(zhuǎn)到此段程序入口處即可。
2.2 C51程序?qū)崿F(xiàn)
    用C語言實(shí)現(xiàn)MCS-51系統(tǒng)的軟復(fù)位,互聯(lián)網(wǎng)上出現(xiàn)過多種版本,但都不夠完善。以下基于業(yè)界應(yīng)用最廣泛的編譯器Keil C51來討論。如:


    這段程序,用強(qiáng)制類型轉(zhuǎn)換把地址0000H轉(zhuǎn)換成re-set_not_best_O()函數(shù)的入口。實(shí)際上調(diào)用函數(shù)reset_not_best_O()等價(jià)于“LJMP 0000H”,沒有處理可能的中斷狀態(tài)問題。
    又如:


    這段代碼中,一維字符數(shù)組中為復(fù)位代碼的機(jī)器碼。“(*((Void(*)())(rst)))()”是把rst這個(gè)字符數(shù)組的地址強(qiáng)制轉(zhuǎn)換成函數(shù)指針,并調(diào)用。實(shí)際上調(diào)用函數(shù)reset_not_best_1()是執(zhí)行了一段如下代碼:

   
    可見,調(diào)用一次reset_not_best_l()函數(shù)相當(dāng)于執(zhí)行了1次清除中斷優(yōu)先級(jí)狀態(tài)觸發(fā)器的動(dòng)作,然后跳轉(zhuǎn)到0000H重新執(zhí)行。但此段代碼仍然可能被再次中斷失效,或者當(dāng)原來堆棧已經(jīng)溢出時(shí)導(dǎo)致對(duì)0000H地址的壓棧錯(cuò)誤,不能正確實(shí)現(xiàn)“軟復(fù)位”功能。除此之外,由于KeilC5l在把控制權(quán)交給函數(shù)main()之前對(duì)內(nèi)部RAM進(jìn)行初始化的代碼是:

   
    此處R0作為循環(huán)變量使用,對(duì)內(nèi)部RAM從7FH單元開始,按照每次遞減的方法對(duì)內(nèi)部RAM逐一進(jìn)行清零。當(dāng)R0指向00H時(shí),以上程序可以很好地完成清零工作;然而R0依據(jù)RS0、RSl取值的不同,可以指向00H、08H、10H或18H單元。當(dāng):R0指向08H、10H或18H時(shí),上面所列清零程序?qū)⑾萑胨姥h(huán)。分析如下:
    以RS0=1、RSl=0,即RO指向08H為例。自標(biāo)號(hào)LOOP處起始的循環(huán)進(jìn)入時(shí)的狀態(tài)是:R0=7FH,PC=#LOOP。設(shè)程序已執(zhí)行到R0=08H,PC=#LOOP,此時(shí)執(zhí)行PC指向處的指令“MOV @RO,A”,將把(RO)清零,也即08H單元清零。由于R0指向08H,實(shí)際上R0也被清零了,此時(shí)RO=00H,PC=#LOOPl;再執(zhí)行一條指令“DJNZ R0,LOOP”,R0將由00H自減為OFFH,回到R0=OFFH,PC=#LOOP的狀態(tài);繼續(xù)執(zhí)行,將再次出現(xiàn)R0==08H,PC=#LOOP的狀態(tài),陷入死循環(huán)。當(dāng)R0指向10H或18H單元時(shí)也類似會(huì)陷入死循環(huán)。為了避免上述問題,可以把字符數(shù)組中機(jī)器碼改為與以下程序段對(duì)應(yīng):

   
    調(diào)用改造后的reset_not_best_l()函數(shù)將清除中斷優(yōu)先級(jí)狀態(tài)觸發(fā)器,并跳轉(zhuǎn)到0000H單元繼續(xù)執(zhí)行,從而實(shí)現(xiàn)了軟復(fù)位。但由于只執(zhí)行了1次RETT指令,在復(fù)位前出現(xiàn)了中斷再入的極端情況下,仍會(huì)出現(xiàn)低優(yōu)先級(jí)中斷放鎖死的現(xiàn)象。由于無法在字符數(shù)組中實(shí)現(xiàn)對(duì)最終代碼地址的取得,無法如2.1節(jié)匯編程序中的“MOV DPTR,#RSTl”一樣讀取絕對(duì)地址,因此也無法實(shí)現(xiàn)如同2.1節(jié)中的兩次RETl來保證清除全部的中斷優(yōu)先級(jí)狀態(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ù)位):

   
    但這種辦法有兩個(gè)弊端:其一,萬一在程序跑飛時(shí)剛好處在中斷再入中,且flag所在的RAM地址中由于某種原因恰好是0x55,低級(jí)中斷仍是被鎖死的;其二,Keil C5l的缺省編譯模式是加上了初始化程序段startup.A51的,在這段程序中對(duì)全部的內(nèi)部RAM都進(jìn)行了初始化,復(fù)位標(biāo)志也會(huì)被清0,flag將失效。因此要正常使用標(biāo)志flag必須手工修改startup.A5l,不要清除flag單元,或者禁止stanup.A5l的使用,自己對(duì)內(nèi)部RAM進(jìn)行初始化,都比較繁瑣。
    若用以下reset_best()函數(shù),則可順利解決上述問題:

   
    在此函數(shù)中,首先定義了結(jié)構(gòu)體類型ResetStruct,它包含字符數(shù)組rstcode和16位整型數(shù)addr兩個(gè)成員。在結(jié)構(gòu)體變量的RST實(shí)例中,RST.rstcode是復(fù)位代碼對(duì)應(yīng)的機(jī)器碼,RST.a(chǎn)ddr的值是RST.rstcode這個(gè)數(shù)組的首地址+偏移量0x15。其實(shí)是以下匯編代碼中標(biāo)號(hào)rstl處的地址,也即是“#rstl”,由Keil C51在編譯時(shí)自動(dòng)計(jì)算得到。


    此reset_best()函數(shù)巧妙地利用C語言中數(shù)組名即是數(shù)組首地址(其實(shí)質(zhì)就是這一段“軟復(fù)位”代碼的入口地址!),把數(shù)組名+偏移量0x15賦值給結(jié)構(gòu)體的int型的成員addr,則正好把軟復(fù)位代碼中標(biāo)號(hào)rstl的入口地址兩個(gè)字節(jié)取了出來(由KeilC51在編譯連接時(shí)完成),存放在RST.a(chǎn)ddr中,由于結(jié)構(gòu)體連續(xù)存儲(chǔ),RST.a(chǎn)ddr會(huì)緊接著軟復(fù)位代碼RST.rstcode存放。見上段程序中的“DB #LOW(rstcode+OFH)”和“DB #HIGH(rstcode+09H)”。
    當(dāng)本程序被調(diào)用并執(zhí)行到“MOVC A,@A+PC”時(shí),分兩次取到的分別是“#rstl”的低位和高位字節(jié),把它們壓棧以后再調(diào)用RETI指令,除了清除可能有的中斷優(yōu)先級(jí)狀態(tài)記錄外,還會(huì)跳轉(zhuǎn)到rstl執(zhí)行后續(xù)的連續(xù)兩次壓棧操作,把第2次RETI的返回地址設(shè)為0000H,再通過緊接著的RETI指令,清除可能還有的中斷優(yōu)先級(jí)狀態(tài)記錄,并跳轉(zhuǎn)到0000H完成完整的復(fù)位操作。
    本程序使用一個(gè)C51函數(shù)完成了完整的包含兩次RETI在內(nèi)的復(fù)位操作,消除了所有已知隱患,只需在應(yīng)用程序中包含此reset_best()函數(shù),在需要軟復(fù)位時(shí)調(diào)用即可。2.1節(jié)中所列匯編語言的子程序也可使用本節(jié)分析時(shí)所用匯編代碼代替。


結(jié) 語
   
本文對(duì)MCS-51單片機(jī)的“軟復(fù)位”進(jìn)行了深入討論,給出了分別基于51asm的匯編子程序和基于C5l的函數(shù)。使用本文所述的“軟復(fù)位”方法,無論是5lasm程序還是C51程序,所需的資源消耗都很小,只占用二三十個(gè)字節(jié)的程序存儲(chǔ)器,使用也非常簡(jiǎn)單,不會(huì)增加編程負(fù)擔(dān)。當(dāng)具體應(yīng)用系統(tǒng)還需進(jìn)行特殊功能寄存器的復(fù)位以度程序跑飛前狀態(tài)的恢復(fù)時(shí),在此基礎(chǔ)上也很容易實(shí)現(xiàn)。特別是當(dāng)單片機(jī)所接外設(shè)嚴(yán)格依附于單片機(jī)口線的時(shí)序,須盡量避免硬件復(fù)位對(duì)口線的復(fù)位操作或系統(tǒng)不具備硬件看門狗時(shí),對(duì)于提高單片機(jī)系統(tǒng)的抗干擾能力有較大的實(shí)用價(jià)值。實(shí)際應(yīng)用表明,這種軟復(fù)位方法是非常有效的。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉