《STM8S系列單片機原理與應用》課件第11章_第1頁
《STM8S系列單片機原理與應用》課件第11章_第2頁
《STM8S系列單片機原理與應用》課件第11章_第3頁
《STM8S系列單片機原理與應用》課件第11章_第4頁
《STM8S系列單片機原理與應用》課件第11章_第5頁
已閱讀5頁,還剩114頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第11章STM8S應用系統(tǒng)設計

11.1硬件設計

11.2軟件設計

11.3STM8芯片提供的可靠性功能11.4軟件可靠性設計

11.1硬件設計在設計系統(tǒng)硬件電路時,一般遵循以下原則:

(1)硬件結構應結合控制程序設計一并考慮。同一般的計算機系統(tǒng)一樣,單片機應用系統(tǒng)的軟件和硬件在邏輯功能上是等效的。具有相同功能的單片機應用系統(tǒng),其軟硬件功能可以在很寬的范圍內變化。一些硬件電路的功能可以由軟件來實現(xiàn),反之亦然。例如,系統(tǒng)日歷時鐘可以用實時/日歷時鐘芯片(如MC146818、PCF8563)實現(xiàn),也可以用定時中斷方式實現(xiàn);無線或紅外解碼電路(PWM編碼或曼徹斯特編碼),既可由相應解碼芯片承擔,也可以通過軟件方式(如利用具有上、下沿觸發(fā)捕獲功能的定時器)實現(xiàn)。在應用中,系統(tǒng)軟件和硬件功能的劃分要根據(jù)系統(tǒng)的要求而定,用硬件實現(xiàn)可提高系統(tǒng)反應速度、減少存儲容量、縮短軟件開發(fā)周期,但會增加系統(tǒng)的硬件成本、降低硬件的利用率,使系統(tǒng)的靈活性與適應性變差。若用軟件來實現(xiàn)某些硬件功能,可以節(jié)省硬件開支,增強系統(tǒng)的靈活性和適應性,但系統(tǒng)反應速度會有所下降(對實時性要求很高的控制系統(tǒng),可優(yōu)先考慮用硬件實現(xiàn)),軟件設計費用和所需存儲器的容量將相應增加。對產(chǎn)量大、價格敏感的民用產(chǎn)品,原則上能用軟件實現(xiàn)的功能,不用硬件電路完成。在總體設計時,必須權衡利弊,仔細劃分好硬件功能和軟件功能,軟件能實現(xiàn)的功能盡可能由軟件來完成,以簡化系統(tǒng)的硬件電路,降低成本,提高系統(tǒng)的可靠性。

(2)系統(tǒng)中關聯(lián)器件要盡可能地做到性能匹配。例如,在低功耗單片機應用中,包括MCU在內,系統(tǒng)中所有芯片都應選擇低功耗器件。

(3)單片機外接電路較多時,必須考慮其驅動能力。若驅動能力不足,則系統(tǒng)工作不穩(wěn)定。這時應增設線驅動器或降低電源電壓,減小芯片功耗,降低總線負載。

(4)可靠性及抗干擾設計是硬件系統(tǒng)設計中不可缺少的一部分??煽啃浴⒖垢蓴_能力與硬件系統(tǒng)自身的品質有關,諸如構成系統(tǒng)的各種芯片及元器件的選擇、電路設計的合理性、印刷電路板的布線、去耦濾波、通道隔離等,都必須認真對待。為了提高單片機控制系統(tǒng)的可靠性,單片機控制系統(tǒng)中的IC芯片的連線中必須放置相應的濾波電容,這點最容易被線路設計者忽略。在74系列及CMOS小規(guī)模數(shù)字集成電路中,每1~2塊芯片的電源引腳和地之間應加接一個容量為0.01~0.22μF的高頻濾波電容,濾波電容放置的位置盡可能接近芯片的電源引腳,原則是“先濾波后使用”,如圖11-1所示。工作頻率越高,濾波電容的容量就可以越小。例如,當系統(tǒng)工作頻率大于10MHz時,濾波電容的容量可取0.01~0.047μF。圖11-1IC電源引腳濾波

(5)?TTL電路未用引腳的處理。在TTL單元電路中,一些單元含有多個引腳,當僅使用其中部分引腳時,如將“2輸入與非門”作為反相器使用時,就遇到多余引腳問題。對于未用的與門(包括與非門)引腳,可采取下列方法進行處理:●當電路工作頻率不高時,可懸空(視為高電平,但不允許帶長開路線)?!癞旊娫措妷翰怀^5.5V時,可直接與電源VCC相連。其優(yōu)點是無須增加額外的元器件;缺點是當電源部分出現(xiàn)故障,如電壓大于5.5V時,可能損壞與電源相連的與非門電路芯片?!駥⑺形从玫妮斎攵诉B在一起,并通過2.0kΩ電阻接電源VCC。其缺點是需要增加一個電阻。●在前級驅動能力足夠時,將多余的輸入端并接到已使用的輸入端上。其缺點是除了要求前級電路具有足夠的驅動能力外,還增加了前級電路的功耗。對于未用的或門(包括或非門)引腳,一律接地。

(6)?CMOS、HCMOS電路未用引腳的處理。對于未用的與非門(包括與門)引腳,可采取下列方法進行處理:●直接與電源VDD相連。其優(yōu)點是不需要增加額外的元器件;缺點是當電源部分出現(xiàn)故障時,可能損壞與電源相連的與非門電路芯片。●將所有未用的輸入端連在一起,并通過100kΩ電阻接電源VDD。其缺點是需要增加一個電阻。●當輸入信號為低頻脈沖信號或電平信號時,也可將多余的輸入端并接到已使用的輸入端上。其缺點是除了要求前級電路具有足夠的驅動能力外,還增加了前級電路的功耗。對于未用的或非門(包括或門)引腳,一律接地。對于CMOS、HCMOS電路芯片來說,如果是數(shù)字IC,則同一個封裝管座中未用單元的所有輸入端一律接地??傊珻MOS、HCMOS數(shù)字IC芯片的輸入引腳在任何時刻都不允許懸空。對于模擬比較器、放大器來說,反相端接地,同相端接輸出端。

(7)工藝設計,包括機架機箱、面板、配線、接插件等,必須兼顧電磁兼容的要求,并考慮安裝、調試、維護等操作是否方便。11.1.1硬件資源分配

1.引腳資源分配

STM8SMCU芯片I/O口任意一個引腳的輸入/輸出方式均可編程選擇,對引腳分配的要求并不嚴格,只需注意以下幾點:

(1)?PA口~PE口引腳具有中斷功能,而PF口~PI口引腳沒有中斷功能。此外在PA口~PE口中,同一個I/O引腳上的外中斷輸入只能選擇同一種觸發(fā)方式。

