<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > EDA/PCB > 學習方法與實踐 > 探索80C51的三種非常規(guī)的復位技術(1)

          探索80C51的三種非常規(guī)的復位技術(1)

          ——
          作者: 時間:2007-11-20 來源:嵌入式技術網 收藏
          標準片內現(xiàn)有的邏輯比較簡單,只有通過一條引腳RST進行外部擴展。技術手冊中給出了上電(POR,power on reset)和人工復位(MRST,manual reset)電路的接線方法;借助于一只專用外圍芯片,如MAX813L或DS1323等,來擴充欠壓復位(LVR,low voltage reset)和看門狗復位(WDR,watch dog timer reset)也有文章介紹。

          本文將介紹三種擴展復位方式:軟件復位(SWR,software reset)、軟硬件復位(SHR,software and hardware reset)和非法地址復位(IAR,illegal address reset)。

          軟件陷阱技術及其改良方法

          軟件陷阱(software trap)是一種捕捉程序“跑飛”的編程方法。通常可以在程序中設置軟件陷阱,引導程序失控的跳轉到一個指定的地址去執(zhí)行,最終回復到正常軌道上來。軟件陷阱可以設置在用戶程序的空隙處或者轉移指令之后,還可以利用一系列的陷阱指令來填充程序存儲器的空白區(qū)。實現(xiàn)軟件陷阱功能的指令是一個“5字節(jié)指令串”,通常包含2條單字節(jié)NOP指令和1條3字節(jié)跳轉指令。

          NOP ;利用空操作指令

          NOP ;來增加捕捉有效性

          LJMP SWRST;無條件跳轉到指定地址去

          其中“SWRST”可以是一段“軟件復位程序”的入口地址標號,也可以是復位矢量“0000H”,即主程序入口地址。


          如果SWRST等于復位矢量0000H,則會把捕捉到的跑飛程序引導到初始化程序入口地址去執(zhí)行,從而達到回復到正常軌道的目的。這種處理方法只適合中斷功能沒有被啟用的場合。可以設想,假如是在(低級或高級)中斷服務程序中跑飛的,這時即使把程序拉回到起點,而中斷激活觸發(fā)器不能夠被清除,會影響以后的中斷請求無法被 CPU響應。 

          如果SWRST等于“軟件復位程序”的入口地址,則會引發(fā)一次“軟件復位”。關于軟件復位程序的設計方法,隨后介紹。

          總之,這種方法的指導思想是指,把未使用的ROM空間用跳轉引導指令填滿,作為軟件“陷阱”,以捕獲“飛掉”的程序,并強行將捕獲到的跑飛程序引向一個特定的地址,在那里由一段專門處理錯誤的程序進行處理,以恢復系統(tǒng)的正常運行。為提高跑飛程序的捕獲率,通常還要在引導指令之前放置上幾條空操作指令 NOP。理由是,8051的指令編碼采用的是不等長方式,長度分別為1~3字節(jié),而程序跑飛又是通過非法隨機改變PC值形成的。假若跑飛后的PC值落到3 字節(jié)指令LJMP的中間,就會把操作數(shù)當作操作碼來執(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公司的P87LPC700和P89LPC900系列、TI- BB公司的MSC1200系列和SunPlus公司的SPMC65系列等,內部都設計了專門用于實現(xiàn)軟件復位的控制寄存器或者控制位。

          軟件復位是在利用軟件陷阱技術或軟件看門狗技術時,必需配套實施的一項后續(xù)處理工作。所謂“軟件復位”是一種由用戶軟件控制的復位活動,就是利用一系列指令來模擬硬件復位所實現(xiàn)的各種操作內容,并且重新從頭開始執(zhí)行用戶程序。

          其中的操作內容應該包含:(1)對于標準的21個特殊功能寄存器SFR的復位操作,利用MOV指令很容易實現(xiàn)。全部復位可能不是必需的,只管那些在用戶程序中用到的SFR即可,可以由用戶自己定制。

          2)對于無統(tǒng)一編址的程序計時器PC的復位,利用一條跳轉指令即可。(3)中斷激活觸發(fā)器的復位既容易被人們忽略,也不容易實現(xiàn)。理由是它們對于用戶程序是不可見的,無法直接讀寫其內容。有的編程人員采用LJMP 0000H(機器碼為20 00 00H)作為軟件陷阱,認為直接跳轉到復位矢量就完成了軟件復位,就是這類失誤案例的典型代表。

          清除中斷激活觸發(fā)器有何必要呢?程序的跑飛是隨機發(fā)生的,其起飛點完全可能發(fā)生在低級或高級中斷服務子程序中,這時的中斷激活觸發(fā)器已經被置位。如果在程序回復之后沒有及時清除它們,將阻止以后出現(xiàn)的所有的同級或低級中斷請求。


          評論


          相關推薦

          技術專區(qū)

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();