探索80C51的三種非常規(guī)的復(fù)位技術(shù)(2)
——
本文將介紹三種非常規(guī)擴(kuò)展復(fù)位方式:軟件復(fù)位(SWR,software reset)、軟硬件復(fù)位(SHR,software and hardware reset)和非法地址復(fù)位(IAR,illegal address reset)。
軟件陷阱技術(shù)及其改良方法
軟件陷阱(software trap)是一種捕捉程序“跑飛”的編程方法。通常可以在程序中設(shè)置軟件陷阱,引導(dǎo)程序失控的單片機(jī)跳轉(zhuǎn)到一個(gè)指定的地址去執(zhí)行,最終回復(fù)到正常軌道上來(lái)。軟件陷阱可以設(shè)置在用戶程序的空隙處或者轉(zhuǎn)移指令之后,還可以利用一系列的陷阱指令來(lái)填充程序存儲(chǔ)器的空白區(qū)。實(shí)現(xiàn)軟件陷阱功能的指令是一個(gè)“5字節(jié)指令串”,通常包含2條單字節(jié)NOP指令和1條3字節(jié)跳轉(zhuǎn)指令。
NOP ;利用空操作指令
NOP ;來(lái)增加捕捉有效性
LJMP SWRST;無(wú)條件跳轉(zhuǎn)到指定地址去
其中“SWRST”可以是一段“軟件復(fù)位程序”的入口地址標(biāo)號(hào),也可以是復(fù)位矢量“0000H”,即主程序入口地址。
如果SWRST等于復(fù)位矢量0000H,則會(huì)把捕捉到的跑飛程序引導(dǎo)到初始化程序入口地址去執(zhí)行,從而達(dá)到回復(fù)到正常軌道的目的。這種處理方法只適合中斷功能沒有被啟用的場(chǎng)合??梢栽O(shè)想,假如是在(低級(jí)或高級(jí))中斷服務(wù)程序中跑飛的,這時(shí)即使把程序拉回到起點(diǎn),而中斷激活觸發(fā)器不能夠被清除,會(huì)影響以后的中斷請(qǐng)求無(wú)法被 CPU響應(yīng)。
如果SWRST等于“軟件復(fù)位程序”的入口地址,則會(huì)引發(fā)一次“軟件復(fù)位”。關(guān)于軟件復(fù)位程序的設(shè)計(jì)方法,隨后介紹。
總之,這種方法的指導(dǎo)思想是指,把未使用的ROM空間用跳轉(zhuǎn)引導(dǎo)指令填滿,作為軟件“陷阱”,以捕獲“飛掉”的程序,并強(qiáng)行將捕獲到的跑飛程序引向一個(gè)特定的地址,在那里由一段專門處理錯(cuò)誤的程序進(jìn)行處理,以恢復(fù)系統(tǒng)的正常運(yùn)行。為提高跑飛程序的捕獲率,通常還要在引導(dǎo)指令之前放置上幾條空操作指令 NOP。理由是,8051的指令編碼采用的是不等長(zhǎng)方式,長(zhǎng)度分別為1~3字節(jié),而程序跑飛又是通過(guò)非法隨機(jī)改變PC值形成的。假若跑飛后的PC值落到3 字節(jié)指令LJMP的中間,就會(huì)把操作數(shù)當(dāng)作操作碼來(lái)執(zhí)行,將會(huì)產(chǎn)生不可預(yù)知的結(jié)果。為了提高捕捉的有效性,就在LJMP指令之前至少填充2條單字節(jié)的 NOP指令。
如果把“5字節(jié)指令串”改換成如下作者新設(shè)計(jì)的“4字節(jié)指令串”,陷阱指令將會(huì)更加有效。理由是,該指令對(duì)應(yīng)的目標(biāo)碼為“00 20 00 20H”,這段碼無(wú)論重復(fù)多少次都是等同的。另外,應(yīng)該在程序存儲(chǔ)器0020H開始的3字節(jié)中再放置一條跳轉(zhuǎn)到“軟件復(fù)位程序”真正入口的中轉(zhuǎn)指令 LJMP SWRST。經(jīng)過(guò)核查,0020H~0022H字節(jié)恰好位于定時(shí)器T1中斷矢量區(qū)尾部和串口中斷矢量之前。
SWRST0 EQU 0020H;定義“軟件復(fù)位程序”的間接入口地址為“0020H”
NOP ;填充一條單字節(jié)的空操作指令,機(jī)器碼是“00H”
LJMP SWRST0 ;無(wú)條件跳轉(zhuǎn)到指定地址去。對(duì)應(yīng)的機(jī)器碼是“20 00 20H”
軟件復(fù)位技術(shù)
軟件復(fù)位是一種新技術(shù),目前有越來(lái)越多的新型單片機(jī)配備了該功能。例如Philips公司的P87LPC700和P89LPC900系列、TI- BB公司的MSC1200系列和SunPlus公司的SPMC65系列等,內(nèi)部都設(shè)計(jì)了專門用于實(shí)現(xiàn)軟件復(fù)位的控制寄存器或者控制位。
軟件復(fù)位是在利用軟件陷阱技術(shù)或軟件看門狗技術(shù)時(shí),必需配套實(shí)施的一項(xiàng)后續(xù)處理工作。所謂“軟件復(fù)位”是一種由用戶軟件控制的復(fù)位活動(dòng),就是利用一系列指令來(lái)模擬硬件復(fù)位所實(shí)現(xiàn)的各種操作內(nèi)容,并且重新從頭開始執(zhí)行用戶程序。
其中的操作內(nèi)容應(yīng)該包含:(1)對(duì)于標(biāo)準(zhǔn)80C51的21個(gè)特殊功能寄存器SFR的復(fù)位操作,利用MOV指令很容易實(shí)現(xiàn)。全部復(fù)位可能不是必需的,只管那些在用戶程序中用到的SFR即可,可以由用戶自己定制。
2)對(duì)于無(wú)統(tǒng)一編址的程序計(jì)時(shí)器PC的復(fù)位,利用一條跳轉(zhuǎn)指令即可。(3)中斷激活觸發(fā)器的復(fù)位既容易被人們忽略,也不容易實(shí)現(xiàn)。理由是它們對(duì)于用戶程序是不可見的,無(wú)法直接讀寫其內(nèi)容。有的編程人員采用LJMP 0000H(機(jī)器碼為20 00 00H)作為軟件陷阱,認(rèn)為直接跳轉(zhuǎn)到復(fù)位矢量就完成了軟件復(fù)位,就是這類失誤案例的典型代表。
清除中斷激活觸發(fā)器有何必要呢?程序的跑飛是隨機(jī)發(fā)生的,其起飛點(diǎn)完全可能發(fā)生在低級(jí)或高級(jí)中斷服務(wù)子程序中,這時(shí)的中斷激活觸發(fā)器已經(jīng)被置位。如果在程序回復(fù)之后沒有及時(shí)清除它們,將阻止以后出現(xiàn)的所有的同級(jí)或低級(jí)中斷請(qǐng)求。
圖1 中斷激活觸發(fā)器示意圖
中斷激活觸發(fā)器包含高權(quán)組和低權(quán)組兩個(gè)觸發(fā)器,電路組成如圖1所示,該圖是根據(jù)作者的理解和經(jīng)驗(yàn)繪制的。電路中包括1個(gè)邏輯或門G1、兩個(gè)S-R觸發(fā)器FF1和FF2。當(dāng)CPU響應(yīng)低級(jí)中斷請(qǐng)求之后,F(xiàn)F1被置位,其Q = 0,封鎖“低權(quán)組”不再受理新的低級(jí)中斷請(qǐng)求;當(dāng)CPU響應(yīng)高級(jí)中斷請(qǐng)求之后,因?yàn)镚1的作用而使FF1和FF2同時(shí)被置位,F(xiàn)F1的Q = 0封鎖“低權(quán)組”,F(xiàn)F2的Q = 0封鎖“高權(quán)組”,不再受理新的高級(jí)和低級(jí)中斷請(qǐng)求。
如何設(shè)計(jì)“軟件復(fù)位程序”呢?其編寫方法如下。
SWRST: ;定義軟件復(fù)位程序的實(shí)際入口地址
CLR EA ;首先關(guān)閉中斷源總使能位
SETB F0 ;設(shè)置一個(gè)軟件復(fù)位標(biāo)志位
MOV P0,#0FFH ;設(shè)定通用端口P0為高阻輸入狀態(tài)
MOV P1,#0FFH ;設(shè)定通用端口P1為高阻輸入狀態(tài)
MOV P2,#0FFH ;設(shè)定通用端口P2為高阻輸入狀態(tài)
MOV P3,#0FFH ;設(shè)定通用端口P3為高阻輸入狀態(tài)
MOV PSW,#00H ;設(shè)定程序狀態(tài)字寄存器為原始值
…… ;(據(jù)實(shí)際需要還可初始化其他SFR)
MOV DPTR,#SWR0 ;為RETI準(zhǔn)備彈出地址,而又不想改變執(zhí)行順序
PUSH DPL ;壓棧低字節(jié),在先
PUSH DPH ;壓棧高字節(jié),在后
RETI ;中斷返回指令,清除高級(jí)中斷激活觸發(fā)器
SWR0: CLR A ;準(zhǔn)備復(fù)位地址
PUSH ACC ;壓棧低字節(jié)00H
PUSH ACC ;壓棧高字節(jié)00H
RETI ;清除低級(jí)中斷激活觸發(fā)器,并跳到0000H
以下幾點(diǎn)需要說(shuō)明:(1)首先關(guān)閉總的中斷使能位,以確保軟件復(fù)位過(guò)程順利完成;(2)其中的核心指令是中斷返回指令RETI,因?yàn)樵谡麄€(gè)指令集中只有該指令能夠清除中斷激活觸發(fā)器;(3)末尾RETI指令的作用還代替了一條3字節(jié)的“LJMP 0000H”指令;(4)由軟件陷阱捕獲的跑飛程序并不一定同時(shí)置位了所有兩個(gè)中斷激活觸發(fā)器,但是該程序仍然適用,并且也沒有任何負(fù)面影響;(5)軟件復(fù)位標(biāo)志這里利用了PSW中的一個(gè)通用位F0,也可以利用F1、GF0、GF1以及RAM字節(jié)單元或位單元等;(6)軟件復(fù)位是一種不外擴(kuò)任何硬件電路、不導(dǎo)致單片機(jī)發(fā)生狀態(tài)遷移、純軟件的復(fù)位方法。
軟硬件復(fù)位技術(shù)
軟硬件復(fù)位是軟件復(fù)位功能的一種延伸,也是單片機(jī)的一種自主復(fù)位方式,既具有軟件復(fù)位的特點(diǎn)(可以由編程人員按需要來(lái)啟用),又具有硬件復(fù)位的特點(diǎn)(能夠?qū)崿F(xiàn)硬件復(fù)位的全部操作內(nèi)容)。這種復(fù)位方式是本文作者自行規(guī)劃、設(shè)計(jì)和命名的。
(a)分立件電路方式
(b)IC電路方式
在上述軟件復(fù)位的基礎(chǔ)上很容易實(shí)現(xiàn)這里所說(shuō)的軟硬件復(fù)位方式,不過(guò)需要外擴(kuò)一定的硬件電路的支持。圖2是兩種配合軟硬件復(fù)位的外擴(kuò)電路。其中,圖2 (a)電路是在普通復(fù)位電路的基礎(chǔ)上,添加1只三極管Q1和3只阻容元件而成的,并且其導(dǎo)通與截止由一條并口引腳控制,如P1.0。平時(shí)P1.0維持高電平,Q1截止;當(dāng)內(nèi)部軟件需要實(shí)施該復(fù)位時(shí),從P1.0腳輸出低電平,Q1導(dǎo)通把RST腳拉高,強(qiáng)行復(fù)位單片機(jī)。這里R3、R4和C2起著延時(shí)和限流的雙重作用。圖2(b)電路是在MAX812M對(duì)接80C51電路基礎(chǔ)上添加一條連線而成的,其工作原理與上類似。該連線把MAX812M的人工復(fù)位輸入腳 MR和一條通用I/O腳(如P1.0)連接起來(lái)即可。
如何設(shè)計(jì)“軟硬件復(fù)位程序”呢?其編寫方法如下。
SHRST: ;定義軟硬件復(fù)位程序的入口地址
SET F1 ;設(shè)置一個(gè)軟件復(fù)位標(biāo)志位
CLR P1.0 ;從P1.0輸出低電平,開始實(shí)施軟硬件復(fù)位
ORL PCON,#02H;置位PD,令單片機(jī)進(jìn)入停機(jī)狀態(tài),即PD模式
;經(jīng)過(guò)延時(shí)后RST被拉高,迫使單片機(jī)進(jìn)入復(fù)位狀態(tài)
;在復(fù)位操作完成并且喚醒單片機(jī)之后,將重新從0000H開始執(zhí)行用戶程序
以下幾點(diǎn)需要說(shuō)明:(1)如果利用這里的“軟硬件復(fù)位程序”代替前面的“軟件復(fù)位程序”,可以簡(jiǎn)化用戶程序并且復(fù)位進(jìn)行得徹底,但是需要增加一些硬件,并且也把可以定制的復(fù)位操作給轉(zhuǎn)化成了固定的復(fù)位操作。(2)在圖2所示的軟硬件復(fù)位的支撐電路,除了可以提供復(fù)位信號(hào)給單片機(jī),還有一個(gè)很大的好處,就是可以為其他外圍電路提供復(fù)位信號(hào),這彌補(bǔ)了傳統(tǒng)80C51的一個(gè)欠缺。
標(biāo)準(zhǔn)80C51的復(fù)位引腳RST是只能輸入的單向結(jié)構(gòu),不能由單片機(jī)主動(dòng)地為外圍芯片提供同步的復(fù)位信號(hào);而MC68HC05和MC68HC08系列、ST公司的ST7系列,以及許多新款51兼容單片機(jī)都把RST引腳設(shè)計(jì)為可輸入/輸出的雙向結(jié)構(gòu),在內(nèi)部看門狗溢出復(fù)位的同時(shí),也從RST輸出一個(gè)高電平脈沖,控制其他外圍芯片與單片機(jī)進(jìn)行同步復(fù)位操作。例如,ATMEL公司的AT89S51/52、T89C51RD2、AT89C51RC等型號(hào)和 Philips公司的P89C51RC、P89C51RA2/RB2/RD2等型號(hào),它們都帶有內(nèi)部看門狗。
非法地址復(fù)位技術(shù)
一般來(lái)說(shuō),非法地址復(fù)位是指由于意外原因?qū)е鲁绦蛴?jì)時(shí)器PC內(nèi)容被破壞,而迫使CPU試圖到一個(gè)非法地址去抓取指令代碼來(lái)執(zhí)行,就強(qiáng)迫單片機(jī)進(jìn)行復(fù)位操作。
由于51系列單片機(jī)的硬件結(jié)構(gòu)采用的是“哈佛架構(gòu)”,其程序區(qū)和數(shù)據(jù)區(qū)截然分開、獨(dú)立編址,不存在CPU到RAM區(qū)抓取指令的可能性,因此這極大地降低了非法尋址的概率。但是這并不能徹底杜絕非法尋址的可能性,尤其是對(duì)于哪些實(shí)際配備ROM容量遠(yuǎn)小于64Kb的情況。這時(shí)就可以狹義地定義非法地址是 PC值超出ROM實(shí)際容量的地址編碼。
(a)IC電路直接復(fù)位方式
(b)先中斷后復(fù)位方式
圖3是兩種實(shí)現(xiàn)非法地址復(fù)位的支撐電路。其中,圖3(a)電路是在圖2(b)的基礎(chǔ)上改變一條連線而成的。該連線一端連接PSEN信號(hào)引腳,該引腳專門用來(lái)提供選通外擴(kuò)程序存儲(chǔ)器ROM的片選信號(hào);另一端連接MAX812M的人工復(fù)位輸入腳MR。平時(shí)PSEN引腳一直維持在高電平上;只有當(dāng)CPU試圖非法到外部ROM抓取指令時(shí),PSEN引腳才會(huì)送出低電平脈沖,就是巧妙地利用該脈沖作為復(fù)位信號(hào)源,來(lái)強(qiáng)迫單片機(jī)進(jìn)行復(fù)位操作。圖3(b)電路可以看作是在圖2(b)基礎(chǔ)上改變添加一條連線而成的。該連線把PSEN信號(hào)引腳和一條外部中斷源引腳INT0連接起來(lái),并且設(shè)定INT0為下降沿觸發(fā)和高級(jí)中斷源。當(dāng)出現(xiàn)非法地址時(shí),PSEN引腳上的低電平脈沖經(jīng)過(guò)INT0向CPU請(qǐng)求中斷;在CPU響應(yīng)該中斷之后可以設(shè)置標(biāo)志,然后實(shí)施軟件復(fù)位或者軟硬件復(fù)位。
需要提示一點(diǎn):非法地址復(fù)位方式的啟用是有前提條件的,它僅適用于那些純粹利用片上ROM(指程序存儲(chǔ)器),即無(wú)外擴(kuò)ROM,并且片上ROM不足64Kb的情況。
復(fù)位方式小結(jié)
標(biāo)準(zhǔn)80C51只有一個(gè)外接復(fù)位源引腳RST,基本所有硬件中斷都是通過(guò)RST腳引入的,并且是根據(jù)實(shí)際需要逐個(gè)進(jìn)行擴(kuò)充的。其中只有上電復(fù)位POR是什么場(chǎng)合下都必不可少的。其擴(kuò)充順序大致符合(不是絕對(duì)符合)表1中的規(guī)律。
在此對(duì)于可能用到的多種復(fù)位源和復(fù)位的方式,進(jìn)行如下幾種不同的分類。
1 傳統(tǒng)復(fù)位方式和非傳統(tǒng)復(fù)位方式
傳統(tǒng)復(fù)位方式(包含上電復(fù)位和人工復(fù)位)是80C51技術(shù)手冊(cè)和所有教科書中幾乎都提及的;而非傳統(tǒng)復(fù)位方式(包含欠壓復(fù)位、看門狗復(fù)位、軟件復(fù)位、軟硬件復(fù)位和非法地址復(fù)位)是為了滿足技術(shù)發(fā)展的需要而擴(kuò)充的,這也是一些新款單片機(jī)在片內(nèi)新增的幾種復(fù)位方式。
2 硬件復(fù)位、軟件復(fù)位和軟硬件復(fù)位
復(fù)位分類如表2所示,將除了軟件復(fù)位之外的所有復(fù)位方式外部都引入到RST復(fù)位引腳上。
3 電源電壓監(jiān)控復(fù)位和程序運(yùn)行監(jiān)控復(fù)位
電源電壓監(jiān)控復(fù)位包含上電復(fù)位和欠壓復(fù)位,它們都是在電源電壓的非常時(shí)期實(shí)施的復(fù)位;程序運(yùn)行監(jiān)控復(fù)位包含人工復(fù)位、看門狗復(fù)位、非法地址復(fù)位、軟件復(fù)位和軟硬件復(fù)位,它們都是在用戶程序失常的情況下實(shí)施的復(fù)位。
4 內(nèi)部復(fù)位和外部復(fù)位
內(nèi)部復(fù)位包含看門狗復(fù)位、軟件復(fù)位、軟硬件復(fù)位和非法地址復(fù)位,它們基本都由內(nèi)部原因?qū)е碌膹?fù)位;外部復(fù)位包含上電復(fù)位、人工復(fù)位和欠壓復(fù)位,它們基本都由外部原因?qū)е碌膹?fù)位。
5 快速?gòu)?fù)位和延時(shí)復(fù)位
前者希望復(fù)位操作越快越好,例如人工復(fù)位、看門狗復(fù)位、非法地址復(fù)位等;而后者則希望復(fù)位操作有一個(gè)延遲時(shí)間,例如上電復(fù)位、欠壓復(fù)位等。
6 冷復(fù)位和熱復(fù)位
只有上電復(fù)位屬于冷復(fù)位,其余均屬于熱復(fù)位。在冷復(fù)位實(shí)施之前單片機(jī)處于無(wú)電狀態(tài)。
評(píng)論