(2)由于STM8S內嵌外設種類很多,因此絕大部分I/O引腳均具有復用功能,既可作為通用I/O引腳使用,當相應外設處于使能狀態(tài)時,又可作為對應外設的輸入/輸出引腳。當系統(tǒng)中需要使用對應外設時,與外設復用的引腳一般不能作為通用引腳使用。在STM8S系列MCU中,與外設輸入/輸出有關的I/O引腳大致如下:●與TIM1輸入捕獲/輸出比較有關的引腳為PC4~PC1(對應TIM1_CH4~TIM1_CH1)引腳、PB3~PB0(對應TIM1_ETR、TIM1_CHN3~TIM1_CHN1)引腳。●與TIM2輸入捕獲/輸出比較有關的引腳為PD4(TIM2_CH1)、PD3(TIM2_CH2)、PA3(TIM2_CH3)引腳?!衽cTIM3輸入捕獲/輸出比較有關的引腳為PD2(TIM3_CH1)、PD0(TIM3_CH2)引腳?!衽c通用串行總線UART1接口有關的引腳為PA4(UART1_RX)、PA5(UART1_TX)、PA6(UART1_CK)引腳?!衽c通用串行總線UART3接口有關的引腳為PD6(UART3_RX)、PD5(UART3_TX)引腳?!衽cSPI總線有關的引腳為PC7(SPI_MISO)、PC6(SPI_MOSI)、PC5(SPI_SCK)、PE5(SPI_NSS)引腳。SPI通信協(xié)議簡單,作為主設備的MCU,通過I/O引腳模擬SPI時序的方式實現(xiàn)SPI串行通信不難,但將MCU作SPI總線從設備時,最好保留SPI硬件接口的輸入/輸出引腳,以便通過中斷方式接收SPI總線上的數(shù)據(jù)。

●與I2C總線有關的引腳為PE1(I2C_SCL)、PE2(I2C_SDA)。如果系統(tǒng)中存在I2C總線器件,即使不打算采用MCU內硬件I2C總線接口電路,即在采用軟件模擬I2C總線的情況下,也建議使用這兩個引腳作為I2C總線時鐘線和數(shù)據(jù)線,原因是這兩個引腳是STM8S系列芯片唯一的真正意義上的OD輸出引腳?!衽cADC有關的引腳為PB口引腳、PF口引腳以及PE7、PE6引腳。

(3)?PE1、PE2引腳沒有內置保護二極管,處于輸出狀態(tài)時,屬于真正意義上的OD輸出。

(4)部分引腳可以承受20mA灌電流??紤]到MCU功耗限制,當負載較重(拉電流或灌電流超過2mA)時,最好外接驅動芯片。

(5)作為輸出引腳使用時,并非所有引腳均可編程選擇高速輸出方式(即輸出信號頻率最高為10MHz)。實際上,STM8S系列MCU大部分引腳僅支持O1輸出特性(輸出信號上限頻率為2MHz,這類引腳輸出高低電平驅動電流也不大),也就是說,這類引腳在輸出狀態(tài)下Px_CR2寄存器位沒有意義。在STM8S中,可以選擇O3(最高輸出頻率為10MHz)或O1輸出特性的引腳為TIM1~TIM3的輸出比較引腳、時鐘輸出引腳CLK_CCO(即PE0)、UART發(fā)送及接收引腳、SPI總線收發(fā)及時鐘信號引腳、PH0與PH1引腳等。因此,當需要從MCU引腳輸出2MHz以上的高速信號時,必須選擇具有O3、O4輸出特性的引腳(具有O3、O4輸出特性的引腳也同時具有HS特性,高、低電平驅動能力很強,最高可達20mA)。

2.定時器資源分配

STM8S提供了1個16位高級定時器TIM1和兩個通用定時器TIM2及TIM3。盡管這三個16位定時器的基本功能相同或相似,但彼此之間還是有差別的。在實際應用系統(tǒng)中,必須根據(jù)具體情況選擇,如按定時精度、待測量輸入信號性質、輸出信號特征等,從簡單到復雜依次分配TIM3、TIM2、TIM1,避免出現(xiàn)殺雞用牛刀的現(xiàn)象。

3.外中斷資源分配在STM8S系統(tǒng)中,處于輸入方式的PA~PE口引腳均具有中斷輸入功能,且數(shù)量多,外中斷資源分配容易,唯一需要注意的是:同一個I/O引腳外中斷只能選擇相同的觸發(fā)方式。在原理圖設計階段,只需確定非可選的硬件資源,如串行通信口、AD轉換器輸入端等的分配,而對于可選擇的資源只能隨機分配。這是因為在PCB布局、布線過程中,應依據(jù)信號特征、連線交叉最少原則,在可選的引腳資源中重新調整。換句話說,控制系統(tǒng)中MCU外圍接口單元電路系統(tǒng)信號的輸入、輸出引腳具體接MCU的哪一個引腳,只有在完成了PCB布線后才能最終確定。11.1.2硬件可靠性設計單片機應用系統(tǒng)主要面向工業(yè)控制、智能化、自動化儀器儀表等,任何差錯都可能造成非常嚴重的后果。此外,單片機應用系統(tǒng)的工作環(huán)境惡劣,個別系統(tǒng)甚至要求在無人值守的情況下工作??梢?,系統(tǒng)對可靠性的要求高,而影響單片機應用系統(tǒng)可靠性的因素很多,如電磁干擾、電網(wǎng)電壓波動、溫度及濕度變化、元器件參數(shù)等,需要針對不同的使用條件及可靠性要求,在硬件、軟件上采取相應的措施。有關STM8S芯片未用引腳的處理方式參閱2.3.2節(jié)有關內容;電源供電與濾波方式參閱2.4節(jié)有關內容。

1)抑制輸入/輸出通道的干擾采用隔離和濾波技術抑制輸入/輸出通道可能出現(xiàn)的干擾。常用的隔離器件有:隔離變壓器、光電耦合器、繼電器和隔離放大器等,應根據(jù)傳輸信號的種類(模擬信號還是開關信號、頻率、幅度)選擇相應的隔離器件。例如,對于低速開關、電平信號,優(yōu)先選用光電耦合器作為隔離器件;對于高頻開關信號,采用脈沖變壓器作為隔離器件;對微弱模擬信號,采用隔離放大器作為隔離器件。

2)抑制供電系統(tǒng)干擾單片機應用系統(tǒng)的供電線路是干擾的主要入侵途徑,常采用下列措施進行抑制:

(1)單片機系統(tǒng)的供電線路和產(chǎn)生干擾的用電設備分開供電。通常干擾源為各類大功率設備,如電機。對于小功率的單片機系統(tǒng),在干擾嚴重的系統(tǒng)中,必要時采用CMOS器件,設計成低功耗系統(tǒng),并用電池供電,干擾即可大大減少。

(2)通過低通濾波器和隔離變壓器接入電網(wǎng)。低通濾波器可以吸收大部分電網(wǎng)中的“毛刺”,隔離變壓器在初級繞組和次級繞組之間多加了一層屏蔽層,并將它和鐵芯一起接地,防止干擾通過初次級之間的寄生電容耦合進入單片機的供電系統(tǒng)。該屏蔽層也可用加繞的一層線圈來充當(一頭接地,一層空置)。

(3)整流元件上并接濾波電容,可以在很大程度上削弱高頻干擾,濾波電容可選用容量在1000pF~0.1μF之間的無感瓷片電容或CBB電容。

(4)數(shù)字信號采用負邏輯傳輸。如果定義低電平為有效電平,高電平為無效電平,就可以減少干擾引起的誤動作,提高數(shù)字信號傳輸?shù)目煽啃浴?/p>

