|
技術文章 |
|
靜電放電固件和軟件設計原則 |
點擊次數:7327 更新時間:2010-08-26 |
|
雖然固件設計不能防止系統中器件的損壞,,但是能夠有效地避免一些非*性的損壞。通過適當寫入的固件,不可恢復的設備故障(死鎖)通常可以避免,可恢復的故障也可以減少10倍。 如同硬件上的靜電放電措施一樣,抗靜電放電的固件也是有代價的。通常,程序會更大一些,這意味著需要更長的編程時間和存儲單元。權衡得失時,要將這種代價與單純依靠硬件解決靜電放電問題時的成本做對比。在許多微處理器的應用中,固件措施的成本要比硬件低。 在編寫靜電放電抗擾性強的固件時一定要樹立的的一個觀念是“不確定性”。也就是,一定不能認為端口、寄存器等的狀態是一定的。例如,當使用一個索引寄存器時,應該問一下,如果這個索引發生錯誤時,會發生什么問題。如果僅是僅發生一些暫時的或無關緊要的問題,如發光二極管閃爍,則不需要什么特殊的處理。如果會發生很嚴重的問題,例如系統發生死鎖,則必須采取措施來避免問題的發生。 固件(軟件)靜電放電措施可以分為兩類: * 刷新 * 檢驗和重新寫入 下面從概念上討論每種措施,并給出一些例子。由于不可能預見到所有的特殊情況,要使固件能夠抵抗靜電放電,設計人員必須對整個系統有一個全面的了解。雖然下面的討論主要針對固件,但是其中的許多概念對于軟件設計也是適用的。 刷新: 進行刷新時,程序員不關心過去的情況,而僅是用確定的數據來保證今后的狀態。例如,在從8409的端口讀取數據時,一定要先向端口寫入數據。即使這個端口從上次更新以后一直沒有改寫,也要進行這個步驟。絕不要認為端口上還保留著上次寫入的數據。刷新時需要考慮的其它因素包括: A) 按照一定的時間間隔打開中斷使能端(在8049中是RETR,在8051中是RETI) B) 當端口用于串行數據輸出時,刷新停止位的電平。 C) 刷新鎖存器和端口輸出狀態。 D) 定期讀取控制和選擇輸入,保證系統工作在適當狀態。 E) 對于8049和8051處理器,每個程序環路中至少有一條寄存器選擇指令。
在進行刷新時,另一個需要考慮的因素是刷新的順序。有時,刷新的順序十分重要。例如,在同步輸入/輸出中,數據線一定要在時鐘線之前刷新。否則,經過刷新的時鐘會使數據位丟失。如前所述,一定要考慮在錯誤條件下每條指令的順序。 檢驗和復位: 有時,單純刷新還是不夠的。在有些情況下,刷新甚至會掩蓋一些嚴重的問題。在這些情況下,寄存器、端口等需要通過檢驗來確認其狀態。如果狀態不對,程序應該試圖對其進行更正。 進行復位(或初始化)時一定要非常謹慎。雖然系統的狀態可能有疑問,但是將系統*初始化并不是一個好方法。這會丟失所有過去的數據。應該遵守的原則是,使系統處于zui可能的狀態,而這個狀態應該使問題的危害zui小。如果有些關鍵的項目沒有zui可能的狀態,則應該將其狀態保留起來。這便于以后采用投票的方式來確定當前狀態。通常,“3取2”的投票方式就可以了。 檢驗函數通常可以分為3類。特別要做以下檢驗,如果發現錯誤,需要初始化。 A) 檢驗程序流是否正確: 1) 在主程序中,在子程序返回前,要定期檢驗子程序堆棧指針,以確認子程序在預定的范圍內運行。 2) 如果不檢查堆棧指針(或在檢查堆棧指針的基礎上),可以使用“標牌”來幫助發現程序運行中的問題。當進入一個子程序時,保存標牌,當離開子程序時,檢查這個標牌。 3) 在禁用區域中安排“陷阱”碼,例如編碼表或無用的中斷矢量。當程序要執行這些碼時,就被抓住(例如在未使用的表格中安排返回指令)。 為了檢查程序流是否正常,在程序中還應該包含以下兩個子程序: 4) 為了確認主程序運行正常,應該有一個永遠不會停止和失效的計時程序。 5) 主程序應定時檢查上面的定時程序,確認其是否運行正常(如果微處理器沒有內置的計時器,可以使用外置的硬件“看門狗”電路。當處理器沒有按時將計時器復位時,外置電路會將處理器復位)。
B) 檢驗存儲的數據和信息是否正確 1) 定期對保留的項目進行表決,如果沒有一致性,進行初始化。特別,狀態標志(特別是使能標志)要保留有備份。除了備份以外,還可以使用糾錯碼。 2) 對于索引和其它一些十分重要的寄存器,在使用其所存儲的數據之前,要對其數值或范圍先進行檢查。 3) 如果關鍵數據很多而不適合備份,或者無法檢驗所有信息時,可以用檢驗和或周期性冗余檢驗(CRC)來對數據塊檢驗。
C) 對輸入和輸出進行檢驗 1) 利用各種方法,如奇偶校驗、檢驗和等,對輸入進行檢驗 2) 確認輸入數據的合理性,有些數據可能有明顯的錯誤。 3) 對所有輸入級電平至少取樣兩次以實現對噪聲的“軟件濾波” 4) 通過使接收機響應輸出級來進行校驗輸出端 5) 接收裝置應能識別所有有效的輸入信號,如果接收裝置不能識別,那么發送裝置應具有再傳輸能力。 如果以上措施均不能正確檢查,則要求能自動恢復。當然,這種恢復能力通常不能與加電(或硬件)復位過程中的初始化程序不同,RAM不應清除掉。實際上,由于靜電放電(ESD)而使錯誤程序反向復位時,執行硬件初始化程序不應妨礙處理器的工作。這通常可以通過檢查執行硬件復位程序的標志寄存器的優先級來完成。如果已經設定標志,則應避免*復位。當主程序執行時,此標將被重新設定,一般僅被處理器的實際硬件復位所清除。特別地,通常應按以下步驟來完成復位: 1、復位子程序堆棧指針。 2、復位FIFO指針。 3、復位計數器。 4、阻止可疑碼的傳輸。 5、在復位完成時才允許中斷,然后再重新啟動計數器。 6、復位中斷不確定的標志 7、刷新輸出。 8、如果主機系統接受復位,使其發磅一代碼以通知復位已完成。那么,主機就可以采取措施來確保系統的 所有部分都諧調一致地工作。 9、當然,復位程序必須清除引起復位動作的具體問題。 上述大部分討論假定系統正處于執行程序的狀態中(盡管不一定正確),`如果程序包括表格,處理器可能會盡力去執行這些單元值并將其作為指令。從理論上講,內存單元值可能會引起看門狗計數器停止計數,從而使處理器進入死循環。對于這種情況,可將邏輯分析儀接到地址總線,這樣有可能找到問題的癥結所在。循環期間的一個內存單元值應由一個返回指令來代替。這一般會使處理器跳出循環,于是程序可能會發生變化,因此,被替換的單元值便經過特殊方式進行了處理。(如果有可能的話,空閑的內存單元地址應用于控制這個返回操作碼。實際上,如前處述,將返回碼填滿所有空閑地址是極有可能的。)當然,這個邏輯分析儀也能夠發現程序其他部分的死循環。然而,如利用帶有偽程序的單片微處理器來進行設計,那么地址總線將變得無效。這種情況下,在調試后,程序可以在仿真系統中具有“靜電放電加固”的性質。一旦程序被調試好且運行正常的話,它就可隨意改變寄存器的值以模擬靜電放電效果。 程序計數器是很關鍵的,應被設置成隨意值。而且,子程序堆棧指針應設置成變量值。通過在仿真過程中作這些變化且不影響結果,許多潛在的問題都可以得以發現。這種方法并不總是有效的,但帶有特殊問題的系統是不允許的。應用這些原理,與固件相關的靜電放電問題相對來說會很少的。 |
上一篇:電子鎮流器的CE電磁兼容設計 下一篇:電磁兼容(EMC)設計的元器件選型 |
|
|