正當時......

學術咨詢服務
當前位置:職稱那點事電子信息職稱》80C51的三種非常規(guī)的復位技術研究

80C51的三種非常規(guī)的復位技術研究

來源:職稱那點事作者:admin時間:2014-07-15 17:45
掃碼咨詢
  軟件陷阱(software trap)是一種捕捉程序“跑飛”的編程方法。通常可以在程序中設置軟件陷阱,引導程序失控的單片機跳轉到一個指定的地址去執(zhí)行,最終回復到正常軌道上來。軟件陷阱可以設置在用戶程序的空隙處或者轉移指令之后,還可以利用一系列的陷阱指令來填充程序存儲器的空白區(qū)。實現軟件陷阱功能的指令是一個“5字節(jié)指令串”,通常包含2條單字節(jié)NOP指令和1條3字節(jié)跳轉指令。
 
  標準80C51片內現有的復位邏輯比較簡單,只有通過一條復位引腳RST進行外部擴展。技術手冊中給出了上電復位(POR,power on reset)和人工復位(MRST,manual reset)電路的接線方法,借助于一只專用外圍芯片,如MAX813L或DSl323等,來擴充欠壓復位(LVR,low voltage reset)和看門狗復位(WDR,watch dog timerreset)也有文章介紹。
 
  本文將介紹三種非常規(guī)擴展復位方式軟件復位(SWR,software reset)、軟硬件復位(SHR,software andhardware reset)和非法地址復位(IAR,illegal address reset)。
 
  軟件陷阱技術及其改良方法
 
  NOP ;利用空操作指令
 
  NOP ;來增加捕捉有效性
 
  LJMP SWRST;無條件跳轉到指定地址去
 
  其中“SWRST”可以是一段“軟件復位程序”的入口地址標號,也可以是復位矢量“0000H”,即主程序入口地址。
 
  如果S W R S T等于復位矢量0000H,則會把捕捉到的跑飛程序引導到初始化程序入口地址去執(zhí)行,從而達到回復到正常軌道的目的。這種處理方法只適合中斷功能沒有被啟用的場合。可以設想,假如是在(低級或高級)中斷服務程序中跑飛的,這時即使把程序拉回到起點,而中斷激活觸發(fā)器不能夠被清除,會影響以后的中斷請求無法被CPU響應。
 
  如果SWRST等于“軟件復位程序”的入口地址,則會引發(fā)一次“軟件復位”。關于軟件復位程序的設計方法,隨后介紹。
 
  總之,這種方法的指向思想是指,把未使用的ROM空間用跳轉引導指令填滿,作為軟件“陷阱”,以捕獲“飛掉”的程序,并強行將捕獲到的跑飛程序引向一個特定的地址,在那里由一段專門處理錯誤的程序進行處理,以恢復系統的正常運行。為提高跑飛程序的捕獲率,通常還要在引導指令之前放置上幾條空操作指令NOP。理由是,8051的指令編碼采用的是不等長方式,長度分別為1~3字節(jié),而程序跑飛又是通過非法隨機改變PC值形成的。假若跑飛后的PC值落到3字節(jié)指令LJMP的中間,就會把操作數當作操作碼來執(zhí)行,將會產生不可預知的結果。為了提高捕捉的有效性,就在LJMP指令之前至少填充2條單字節(jié)的NOP指令。
 
  如果把“5字節(jié)指令串”改換成如下作者新設計的“4字節(jié)指令串”,陷阱指令將會更加有效。理由是,該指令對應的目標碼為“00 20 00 20H”,這段碼無論重復多少次都是等同的。另外,應該在程序存儲器0020H開始的3字節(jié)中再放置一條跳轉到“軟件復位程序”真正入口的中轉指令LJMP SWRST。經過核查,-0020H~0022H字節(jié)恰好位于定時器T1中斷矢量區(qū)尾部和串口中斷矢量之前。
 
  SWRST0 EQU 0020H:定義“軟件復位程序”的間接入口地址為“0020H”
 
  NOP ;填充一條單字節(jié)的空操作指令,機器碼是“00H”
 
  LJMP SWRST0 ;無條件跳轉到指定地址去。對應的機器碼是“20 00 20H”
 
  軟件復位技術
 
  軟件復位是一種新技術,目前有越來越多的新型單片機配備了該功能。例如Philips公司的P 87LPC 700和P89LPC900系列、TI—BB公司的MSCl 200系列和SunPlus公司的SPMC65系列等,內部都設計了專門用于實現軟件復位的控制寄存器或者控制位。
 
  軟件復位是在利用軟件陷阱技術或軟件看門狗技術時,必需配套實施的一項后續(xù)處理工作。所謂“軟件復位”是一種由用戶軟件控制的復位活動,就是利用一系列指令來模擬硬件復位所實現的各種操作內容,并且重新從頭開始執(zhí)行用戶程序。
 
  其中的操作內容應該包含:(1)對于標準80C51的21個特殊功能寄存器SFR的復位操作,利用MOV指令很容易實現。全部復位可能不是必需的,只管那些在用戶程序中用到的SFR即可,可以由用戶自己定制。(2)對于無統一編址的程序計時器PC的復位,利用一條跳轉指令即可。(3)中斷激活觸發(fā)器的復位既容易被人們忽略,也不容易實現。理由是它們對于用戶程序是不可見的,無法直接讀寫其內容。有的編程人員采用LJMP 0000H(機器碼為20 0000H)作為軟件陷阱,認為直接跳轉到復位矢量就完成了軟件復位,就是這類失誤案例的典型代表。
 
  清除中斷激活觸發(fā)器有何必要呢?程序的跑飛是隨機發(fā)生的,其起飛點完全可能發(fā)生在低級或高級中斷服務子程序中,這時的中斷激活觸發(fā)器已經被置位。如果在程序回復之后沒有及時清除它們,將阻止以后出現的所有的同級或低級中斷請求。
 
  中斷激活觸發(fā)器包含高權組和低權組兩個觸發(fā)器,電路組成如圖1所示,該圖是根據作者的理解和經驗繪制的。電路中包括1個邏輯或門G1、兩個S-R觸發(fā)器FFl和FF2。當CPU響應低級中斷請求之后,FFl被置位,其Q=0,封鎖“低權組”不再受理新的低級中斷請求;當CPU響應高級中斷請求之后,因為G1的作用而使FFl和FF2同時被置位,FFI的Q=0封鎖“低權組”,FF2的Q;0封鎖“高權組”,不再受理新的高級和低級中斷請求。
 
  如何設計“軟件復位程序”呢?其編寫方法如下。
 
  SWRST: ;定義軟件復位程序的實際入口地址
 
  CLR EA ;首先關閉中斷源總使能位
 
  SETB FO ;設置一個軟件復位標志位
 
  MOV PO,#0FFH;設定通用端口PO為高阻輸入狀態(tài)
 
  MOV P1,#0FFH;設定通用端口P1為高阻輸入狀態(tài)
 
  MOV P2,#0FFH;設定通用端口P2為高阻輸入狀態(tài)
 
  MOV P3,#0FFH, 設定通用端口P3為高阻輸入狀態(tài)
 
  MOV PSW,#00H;設定程序狀態(tài)字寄存器為原始值
 
  ……
 
  ;(據實際需要還可初始化其他SFR)
 
  MOV DPTR,#SWR0 ;為RETI準備彈出地址,而又不想改變執(zhí)行順序
 
  PUSHDPL ;壓棧低字節(jié),在先
 
  PUSHDPH;壓棧高字節(jié),在后
 
  RETI;中斷返回指令,清除高級中斷激活觸發(fā)器
 
  SWR0: CLR A ;準備復位地址
 
  PUSHACC,壓棧低字節(jié)00H
 
  PUSHACC,壓棧高字節(jié)00H
 
  RETI ;清除低級中斷激活觸發(fā)器,并跳到0000H
 
  以下幾點需要說明:(1)首先關閉總的中斷使能位,以確保軟件復位過程順利完成;(2)其中的核心指令是中斷返回指令RETI,因為在整個指令集中只有該指令能夠清除中斷激活觸發(fā)器,(3)末尾RETI指令的作用還代替了一條3字節(jié)的“LJMP 0000H”指令,(4)由軟件陷阱捕獲的跑飛程序并不一定同時置位了所有兩個中斷激活觸發(fā)器,但是該程序仍然適用,并且也沒有任何負面影響:(5)軟件復位標志這里利用了PSW中的一個通用位FO,也可以利用F1、GFO、GFl以及RAM字節(jié)單元或位單元等,(6)軟件復位是一種不外擴任何硬件電路、不導致單片機發(fā)生狀態(tài)遷移、純軟件的復位方法。
 
  軟硬件復位技術
 
  軟硬件復位是軟件復位功能的一種延伸,也是單片機的一種自主復位方式,既具有軟件復位的特點(可以由編程人員按需要來啟用),又具有硬件復位的特點(能夠實現硬件復位的全部操作內容)。這種復位方式是本文作者自行規(guī)劃、設計和命名的。
 
  在上述軟件復位的基礎上很容易實現這里所說的軟硬件復位方式,不過需要外擴一定的硬件電路的支持。圖2是兩種配合軟硬件復位的外擴電路。其中,圖2(a)電路是在普通復位電路的基礎上,添加1只三極管Q1和3只阻容元件而成的,并且其導通與截止由一條井口引腳控制,如P1.0。平時P1.0維持高電平,Q1截止:當內部軟件需要實施該復位時,從P1.0腳輸出低電平,Q1導通把RST腳拉高,強行復位單片機。這里R3、R4和C2起著延時和限流的雙重作用。圖2(b)電路是在MAX812M對接80C51電路基礎上添加一條連線而成的,其工作原理與上類似。該連線把MAX812M的人工復位輸入腳MR和一條通用I/O腳(如Pl.0)連接起來即可。
 
  如何設計“軟硬件復位程序”呢?其編寫方法如下。
 
  SHRST: ;定義軟硬件復位程序的入口地址
 
  SET F1 ;設置一個軟件復位標志位
 
  CLR P1.0 ;從P1.0輸出低電平,開始實施軟硬件復位
 
  ORL PCON,#02H,置位PD,令單片機進入停機狀態(tài),即PD模式,經過延時后RST被拉高,迫使單片機進入復位狀態(tài),在復位操作完成并且喚醒單片機之后,將重新從0000H開始執(zhí)行用戶程序
 
  以下幾點需要說明:(1)如果利用這里的“軟硬件復位程序”代替前面的“軟件復位程序”,可以簡化用戶程序并且復位進行得徹底,但是需要增加一些硬件,并且也把可以定制的復位操作給轉化成了固定的復位操作。(2)在圖2所示的軟硬件復位的支撐電路,除了可以提供復位信號給單片機,還有一個很大的好處,就是可以為其他外圍電路捉供復位信號,這彌補了傳統80C51的一個欠缺。
 
  標準80C51的復位引腳RST是只能輸入的單向結構,不能由單片機主動地為外圍芯片提供同步的復位信號,而MC68HC05和MC68HC08系列、ST公司的ST7系列,以及許多新款51兼容單片機都把RST引腳設計為可輸入/輸出的雙向結構,在內部看門狗溢出復位的同時,也從RST輸出一個高電平脈沖,控制其他外圍芯片與單片機進行同步復位操作。例如,A T M E L公司的AT 8 9S 5 1/52、T8 9C 5 1 RD2、AT89C51RC等型號和Philips公司的P89C51RC、P89C51RA2/RB2/RD2等型號,它們都帶有內部看門狗。
 
  非法地址復位技術
 
  一般來說,非法地址復位是指由于意外原因導致程序計時器PC內容被破壞,而迫使CPU試圖到一個非法地址去抓取指令代碼來執(zhí)行,就強迫單片機進行復位操作。
 
  由于51系列單片機的硬件結構采用的是“哈佛架構”,其程序區(qū)和數據區(qū)截然分開、獨立編址,不存在CPU到RAM區(qū)抓取指令的可能性,因此這極大地降低了非法尋址的概率。但是這并不能徹底杜絕非法尋址的可能性,尤其是對于哪些實際配備ROM容量遠小于64Kb的情況。這時就可以狹義地定義非法地址是PC值超出ROM實際容量的地址編碼。
 
  圖3是兩種實現非法地址復位的支撐電路。其中,圖3(a)電路是在圖2(b)的基礎上改變一條連線而成的。該連線一端連接PSEN信號引腳,該引腳專門用來提供選通外擴程序存儲器ROM的片選信號,另一端連接MAX812M的人工復位輸入腳MR。平時PSEN引腳一直維持在高電平上,只有當CPU試圖非法到外部ROM抓取指令時,PSEN引腳才會送出低電平脈沖,就是巧妙地利用該脈沖作為復位信號源,來強迫單片機進行復位操作。圖3(b)電路可以看作是在圖2(b)基礎上改變添加一條連線而成的。該連線把PSEN信號引腳和一條外部中斷源引腳INT0連接起來,并且設定INT0為下降沿觸發(fā)和高級中斷源。當出現非法地址時,PSEN引腳上的低電平脈沖經過INT0向CPU請求中斷I在CPU響應該中斷之后可以設置標志,然后實施軟件復位或者軟硬件復位。
 
  需要提示一點:非法地址復位方式的啟用是有前提條件的,它僅適用于那些純粹利用片上ROM(指程序存儲器),即無外擴ROM,并且片上ROM不足64Kb的情況。

《80C51的三種非常規(guī)的復位技術研究》
上一篇:計算機系統分析員通信業(yè)應用報告書
下一篇:高職電子商務課程教學模式
更多>>

期刊目錄