3)抑制電磁場干擾可采取的措施抑制電磁場的干擾可采用屏蔽和接地兩種措施。用金屬外殼或金屬屏蔽罩將整機或部分元器件包起來,再將金屬外殼接地,起到屏蔽的作用。單片機系統(tǒng)中有數(shù)字地、模擬地、交流地、信號地、屏蔽地(機殼地),應分別接不同性質的地。印制板中的地線應接成網(wǎng)狀,而且其他布線不要形成回路,特別是環(huán)繞外周的環(huán)路,接地線最好根據(jù)電路通路逐漸加寬,而高頻電路板多采用大面積接地連接方式。強信號地線和弱信號地線要分開。

4)減小CPU芯片工作時產(chǎn)生的電磁輻射如果CPU工作時產(chǎn)生的電磁輻射干擾了系統(tǒng)內的無線接收電路,則除了應對CPU芯片采取屏蔽措施外,還必須在滿足速度要求的前提下,盡可能地降低系統(tǒng)時鐘頻率。其原因是系統(tǒng)時鐘頻率越低,晶振電路產(chǎn)生的電磁輻射量越小。11.1.3元器件選擇原則單片機應用系統(tǒng)中使用的各種元器件的種類繁多、功能各異、價格不等,這就為用戶在元器件的功能、特性等方面進行選擇提供了較大的自由度。用戶必須對所設計的系統(tǒng)的要求及芯片的特性有充分了解后才能做出正確、合理的選擇。選擇元器件的基本原則是選擇那些滿足性能指標、可靠性高、經(jīng)濟性好的元器件。選擇元器件時應考慮下列因素。

1)性能參數(shù)和經(jīng)濟性在選擇元器件時,必須按照器件手冊所提供的各種參數(shù),如工作條件、電源要求、邏輯特性等指標綜合考慮,不能單純追求超出系統(tǒng)指標要求的高速、高精度、高性能等。按工作條件分類,電子元器件分為民用級、工業(yè)級、汽車級、軍用級四大類。例如,雙OC輸出比較器LM393(民用級,工作溫度范圍為0~70℃)、LM293(工業(yè)級,工作溫度范圍為?-25~+85℃)、LM2903(汽車級,工作溫度范圍為?-40~+85℃)、LM193(軍用級,工作溫度范圍為?-55~+125℃);又如LM358通用運放,對應的工業(yè)級型號為LM258,對應的汽車級型號為LM2904,對應的軍用級型號為LM158。盡管這些元器件功能相同、引腳兼容,甚至絕大部分的性能指標也非常相近,但價格差異卻很大,因此應根據(jù)產(chǎn)品的實際工作環(huán)境、用途以及該元器件對系統(tǒng)性能指標的影響,來選擇對應級別的芯片,使產(chǎn)品具有較高的性價比。

2)通用性在應用系統(tǒng)中,盡量采用通用的大規(guī)模集成電路芯片,這樣能簡化系統(tǒng)的設計、安裝和調試,也有助于提高系統(tǒng)的可靠性。一般原則是:能用一塊中大規(guī)模芯片完成的功能,不用多個中小規(guī)模電路芯片實現(xiàn);能用MCU實現(xiàn)的功能,盡量避免用多塊中小規(guī)模數(shù)字IC芯片實現(xiàn)。

3)型號和公差在確定元器件參數(shù)之后,還要確定元器件的型號,這主要取決于電路所允許元器件的公差范圍。如電解電容器可滿足一般的應用,但對于電容公差要求高的電路,電解電容就不宜采用。電路系統(tǒng)中限流、降壓電阻,一般可選擇E24系列普通精度電阻(誤差為5%),而對于有源濾波器、振蕩器中的參數(shù)電阻,須選擇E96系列精密電阻(誤差小于1%),甚至E192(誤差小于0.5%)系列超高精密電阻。

4)與系統(tǒng)速度匹配單片機時鐘頻率一般可在一定的范圍內選擇,在不影響系統(tǒng)性能的前提下,選擇較低的時鐘頻率,這樣可降低系統(tǒng)內其他元器件對速度的要求,從而降低成本,提高系統(tǒng)的可靠性。另外,也將降低晶振電路潛在的電磁干擾。

5)外圍電路芯片類型由于TTL數(shù)字IC芯片功耗大,已廣泛被速度與之相近、邏輯及引腳與之兼容、功耗小得多的74HC系列所取代,因此無論系統(tǒng)對功耗有無要求,都盡可能不用TTL數(shù)字電路芯片。對于低功耗、慢速系統(tǒng),應采用微功耗的CMOS系列數(shù)字電路,如CD4000系列或CD4500系列。

6)元件封裝方式的選擇為減小元件的體積,減小元件引腳的寄生電感和電阻,提高系統(tǒng)的工作速度,小功率元件盡量采用表面封裝元件和芯片,如SMC封裝電阻、電容(電源高頻濾波電容應采用穿通封裝CBB電容);無引線封裝二極管;各類貼片三極管、IC芯片等。采用貼片元件,不僅減小了系統(tǒng)的體積,提高了系統(tǒng)的工作頻率,方便了印制板加工,還提高了裝配、焊接工藝的質量。在貼片元件中,對于無源器件,在體積沒有特殊要求情況下,應盡量選擇0805封裝尺寸的電阻、電容。對于中小規(guī)模IC芯片,盡量選擇引腳間距較大的SOP封裝形式。個別耗散功率較大的電阻,可選擇1206封裝規(guī)格,或用兩個0805封裝電阻并聯(lián)擴大耗散功率代替一個1206封裝電阻(依次類推,可用兩個1206封裝電阻并聯(lián)以獲得更大的耗散功率)。例如,某電路需要一個1/4W的510Ω電阻,可以選擇1206封裝的510Ω電阻;也可以用兩個1kΩ的0805封裝電阻并聯(lián)來代替。實踐證明:元器件尺寸越小,印制板線條寬度與焊盤尺寸就越小,焊接工藝的可靠性就越低。11.1.4印制電路設計原則單片機應用系統(tǒng)產(chǎn)品在結構上離不開用于固定單片機芯片及其他元器件的印制板。通常這類印制板布線密度高、焊點分布密度大,常需要雙面(個別情況下可采用多層板)才能滿足電路電磁兼容性的要求。此外,無論采用何種電路CAD軟件完成PCB設計,都不宜采用自動布局、布線方式,必須通過手工方式進行。在編輯印制板時,需要遵循下列原則:

(1)晶振必須盡可能地靠近MCU晶振引腳,且晶振電路周圍的元件面及焊錫面內不能走其他的信號線,最好在元件面內晶振電路的位置放置一個與地線相連的屏蔽層,必要時將晶振外殼和與地線相連的屏蔽層焊接在一起,如圖11-2所示。圖11-2在PCB板上晶振與MCU位置關系當兩片MCU或其他器件通過小電容共用同一個晶振電路時,在PCB板上這兩個元件必須盡量靠近,使時鐘信號的走線盡量短,避免高頻時鐘信號干擾其他信號,如圖11-3所示(U12與U16共用晶振Y1,即U12振蕩信號通過C56接U16的外時鐘信號輸入端)。圖11-3兩MCU或其他器件共用時鐘信號

