宋文強(qiáng),劉昕昀
(工業(yè)和信息化部 電子第五研究所,廣州510610)
宋文強(qiáng)(碩士研究生),主要從事嵌入式軟件可靠性技術(shù)和FPGA 測(cè)試技術(shù)研究。
引 言
在目前種類繁多的Flash MCU 中,有很多可以自編程,即可以在單片機(jī)(MCU)運(yùn)行過程中,實(shí)時(shí)存儲(chǔ)程序運(yùn)行中產(chǎn)生的數(shù)據(jù),甚至是改變程序本身。具有這種功能的Flash MCU 可以靈活地使用Flash來存儲(chǔ)數(shù)據(jù),實(shí)現(xiàn)遠(yuǎn)程在線自動(dòng)升級(jí)自己的用戶代碼 (Firmware)。MC68HC908JL8[1](以下簡(jiǎn)稱JL8)是Freescale公司推出的一款08系列8位MCU,以成熟的Flash存儲(chǔ)技術(shù)取代了05系列的EEPROM,繼承了EEPROM 的可再編程特性。JL8內(nèi)部有8KB的Flash存儲(chǔ)區(qū),可用作程序存儲(chǔ)區(qū)和數(shù)據(jù)存儲(chǔ)區(qū)。該Flash 為NOR Flash,程序可直接在Flash上運(yùn)行,不必再把代碼讀到系統(tǒng)RAM 中,用戶可以在這個(gè)非易失的存儲(chǔ)區(qū)內(nèi)反復(fù)存儲(chǔ)和讀取一個(gè)數(shù)據(jù)集。
由于Flash存儲(chǔ)區(qū)的最小擦除單位是頁(JL8一頁有64個(gè)字節(jié)),若數(shù)據(jù)的長(zhǎng)度小于一頁,那么每次寫和擦除都不能完全使用該頁,沒有用到的地方就浪費(fèi)了。但如果是EEPROM 就不存在這個(gè)問題,因?yàn)镋EPROM 可以基于字節(jié)進(jìn)行寫和擦除。JL8為了解決這個(gè)問題,在其監(jiān)控ROM 區(qū)內(nèi)提供了EE_WRITE、EE_READ 子例程給用戶使用,從而更充分地使用Flash頁進(jìn)行數(shù)據(jù)存儲(chǔ)[2]。
Freescale公司JL8 MCU 采用Flash 存儲(chǔ)代碼和數(shù)據(jù),通過片上內(nèi)置電壓泵,支持在線編程[3-4]。在不需要外接高壓的情況下,通過指令可實(shí)現(xiàn)Flash空間的擦/寫操作。Flash擦/寫操作的實(shí)現(xiàn)主要有兩種方式:一是用戶自行編寫程序,二是調(diào)用監(jiān)控ROM 中自帶子程序。為防止意外操作,單片機(jī)在硬件設(shè)計(jì)上加以改進(jìn),增加了FLCR(Flash控制寄存器)和FLBPR(Flash塊保護(hù)寄存器)兩個(gè)寄存器,如果要擦/寫Flash,須先打開FLCR和FLBPR相應(yīng)位。用戶編程時(shí)需要控制兩個(gè)寄存器,而使用監(jiān)控ROM 程序,只需設(shè)置FLBPR相應(yīng)位。
JL8 MCU Flash以頁為單位進(jìn)行擦除,可將“0”全部置為“1”。Flash寫操作與擦除相反,可將“1”置為“0”,但原來為“0”處不能寫為“1”。所以如果需要用Flash存儲(chǔ)數(shù)據(jù)時(shí),正常操作流程是先擦除再寫。需要注意的是,擦除操作是按頁進(jìn)行,寫操作沒有限制,可按照字節(jié)進(jìn)行。
JL8 MCU 片內(nèi)Flash可在監(jiān)控模式(Monitor Mode)和用戶模式(User Mode)這兩種模式下在線編程。其中監(jiān)控模式主要用于主機(jī)向單片機(jī)進(jìn)行程序?qū)懭耄话阌糜趯?duì)出廠的空白芯片進(jìn)行編程。JL8 MCU 監(jiān)控ROM 所提供的所有子程序的入口地址和基本功能如表1所列。具體使用方法可參考技術(shù)文檔。
表1 子程序列表
Flash MCU 出現(xiàn)程序改寫,原因可從硬件和軟件兩方面進(jìn)行分析[5]。硬件方面引起程序改寫的機(jī)理主要有:①電源失效;②時(shí)鐘毛刺;③VDD 爬升時(shí)間過長(zhǎng)。軟件上引起程序改寫機(jī)理主要有:①VDD 監(jiān)視沒有使能,或者VDD監(jiān)視雖然已經(jīng)使能,但沒有被設(shè)置成復(fù)位源,使得當(dāng)供電不正常時(shí)仍然進(jìn)行Flash操作,導(dǎo)致存儲(chǔ)數(shù)據(jù)產(chǎn)生異常操作;②用戶代碼(Firmware)對(duì)Flash的寫操作不當(dāng);③PC指針跑飛。硬件引起的Flash MCU 程序改寫出現(xiàn)時(shí)具有隨機(jī)的特征,即出現(xiàn)程序改寫的位置不固定。
在一款家用電器通用壓縮機(jī)控制設(shè)備中,其核心控制單元采用Freescale公司MC68HC908JL8單片機(jī),用于控制和優(yōu)化壓縮機(jī),可實(shí)現(xiàn)壓縮機(jī)的開關(guān)控制、壓縮機(jī)性能的提升以及保護(hù)功能。該控制單元程序只對(duì)Flash進(jìn)行讀操作,并無擦除/寫需求和設(shè)計(jì)。在部分產(chǎn)品出現(xiàn)壓縮機(jī)控制設(shè)備停機(jī)故障后,通過回讀故障設(shè)備的單片機(jī)存儲(chǔ)Flash后,發(fā)現(xiàn)部分代碼已被改寫。按照改寫Flash分布情況,將失效現(xiàn)象分成兩類:一是復(fù)位中斷向量($FFFE~$FFFF)低字節(jié)($FFFF)處部分位被改寫,失效產(chǎn)品數(shù)量較多,達(dá)80%,具體現(xiàn)象是將部分位從“1”改為“0”(有3種情況,分別為FF>AF,EF>AF,9F>8F);二是用戶Flash空間部分字節(jié)被改寫,這類較少,占20%,具體現(xiàn)象是將連續(xù)64字節(jié)改為0xFF。根據(jù)現(xiàn)象分析,第一類類似于字節(jié)寫操作,由于未進(jìn)行擦除操作,所以只能將“1”改為“0”,且均是試圖將高4位改為“A”;第二類類似于片擦除操作。經(jīng)過故障整理和分析,由于具有較強(qiáng)意義上的非隨機(jī)特征,可基本排除硬件故障引起的程序改寫。
通過分析源程序注意到,可能引起Flash程序改寫的軟件原因如下:對(duì)于①,程序已經(jīng)將VDD 監(jiān)視使能,且設(shè)置成復(fù)位源;對(duì)于②,用戶代碼設(shè)計(jì)時(shí)不對(duì)程序Flash進(jìn)行擦除/寫操作,即使異常出現(xiàn)第一類現(xiàn)象,也不會(huì)出現(xiàn)第二類現(xiàn)象,而程序跑飛異常調(diào)用到監(jiān)控ROM 程序可產(chǎn)生上述現(xiàn)象。在下節(jié)中對(duì)第二類失效現(xiàn)象進(jìn)行復(fù)現(xiàn)。
本節(jié)在不修改源代碼的基礎(chǔ)上,在源程序插入少量測(cè)試代碼以復(fù)現(xiàn)上述失效現(xiàn)象,證明在滿足測(cè)試代碼要求的條件下,可實(shí)現(xiàn)同樣的程序失效結(jié)果,僅對(duì)頁擦除操作進(jìn)行舉例。頁擦除操作可調(diào)用EraRnge實(shí)現(xiàn),具體如下:
在軟件運(yùn)行時(shí),由于外部原因使PC 指針跑飛,跳轉(zhuǎn)到$FCBE,如果此時(shí)寄存器A 中存儲(chǔ)數(shù)據(jù)(表示地址)指向的地址空間數(shù)據(jù)為20,則將對(duì)Flash進(jìn)行頁擦除操作。
結(jié) 語
本文對(duì)使用JL8 MCU 自帶監(jiān)控ROM 程序?qū)ζ螰lash進(jìn)行擦/寫等操作的方法和特點(diǎn)進(jìn)行了詳細(xì)的介紹。MCU 的Flash失效現(xiàn)象和原因很多,這里僅對(duì)軟件引起的Flash程序改寫的案例進(jìn)行了分析。根據(jù)具體現(xiàn)象判定程序改寫是由于程序跑飛或者異常跳轉(zhuǎn)使得程序意外調(diào)用監(jiān)控ROM 程序,為對(duì)Flash進(jìn)行失效分析的廣大研發(fā)和測(cè)試工程師提供一個(gè)失效分析案例和分析思路。
[1]李澤英,肖海橋,余文龍.MCS96 MC68 單片機(jī)原理與應(yīng)用[M].北京:清華大學(xué)出版社,1995.
[2]Motorola.MC68HC908JL8 HCMOS Microcontrollers Unit Technical Data,2002.
[3]徐麗華,王宜懷.MC68HC908JL8MCU 中虛擬 19 16 EEPROM 特性的應(yīng)用及剖析[J].計(jì)算機(jī)工程與應(yīng)用,2004(28):106-108.
[4]王宜懷,王林.MC68HC908GP32 MCU 的Flash存儲(chǔ)器在線編程技術(shù)[J].微電子學(xué)與計(jì)算機(jī),2002(7):15-19.
[5]邱亮.基于飛思卡爾8位MCU 的集成電路功能失效分析技術(shù)[D].天津:天津大學(xué),2007.
單片機(jī)與嵌入式系統(tǒng)應(yīng)用2015年11期