(2)對電源、地線的要求。在雙面印制板上,電源線和地線應盡可能地安排在不同的面上,且平行走線,這樣線間寄生電容將起濾波作用。對于功耗較大的數(shù)字電路芯片,如MCU、驅動器等盡可能地采用單點接地方式,即這類芯片電源、地線應單獨走線,并連到印制板電源、地線入口處。電源線和地線寬度應盡可能地大一些,或采用微帶走線方式,或采用大面積接地方式。

(3)模擬信號和數(shù)字信號不能共地,即采用單點接地方式。

(4)在中低頻(晶振頻率小于20MHz)應用系統(tǒng)中,走線轉角可取45°;在高頻系統(tǒng)中,必要時可選擇圓角模式,不宜采用90°轉角模式。

(5)在連線時,一般應按原理圖中元件連接關系連線,但當電路中存在若干地位等同的單元電路時,可根據(jù)連線是否方便重新調整原理圖中單元電路的位置。例如,對于四單元模擬比較器LM339來說,假設原理圖中局部電路A使用1單元,局部電路B使用2單元,局部電路C使用3單元。如果連線時發(fā)現(xiàn),局部電路A使用3單元,局部電路B使用1單元,局部電路C使用2單元連接交叉最少,則立刻調整原理圖中的連接關系,這是因為四單元比較器LM339內各單元的地位完全相同。對于輸入信號線,其走線應盡可能地短,必要時在信號線兩側放置地線屏蔽,防止可能出現(xiàn)的干擾。不同的信號線應避免平行走線,上下兩面的信號線最好垂直或斜交叉走線,這樣相互間的干擾可減到最小。11.2軟件設計11.2.1存儲器資源分配

STM8S系列MCU內嵌的RAM容量較大,在1~6?KB之間(具體數(shù)目與芯片型號有關),地址在0000H~17FFH之間。盡管不同單元讀寫指令形式相同,但訪問位于00頁內的RAM存儲單元(地址在00H~FFH)時,指令代碼短,因此常用變量應盡可能地安排在00頁內的RAM空間內,并將地址標號定義為字節(jié)類型。例如:

LDA,00H ;?00單元送累加器A,該指令機器碼為B6、00,僅為2個字節(jié)

LDA,0100H ;?0100單元送累加器A,該指令機器碼為C6、01、00,占3個字節(jié)

MOV10H,80H ;把00頁內80H單元的內容送到00頁內的10H單元中,該指令為3個

;字節(jié)MOV10H,1080H ;把00段內1080H單元的內容送到00頁內的10H單元中,該指令為

;?5個字節(jié)表面上看,一條指令省下一兩個字節(jié)存儲空間似乎意義不大,但當系統(tǒng)控制程序中存在多條這樣的指令時,節(jié)省的存儲空間卻非??捎^。

FlashROM容量為8~128?KB(地址在8000H~27FFFH之間),其容量的大小與芯片的容量有關。但當程序代碼、數(shù)表位于00段內(8000H~FFFFH,即前32KB)時,指令代碼短,尋址方式多,可直接使用多分支散轉指令,因此常用數(shù)表應盡量安排在00段內。11.2.2程序語言及程序結構選擇設計控制程序時,可以選擇匯編語言,也可以根據(jù)特定MCU開發(fā)環(huán)境,選擇相應的C語言。例如,開發(fā)基于MCS-51或ARM內核MCU芯片應用系統(tǒng),選擇KeilC;開發(fā)基于STM8內核MCU芯片應用系統(tǒng),選擇CosmicC、RaisonnaceC或IAR等。選擇C語言時,可充分利用芯片生產(chǎn)商或編譯器開發(fā)商提供的所謂“標準”庫函數(shù),程序的編寫、調試、維護相對容易,但編譯后程序代碼長,存儲程序代碼所需的存儲空間大,執(zhí)行速度慢,而采用匯編語言時情況正好相反。一個設計優(yōu)良的單片機應用系統(tǒng),應盡可能地采用匯編語言編寫監(jiān)控程序。單片機芯片程序存儲空間較小,在某些應用系統(tǒng)中所用的MCU片內程序存儲器容量只有幾千字節(jié)(KB),如STM8S103F2芯片,無法存放由特定C語言編寫獲得的代碼。即使程序存儲器容量不是問題,但C語言源程序編譯效率低,相同的操作對應了多條指令,運行速度變慢,這意味著在速度相同的情況下,要采用更高頻率的晶振—這在單片機應用系統(tǒng)中不可取。此外,利用匯編語言編寫控制程序時,可在源程序中增加與可靠性相關的指令,強化了系統(tǒng)的可靠性、穩(wěn)定性。因此,在程序設計過程中,使用匯編語言并多花一些時間優(yōu)化程序代碼,以便使用更低的MCU主頻和較小的程序存儲空間。根據(jù)系統(tǒng)的監(jiān)控功能,正確、合理地選擇程序結構—是串行多任務程序結構還是并行多任務程序結構。當系統(tǒng)中存在多個需要實時處理的任務時,必須選擇并行多任務程序結構,否則系統(tǒng)的實時性將無法保證。11.3STM8芯片提供的可靠性功能

11.3.1提高晶振電路的可靠性在對定時精度要求很高的系統(tǒng)中,一般均使用穩(wěn)定性好、精度高的晶體振蕩器,然而不幸的是:晶振電路往往比較脆弱—強烈振動、碰撞等原因可能會造成晶振損壞,嚴重干擾也可能使晶振停振。為此,STM8S提供了CSS(時鐘安全機制),當CSS有效時,一旦晶振停振,STM8芯片會自動使用內部高速HSI振蕩器的8分頻(頻率為2?MHz)作主時鐘信號,繼續(xù)運行。只要外晶振頻率為2?MHz、4?MHz、8?MHz或16?MHz之一,那么MCU檢測到晶振失效后,在時鐘中斷服務程序中,重新設定HSI時鐘的分頻系數(shù),獲得相同頻率的主時鐘信號,以保證系統(tǒng)繼續(xù)運行。11.3.2使用存儲器安全機制保護程序代碼不被意外改寫

STM8芯片復位以后,F(xiàn)lash區(qū)、DATA區(qū)、選項字節(jié)就自動處于寫保護狀態(tài),避免意外寫入造成數(shù)據(jù)丟失。對這些區(qū)域進行寫操作前,需要按特定的步驟進行解鎖操作方能寫入。此外,在定義UBC存儲區(qū)后,就不能通過IAP方式向UBC存儲區(qū)寫入信息,這在一定程度上避免了代碼的意外丟失。11.3.3硬件看門狗

STM8內核MCU具有獨立硬件看門狗計數(shù)器和窗口看門狗計數(shù)器,在啟動后,若未能在特定時刻前刷新,則看門狗計數(shù)器溢出,觸發(fā)芯片復位,有效地提高了系統(tǒng)的可靠性。11.4軟件可靠性設計單片機主要面向工業(yè)控制、智能化儀器儀表以及家用電器,這對單片機應用系統(tǒng)的可靠性提出了很高的要求。在數(shù)字系統(tǒng)中,總會存在這樣或那樣的干擾。導致計算機系統(tǒng)不可靠的因素很多,無論是TTL,還是CMOS數(shù)字電路芯片,在邏輯轉換瞬間,電源電流ICC存在尖峰現(xiàn)象;繼電器吸合,尤其是斷開瞬間會在電源線上出現(xiàn)尖峰干擾脈沖;外界雷電干擾脈沖、接在同一個相線上的大功率電機啟動,尤其是關閉瞬間形成的干擾脈沖也會通過電源線串入控制系統(tǒng)中。此外,環(huán)境溫度的波動、濕度的變化等因素也可能影響數(shù)字系統(tǒng)輸入/輸出信號的幅度,甚至造成程序計數(shù)器PC“跑飛”、內部RAM、EEPROM、FlashROM存儲單元數(shù)據(jù)丟失等不可預測的后果。這些干擾信號除了借助硬件低通濾波器、施密特觸發(fā)器,以及良好的PCB布局與布線等措施消除外,在單片機控制系統(tǒng)中還必須借助軟件方式提高系統(tǒng)的可靠性,以降低系統(tǒng)的硬件成本。此外,僅依靠硬件方式并不能完全解決單片機控制系統(tǒng)的可靠性問題,因此,軟件可靠性設計技術在單片機控制系統(tǒng)中得到了廣泛應用。11.4.1PC“跑飛”及其后果

CPU的工作過程總是不斷地重復“取操作碼→譯碼→取操作數(shù)→執(zhí)行”過程。在正常情況下,程序計數(shù)器PC按程序員的意圖遞增或跳轉。但當系統(tǒng)受到干擾時,程序計數(shù)器PC出錯,致使CPU不按程序員的意圖執(zhí)行程序中的指令系列,脫離正常軌道而“跑飛”,這可能會導致下列后果。

1)跳過部分指令或程序段的執(zhí)行一般來說,跳過程序中任何一條有效指令都會影響程序的執(zhí)行結果,進而影響系統(tǒng)的可靠性,只是嚴重程度不同而已。例如,跳過的指令系列正好是數(shù)據(jù)輸入指令,則隨后的數(shù)據(jù)處理結果將不正確;跳過子程序返回指令RET或中斷服務程序返回IRET指令時將無法返回,除引起堆棧錯誤外,對中斷服務程序來說還阻止了CPU響應低優(yōu)先級的中斷請求。

2)拆分指令在復雜指令集(CISC)計算機系統(tǒng)(如MCS-51、STM8內核)中,CPU受到干擾后,可能將指令操作數(shù)當成操作碼執(zhí)行而引起混亂。當程序計數(shù)器PC彈飛到某一個單字節(jié)指令時,會自動納入正軌(最多跳過某些指令)。在取指階段,PC“跑飛”落到雙字節(jié)或多字節(jié)指令操作數(shù)上,多字節(jié)指令必然被拆分,即把指令的操作數(shù)當“操作碼”取出,如圖11-4所示。如果操作數(shù)對應的“指令碼”屬于多字節(jié)指令,又有可能繼續(xù)拆分緊隨其后的多字節(jié)指令,會再出錯,如圖11-4(a)所示。除非被拆分的指令后為m?-?1條單字節(jié)指令(m是CPU最長指令字節(jié)數(shù),MCS-51內核CPU最長指令碼為3字節(jié);STM8內核CPU最長指令碼為5個字節(jié)),如圖11-4(b)所示。圖11-4指令拆分示意圖對于圖11-4(a)來說,不論“跑飛”的PC指針落入當前指令操作數(shù)中的首字節(jié)還是最后一個字節(jié),情況都非常糟糕。當拆分點不是當前指令的最后一個字節(jié)時,無論拆分點對應的“操作碼”是單字節(jié)指令還是多字節(jié)指令,都有可能再拆分(或跳過)隨后的第n?+?1條指令。除非拆分點為當前指令的最后一個字節(jié),且對應的“操作碼”為單字節(jié)指令時,才不再拆分(包括跳過)隨后的第n?+?1條指令。對于圖11-4(b)來說,不論“跑飛”的PC指針落入當前指令操作數(shù)中的首字節(jié)還是最后一個字節(jié),也不論拆分重組指令是單字節(jié)還是多字節(jié),均不會再拆分第n?+?4條指令后的指令系列,即執(zhí)行到第n?+?5條指令時,PC一定能納入正軌。不過,當拆分重組“指令碼”為多字節(jié)指令時,可能會跳過第n?+?1條指令后的一條或多條單字節(jié)指令的執(zhí)行。在CISC指令集CPU芯片中,多字節(jié)指令不因其以上的多字節(jié)指令拆分而被拆分的條件是該指令前為m?-?1條單字節(jié)指令;多字節(jié)指令被拆分而不再拆分緊隨其后指令的條件是其后為m?-?1條單字節(jié)指令。

PC“跑飛”的后果不能預測,原因是無法預料PC將從何處“飛入”何處,也就無法預測會跳過哪些指令,也不能預測將會拆分哪一指令,更無法預測拆分重組后獲得的“指令”的功能。也許,會因為改寫RAM存儲單元的內容造成數(shù)據(jù)丟失;改寫外設控制寄存器的內容,造成外設工作異常;關閉中斷(如在STM8S中系統(tǒng)執(zhí)行了SIM指令對應的機器碼9B)或異常返回(執(zhí)行RET指令對應的機器碼81H、IRET指令對應的機器碼80H),造成堆?;靵y;或進入死循環(huán)(如執(zhí)行了JRT$指令對應的機器碼20FE);執(zhí)行停機(執(zhí)行了Halt的機器碼)等。

3)跳到數(shù)據(jù)區(qū),把數(shù)據(jù)當指令執(zhí)行

PC“飛入”數(shù)據(jù)區(qū),把數(shù)據(jù)當指令執(zhí)行的后果也同樣不能預料,原因是不能限定數(shù)表中各數(shù)據(jù)項的內容。為減小PC“跑飛”,拆分重組指令造成的破壞,STM8系列芯片引入了非法指令碼檢查機制—當執(zhí)行到非法指令碼時將強迫系統(tǒng)復位,但希望拆分重組后獲得的指令碼為非法指令碼的概率也不會很大,原因是不能夠限定每條指令中操作數(shù)的編碼,且非法指令碼數(shù)量畢竟有限。11.4.2降低PC“跑飛”對系統(tǒng)的影響在計算機系統(tǒng)中,理論上PC“跑飛”不可避免,“跑飛”的后果無法預測。因此只能在軟件設計時,采取適當措施盡可能地減小PC“跑飛”對系統(tǒng)造成的影響,提高系統(tǒng)的可靠性。

1.指令冗余為避免拆分多字節(jié)指令時跳過的指令不影響程序的執(zhí)行結果,可在多字節(jié)指令的前、后分別插入n?-?1條單字節(jié)的空操作指令NOP。此外,為防止PC“跑飛”時,跳過某些對系統(tǒng)有重要影響的指令,在可靠性要求較高的系統(tǒng)中,在速度與存儲器空間許可的情況下重寫特定操作指令,如輸出信號控制指令、外設工作方式設置指令、中斷控制指令、中斷優(yōu)先級設置指令等。這就是所謂的“指令冗余”方式。采用“指令冗余”方式會增加程序代碼的存儲量、降低系統(tǒng)的運行效率。在實踐中不可能在所有雙字節(jié)、多字節(jié)指令的前后分別插入n?-?1條空操作指令,只在對程序流向起決定作用的指令前后插入。對MCS-51系統(tǒng)來說,在LJMP、SJMP、LCALL、JC、JNC、JB、JNB、CJNE、DJNZ等多字節(jié)指令前,插入2條NOP指令;在RET、RETI等單字節(jié)指令前,增加1~2條冗余指令。對STM8系統(tǒng)來說,在JP、JRT、CALL、JRNE、JREQ、JRNC、JRC、BTJT、BTJF等多字節(jié)指令前,插入4條NOP指令;在RET、IRET等單字節(jié)指令前,增加1~4條冗余指令(返回指令前多一條單字節(jié)指令,可少增加一條返回指令)。這樣系統(tǒng)在可靠性、速度、代碼存儲量三者之間可達到較好的平衡。例如,多字節(jié)指令冗余方式為

NOP

NOP

NOP

NOP ;防止其以上的指令被拆分而受到影響,正常時會影響系統(tǒng)的效率

JRNCNEXT 例如,單字節(jié)指令冗余方式為

RET

RET

RET

RET ;增加1~4條冗余指令,防止其以上的指令被拆分而跳過

RET ;正常時不影響系統(tǒng)的速度,僅多占用4個單元的存儲空間為防止“PC”跑飛,拆分重組指令關閉中斷、禁止定時/計數(shù)器工作,尤其是軟件類看門狗定時器。為此,在主程序的適當?shù)胤?,如并行多任務程序結構中的任務調度處或作業(yè)調度處,插入重開中斷、重復啟動定時/計數(shù)器、軟件看門狗計數(shù)器等冗余指令。盡管在RISC指令集計算機系統(tǒng)中,每條指令長度都相同,不存在指令被拆分的問題,但PC“跑飛”同樣存在跳過某些指令或程序段的風險,在程序中重復書寫關鍵操作指令的方式依然必要。

2.增加數(shù)據(jù)可靠性的方法為防止PC“跑飛”時跳過數(shù)據(jù)輸入指令系列,造成隨后的數(shù)據(jù)處理不正確,可在數(shù)據(jù)輸入處理指令前設置接收標志(如55H、5AH、A5H或AAH),在數(shù)據(jù)處理前先檢查接收標志是否正確,待數(shù)據(jù)處理結束后再清除正確接收標志。一旦發(fā)現(xiàn)接收標志異常,幾乎可以肯定PC已“跑飛”,視情況采取相應的對策。由于無法預測PC“跑飛”拆分重組指令的功能,因此對存放在RAM中的重要數(shù)據(jù)應增加校驗信息字節(jié),可根據(jù)需要選擇“和”校驗、某特征值倍數(shù)校驗,甚至CRC校驗方式。當存儲空間允許時,除了采用某種校驗方式外,還可采用備份方式來進一步提高數(shù)據(jù)的可靠性。一旦發(fā)現(xiàn)校驗錯,就可以肯定PC已“跑飛”,視情況采取相應的對策。11.4.3PC“跑飛”攔截技術在CISC指令系統(tǒng)中,采用指令冗余技術只保證了PC“跑飛”后迅速將其納入正軌,避免錯誤擴大化而已,但依然跳過了被拆分指令,可視為重組指令操作數(shù)的指令碼的執(zhí)行,更為嚴重的是無法預測拆分重組指令執(zhí)行后對系統(tǒng)造成的危害。此外,無論是CISC指令系統(tǒng),還是RISC指令系統(tǒng),PC“跑飛”均可能跳過若干指令系列。在理論上,在做好重要數(shù)據(jù)、系統(tǒng)狀態(tài)備份或保護的情況下,采用有效的軟件攔截技術,在感知PC“跑飛”后,利用軟件復位功能或進入循環(huán)等待看門狗計數(shù)器溢出方式強迫系統(tǒng)復位,避免系統(tǒng)帶病運行,才能徹底解決PC指針“跑飛”帶來的可靠性問題。所謂攔截技術是指將“跑飛”的PC指針引向指定位置,進行出錯處理后,再強迫系統(tǒng)復位的方法。常用的攔截手段包括傳統(tǒng)的軟件陷阱攔截和遠程攔截兩種方式。

1.軟件陷阱所謂軟件陷阱,就是一條引導指令,強行將捕獲的程序引向一個指定的地址,在那里有一段專門對程序出錯進行處理的指令。對于STM8系統(tǒng)來說,軟件陷阱就是一條軟件中斷TRAP指令。為了增強捕獲效果,一般需要5條TRAP指令,保證軟件不因其以上多字節(jié)指令被拆分而失效。在STM8系統(tǒng)中,真正的軟件陷阱由5條單字節(jié)指令TRAP構成:

TRAP TRAP TRAP TRAP TRAP ;軟件中斷指令在軟件中斷服務程序中,完成了相應的錯誤處理(如數(shù)據(jù)保護、設置相關標志)后,執(zhí)行非法指令碼,如05H(STM8具有05H、0BH、71H、75H四個單字節(jié)非法指令碼),強迫MCU芯片復位。軟件中斷服務程序結構如下:InterruptTRAP_ServiceTRAP_Service.L ;錯誤處理DC.B05H,05H,05H,05H,05H ;用非法指令碼代替軟件中斷服務返回指令

;IRET ;為增強捕獲效果使用了多條TRAP指令,只能復位 在PC“跑飛”后,不需要進行數(shù)據(jù)保護,可直接采用STM8系統(tǒng)的單字節(jié)非法指令碼構成STM8系統(tǒng)的軟件陷阱。在這種情況下,軟件陷阱為5個單字節(jié)非法指令碼(用5個單字節(jié)非法指令碼構成軟件陷阱的原因也是為了增強捕獲效果)。

DC.B05H,05H,05H,05H,05H ;用非法指令碼代替軟件中斷指令,形成軟件陷阱軟件陷阱可安排在無條件跳轉指令之后,未使用的中斷服務區(qū)、未使用的大片F(xiàn)lashROM存儲區(qū)以及數(shù)表的前后等正常程序執(zhí)行不到的地方,這樣做不影響程序的執(zhí)行效率。

(1)在跳轉指令之后,插入軟件陷阱指令系列,如下所示:NOPNOPNOPNOP ;根據(jù)需要,增加冗余指令,防止跳轉指令被拆分JRT NEXT ;在無條件跳轉JRT、JP、JPF指令后,加軟件陷阱指令系列TRAPTRAPTRAPTRAPTRAP

;軟件中斷指令NEXT:(2)在數(shù)表的前、后插入軟件陷阱指令系列,如下所示:

TRAP ;在數(shù)表前插入軟件陷阱指令系列

TRAP TRAP TRAP TRAP ;軟件中斷指令DATATAB: DC.B23H,… ;數(shù)表

TRAP ;在數(shù)表前插入軟件陷阱指令系列

TRAP TRAP TRAP TRAP ;軟件中斷指令(3)在子程序及中斷返回指令之后,插入軟件陷阱指令系列,如下所示:

RET TRAP ;在子程序、中斷返回指令后插入軟件陷阱指令系列

TRAP TRAP TRAP TRAP ;軟件中斷指令(4)在未用的中斷服務區(qū)內,插入軟件陷阱指令系列,如下所示:

interruptNonHandledInterruptNonHandledInterrupt.l TRAP TRAP TRAP TRAP TRAP ;軟件中斷指令

iret

(5)在未用的FlashROM存儲空間,用軟件陷阱指令碼(83H)或單字節(jié)非法指令碼05H填充。擦除操作后,STM8未用的存儲單元為00H。寫片時,未用存儲單元最好用軟件中斷指令碼“83H”(PC“跑飛”后需要進行數(shù)據(jù)保護時)或非法指令碼,如05H、0BH填充(無須進行保護數(shù)據(jù)時),原因是STM8內核CPU“NOP”指令碼為9DH而不是00H。其實,在STM8指令系統(tǒng)中,00H對應“NEG(XX,SP)”指令的操作碼。如果不用軟件中斷指令機器碼83H或單字節(jié)非法指令碼,如05H、0BH填充,則當PC“飛”入未用程序存儲區(qū)時,不僅不能返回正常的操作狀態(tài),還可能改寫了RAM存儲單元的內容。設置了軟件陷阱后,一旦PC“跑飛”掉入陷阱內,在完成了相應的錯誤處理,如保護數(shù)據(jù)、設置復位標志后,執(zhí)行非法指令碼,觸發(fā)系統(tǒng)進入復位狀態(tài)。軟件陷阱方式對PC在模塊內“跑飛”、模塊間“跑飛”均有效,但它攔截的成功率并不高,原因是:第一,程序中無條件跳轉指令、子程序或中斷返回指令的數(shù)目畢竟有限。第二,由于受MCU存儲空間的限制,因此未必能在每一條無條件跳轉指令后插入軟件陷阱指令系列,換句話說,陷阱的個數(shù)有限。第三,上述軟件陷阱的尺寸太小,僅由5個字節(jié)組成,結果“跑飛”的PC剛好落入數(shù)量有限的小陷阱中的概率不大。

2.遠程攔截技術對于采用模塊化程序結構的MCU控制系統(tǒng)程序,可采用具有遠程攔截功能的模塊結構檢測PC是否從其他模塊“飛”入。

1)攔截原理

MCU控制系統(tǒng)程序,在進入每一個模塊后執(zhí)行其他指令前,先保存模塊入口地址,再執(zhí)行模塊實體內的指令系列。離開時,算出模塊出口地址與入口地址的差,并與模塊長度比較。如果相同,則說明進入本模塊時PC未“跑飛”,可復位看門狗定時器(簡稱喂狗),并按正常步驟退出;反之,說明PC指針異常飛入,可根據(jù)需要執(zhí)行錯誤處理,如數(shù)據(jù)、系統(tǒng)狀態(tài)保護等操作后,再執(zhí)行軟件復位或關閉中斷后執(zhí)行循環(huán)指令,等待看門狗計數(shù)器溢出,強迫系統(tǒng)復位。如圖11-5所示。圖11-5遠程攔截判別流程圖

2)模塊結構舉例下列分別給出具有遠程攔截功能的幾種典型模塊結構。

(1)通過堆棧保護入口地址低16位的模塊結構。當堆棧深度較大時,將模塊入口地址壓入堆棧保存,即可獲得適用于主程序、子程序以及中斷服務程序的具有PC“跑飛”檢測功能的通用模塊結構,如下所示:Model_Name.w ;模塊名(子程序名);PUSHA ;保護現(xiàn)場;PUSHCC;PUSHWX;PUSHWYModel_Name_IN_Adr.w ;模塊入口地址PUSH#{LOWModel_Name_IN_Adr} ;先把模塊入口地址低8位壓入堆棧PUSH#{HIGHModel_Name_IN_Adr} ;再把模塊入口地址高8位壓入堆棧;模塊實體指令系列Model_Name_OUT_Adr.w ;模塊出口地址

POPWX ;從堆棧中彈出模塊入口地址

SUBWX,#{OFFSETModel_Name_OUT_Adr} ;減去模塊出口地址低16位

NEGWX ;求補獲得模塊出口地址與入口地址的差

CPWX,#{OFFSETModel_Name_OUT_Adr-OFFSETModel_Name_IN_Adr};與模塊長度低16位比較

JREQModel_Name_RIGHT ;相同,說明正常進入本模塊,PC沒有“跑飛”

;不同,說明由其他模塊飛入,進入軟件陷阱

;DC.B05H ;不需進行數(shù)據(jù)保護時用非法指令碼,如用05H代替TRAP;DC.B05H;DC.B05H;DC.B05H;DC.B05H

TRAPModel_Name_RIGHT.W ;正常返回

;POPWY;POPWX;POPCC

;POPARET

(2)通過堆棧保護入口地址低8位的模塊結構。當堆棧深度有限時,也可以僅保存模塊入口地址的低8位,離開時僅計算模塊出口地址與入口地址低8位之差,并與模塊長度低8位比較。可見,這種結構是上述模塊的簡化,盡管在理論上攔截的準確性有所下降,但實踐表明其效果也不錯,原因是實際應用程序中兩模塊低位地址差相同的概率不大。Model_Name.L ;模塊名(子程序名);PUSHA ;保護現(xiàn)場;PUSHCC;PUSHWX;PUSHWYModel_Name_IN_Adr.L ;模塊入口地址

PUSH#{LOWModel_Name_IN_Adr} ;僅把模塊入口地址低8位壓入堆棧

;模塊實體指令系列Model_Name_OUT_Adr.L ;模塊出口地址

POPA ;從堆棧中彈出模塊入口地址低8位

SUBA,#{LOWModel_Name_OUT_Adr} ;減去模塊出口地址低8位

NEGA ;求補獲得模塊出口地址與入口地址差

CPA,#{LOWModel_Name_OUT_Adr-LOWModel_Name_IN_Adr};與模塊長度低8位比較

JREQModel_Name_RIGHT ;相同,說明正常進入本模塊,PC沒有“跑飛”不同,

;說明由其他模塊飛入,進入軟件陷阱

;DC.B05H ;無須進行數(shù)據(jù)保護時用非法指令碼,如05H代替TRAPTRAPModel_Name_RIGHT.L ;正常返回;POPWY;POPWX;POPCC

;POPARETF以上模塊結構不僅適用于子程序、中斷服務程序,而且適用于多任務程序結構中的任務模塊、任務內的作業(yè)模塊。由于在地址標號前加入了OFFSET、LOW、HIGH等操作符,因此與模塊入/出口地址標號類型無關,即模塊可以位于00段內(地址標號類型為?.W),也可以位于01段及其以上段內(地址標號類型為?.L)。在STM8系統(tǒng)中,對于中斷服務程序或不需要保護現(xiàn)場的子程序來說,模塊入口地址Model_Name_IN_Adr就是模塊名Model_Name,即不必設置模塊入口地址標號Model_Name_IN_Adr。可見,為檢查PC“跑飛”增加的指令不多,保護低16位入口地址時,每一模塊僅需要額外的15個字節(jié)存儲空間(當只保護低8位入口地址時,僅需11個字節(jié)),對運行速度影響也很小。當模塊代碼規(guī)模較大時,對運行效率的影響幾乎可忽略不計(因此不推薦在代碼長度短或實時性要求高的模塊中采用);每一模塊也只額外占用1~2個字節(jié)堆棧,對堆棧深度要求不高。不過當堆棧深度有限時,尤其是嵌套層次較多時,要特別注意堆棧溢出問題(所幸的是STM8系統(tǒng)堆棧深度較大,一般不會出現(xiàn)堆棧溢出問題)。

(3)直接保護入口地址的模塊結構。當堆棧深度有限時,可直接將模塊入口地址保存到內部RAM單元中,其模塊結構如下所示:Model_Name_INAdr_ram ds.w 1 ;在RAM段定義模塊入口地址保存單元Model_Name.w ;模塊名(子程序名);PUSHA;PUSHCC;PUSHWX;PUSHWYModel_Name_IN_Adr.w

LDWX,#{OFFSETModel_Name_IN_Adr} ;取模塊入口地址低16位

LDWModel_Name_INAdr_ram,X ;把模塊入口地址低16位送

;Model_Name_INAdr_ram字單元

;模塊程序實體Model_Name_OUT_Adr.wLDWX,#{LOWModel_Name_OUT_Adr) ;取模塊出口地址低16位

SUBWX,Model_Name_INAdr_ram ;減去模塊入口地址低16位

CPWX,#{OFFSETModel_Name_OUT_Adr-OFFSETModel_Name_IN_Adr};與模塊長度比較

JREQModel_Name_RIGHT ;相同,說明正常進入模塊,PC沒有“跑飛”

;不同,說明由其他模塊飛入,進入軟件陷阱

TRAPModel_Name_RIGHT.W

CLRWModel_Name_INAdr_ram ;清除模塊入口地址保存單元

;POPWY

;POPWX

;POPCC

;POPA

RET需要注意的是:直接保護模塊入口地址攔截方式不支持嵌套操作,即它在主程序模塊中使用后,就不能在子程序模塊、中斷服務程序模塊中使用;在低優(yōu)先級中斷服務程序中使用后,就不能在高優(yōu)先級中斷服務程序中使用,除非每一個優(yōu)先級使用不同的內部RAM單元存放各自的入口地址(由于同優(yōu)先級中斷不能嵌套,因此同優(yōu)先級中斷服務程序可以使用同一單元記錄入口地址)。

3)攔截效果遠程攔截結構模塊能有效地攔截模塊間(遠距離)“跑飛”現(xiàn)象。顯然,模塊規(guī)模越小,攔截的成功率就越高(為使攔截可靠性與效率之間取得一定的平衡,實踐表明,模塊長度控制在0.5~2KB為宜)。它不僅能準確感知PC是否正常進入本模塊,還可以從模塊入口地址單元中判斷出從哪一模塊飛入,為失控后的系統(tǒng)恢復提供了有價值的線索(如可根據(jù)模塊功能,將模塊入口地址裝入PC,重新執(zhí)行“跑飛”的模塊)。這種具有遠程攔截功能的模塊程序經(jīng)編譯后,模塊入口地址和出口地址固定,還能有效地阻止非授權用戶通過反匯編方式在模塊內添加或刪除指令,在一定程度上增加了代碼的安全性。11.4.4檢查并消除STM8指令碼中不需要的關鍵字節(jié)如果在STM8內核MCU指令碼中出現(xiàn)以下4個關鍵字節(jié),則一旦PC“跑飛”,落入包含這些關鍵字節(jié)的指令碼,并將這些關鍵字節(jié)作為指令的操作碼時,后果可能非常嚴重?!?8EH,HALT指令機器碼,強迫MCU進入低功耗模式。當它在主程序中出現(xiàn),將停止運行,直到能喚醒的中斷出現(xiàn),或看門狗計數(shù)器溢出,強迫系統(tǒng)復位;在中斷服務程序中出現(xiàn),則會改變中斷優(yōu)先級而造成混亂?!?8FH,WFI指令機器碼,等待一個中斷事件產(chǎn)生指令。當它在主程序中出現(xiàn),問題還不是很大,但在中斷服務程序中出現(xiàn),就會改變中斷優(yōu)先級,造成中斷嵌套混亂?!?82H,INT指令機器碼,僅用來跳轉到一個中斷子程序入口的指令?!?8BH,SWBRK指令機器碼,在調試模式時停止CPU的軟件斷點指令。在計算一個相對或者絕對尋址模式中時的分支指令(如條件跳轉指令、無條件跳轉指令或CALL)的目標地址時,通過鏈接器連接后可能會出現(xiàn)這些關鍵字節(jié)。當這些指令運行的最后一個機器碼為82H、8BH、8FH時,可在目標地址之前插入一條NOP指令消除;當最后一個機器碼為8EH時,可在目標地址之前插入兩條NOP指令消除。如果CALL指令調用的子程序首地址位于8200H~82FFH(256B)、8B00H~8BFFH(256?B)、8E00H~8FFFH(512?B)之間,則對應的CALL指令倒數(shù)第二個字節(jié)肯定為82H、8BH、8EH、8FH之一,解決辦法是調整子程序存放的位置,使其首地址在上述空間之外。當JP指令、JPF指令的目標地址在8200H~82FFH、8B00H~8BFFH、8E00H~8FFFH之間時,對應指令機器碼倒數(shù)第二字節(jié)也包含82H、8BH、8EH、8FH之一,解決方法也是調整程序的存放位置。待程序調試結束后,在列表文件(.LST)中查找上述關鍵字節(jié),按規(guī)則修改源程序,重新編譯、連接后即可消除這些關鍵字節(jié)。11.4.5提高信號輸入/輸出的可靠性

1.提高電平(變化緩慢)信號輸入/輸出的可靠性

1)提高輸入信號的可靠性讀取變化緩慢的電平信號,如判別某個按鍵是否被按下,交流電源是否存在時,可采用“定時讀取、多數(shù)判決”的方式來消除寄生的低頻與高頻干擾。

為消除低頻干擾可采用定時讀取方法。定時讀取方法是每隔特定時間讀取輸入信號狀態(tài),并用3個寄存器位記錄最近3次獲取的狀態(tài)信息,然后根據(jù)狀態(tài)編碼確定輸入信號的當前狀態(tài)。至于定時間隔取多少合適與輸入信號的性質有關。例如,對于經(jīng)全波整流、電容濾波后的交流信號,根據(jù)全波整流、電容濾波輸出信號特征(周期為10ms),可每各5ms讀一次輸入信號狀態(tài),于是最近3個狀態(tài)編碼的含義為●?111:表示交流存在?!?110:表示交流可能不存在,但尚不能準確判定。●?100:表示交流消失?!?000:表示無交流?!?001:表示可能屬于交流恢復狀態(tài)?!?011:表示交流恢復?!?010:表示正脈沖干擾,應判定為“000”態(tài)?!?101:表示負脈沖干擾,應判定為“111”態(tài)。為消除高頻干擾,定時時間到可用“3中取2”或“5中取3”的方式代替“一讀”方式。假設交流輸入信號接PD1

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論