申 臻,宋雷軍,魏冬冬,于清華,劉 濤
(上海航天電子技術(shù)研究所,上海 201109)
8051單片機(jī)已在航空航天控制領(lǐng)域廣泛應(yīng)用,需要測評的嵌入式軟件數(shù)量逐年增多。軟件測試又是保障軟件安全、正確、完整的關(guān)鍵環(huán)節(jié)[1]。測試人員使用被測件的硬件平臺完成測試,通常會面臨兩個(gè)問題:1)重大科研或者重要型號項(xiàng)目的物理環(huán)境,難以為測試工作提供足夠的使用時(shí)間[2];2)不能執(zhí)行可能引起物理環(huán)境破壞的異常測試,測試的覆蓋性得不到保證[3]。面對只有軟件源代碼,實(shí)物測試環(huán)境不具備、故障測試用例無法執(zhí)行的測評任務(wù),如何提供有效測試環(huán)境成為軟件測評單位的難題。
編譯軟件Keil C51(美國Keil Software公司開發(fā))為51系列單片機(jī)程序[4]提供開發(fā)調(diào)試環(huán)境,涵蓋編輯、編譯、連接、調(diào)試、仿真等整個(gè)開發(fā)流程。在測試中,通過Keil編譯被測試的嵌入式軟件(以下簡稱為“被測件”)代碼,并提供被測件運(yùn)行的仿真環(huán)境?;贙eil提供的高級仿真接口(AGSI,advanced generic simulator interface)[5]自研全數(shù)字測試平臺(以下簡稱“測試平臺”)模擬芯片指令[6],實(shí)現(xiàn)被測件的仿真運(yùn)行、外圍激勵(lì)注入、外設(shè)硬件接口模擬、覆蓋率統(tǒng)計(jì)等。
基于以上背景,Keil C51為被測件提供運(yùn)行環(huán)境;測試平臺提供虛擬化接口、外圍激勵(lì)環(huán)境[7],實(shí)現(xiàn)測試用例執(zhí)行、故障注入、邊界測試以及測試結(jié)果的觀察。測試平臺與Keil之間通過用戶數(shù)據(jù)報(bào)協(xié)議(UDP,user datagram protocol)完成數(shù)據(jù)交互[8]。
本文基于Keil C51及測試平臺,完成被測件外設(shè)的虛擬化,生成可在測試平臺上運(yùn)行的可復(fù)用模塊。虛擬化外設(shè)包括:1553B總線、模數(shù)轉(zhuǎn)換 (AD,analog digital)采集、輸入/輸出(I/O,input/output)數(shù)據(jù)、RS422總線。測評人員通過測試平臺選擇被測件運(yùn)行所需的虛擬化外設(shè)模塊,構(gòu)建全數(shù)字測試環(huán)境,實(shí)現(xiàn)被測件運(yùn)行過程的可控,內(nèi)存、寄存器信息的可改。最后,以開發(fā)某電源下位機(jī)測試平臺為例,完成故障注入、測試用例執(zhí)行、測試結(jié)果觀測,驗(yàn)證虛擬化外設(shè)在嵌入式軟件測試過程中的有效性和可靠性。
嵌入式軟件測試需要具備兩個(gè)條件:1)嵌入式軟件的運(yùn)行環(huán)境[9];2)測試激勵(lì)注入及嵌入式軟件輸出數(shù)據(jù)的解析與顯示[10]。虛擬化的外設(shè)、通訊中間件、Keil,三者關(guān)系結(jié)構(gòu)如圖1所示。測試平臺的上位機(jī)部分,完成測試激勵(lì)注入以及接收、解析、顯示嵌入式軟件輸出的數(shù)據(jù);測試平臺的下位機(jī)部分,基于AGSI實(shí)現(xiàn)嵌入式軟件運(yùn)行時(shí)內(nèi)存、寄存器讀寫監(jiān)控、數(shù)據(jù)同步、觸發(fā)中斷、UDP通信等;Keil C51的uVision版本提供Windows下的集成開發(fā)環(huán)境(IDE,integrated development environment),實(shí)現(xiàn)嵌入式軟件的編譯、調(diào)試、運(yùn)行[11-13]。本文重點(diǎn)介紹1553B虛擬化、AD采集虛擬化、RS422虛擬化、I/O虛擬化。
圖1 測試平臺架構(gòu)
嵌入式軟件運(yùn)行過程會響應(yīng)不同中斷源,CPU檢測到中斷請求,執(zhí)行中斷服務(wù)程序做相應(yīng)的處理。測試平臺根據(jù)不同中斷源,更改對應(yīng)寄存器地址中的值,Keil內(nèi)核監(jiān)測到特殊寄存器值更改時(shí)觸發(fā)中斷,嵌入式軟件進(jìn)入中斷服務(wù)程序。其中特殊寄存器包括:串行口控制寄存器(SCON,serial control)、中斷開發(fā)/禁止(IE,interrupt enable)、P0口、P1口、P2口、P3口(8bit分別代表不同的中斷源,如P3.2為外部中斷INT0,P3.3為外部中斷INT1)等。對于中斷方式為電平觸發(fā)、邊沿觸發(fā),測試平臺可向P3口對應(yīng)bit位寫入高電平、低電平、上升沿、下降沿,實(shí)現(xiàn)中斷的觸發(fā)。
測試平臺實(shí)現(xiàn)對被測件內(nèi)存、寄存器的讀寫仿真,模擬總線1553B、AD、RS422、I/O接口等外設(shè)與被測件交互數(shù)據(jù)的過程。仿真過程如下:
1)上位機(jī)監(jiān)控被測件需要向外設(shè)寫數(shù)據(jù)的全部地址。當(dāng)Keil軟核識別到被測件運(yùn)行至向外設(shè)輸出數(shù)據(jù)處(即被測件寫地址操作),虛擬軟核觸發(fā)下位機(jī)中的寫回調(diào)函數(shù),通知下位機(jī)此時(shí)被測件向哪個(gè)地址寫入何值。下位機(jī)將收到的地址值及數(shù)據(jù),通過UDP發(fā)送給上位機(jī)程序,上位機(jī)收到地址及數(shù)據(jù)完成數(shù)據(jù)解析與界面顯示等后續(xù)處理。實(shí)現(xiàn)嵌入式軟件內(nèi)存、寄存器寫地址動(dòng)作的仿真。
2)上位機(jī)監(jiān)控被測件需要從外設(shè)讀數(shù)據(jù)的全部地址。當(dāng)Keil軟核識別到被測件運(yùn)行至從外設(shè)讀取數(shù)據(jù)處(即被測件讀地址操作),虛擬軟核觸發(fā)下位機(jī)中的讀回調(diào)函數(shù),通知下位機(jī)當(dāng)前被測件讀取的地址值。下位機(jī)將收到的地址值,通過UDP發(fā)送給上位機(jī)程序。上位機(jī)將虛擬外設(shè)向該地址寫入的模擬數(shù)據(jù),通過UDP發(fā)送給下位機(jī)通訊接口,使得被測件采集到上位機(jī)寫入的數(shù)據(jù)。實(shí)現(xiàn)嵌入式軟件內(nèi)存、寄存器讀地址動(dòng)作的仿真。
測試平臺的上位機(jī)部分主要包括上位機(jī)界面和虛擬外設(shè)。上位機(jī)界面分為輸入數(shù)據(jù)、輸出數(shù)據(jù)兩大部分:1)輸入數(shù)據(jù)部分,測試人員根據(jù)測試需求設(shè)置仿真數(shù)據(jù),通過虛擬外設(shè)將仿真數(shù)據(jù)發(fā)送給被測件。測試人員可設(shè)置不同的測試數(shù)據(jù),完成被測件的邊界測試、故障測試,保障測試充分性;2)輸出數(shù)據(jù)部分,實(shí)時(shí)顯示被測件運(yùn)行過程中輸出數(shù)據(jù)的解析及狀態(tài)顯示,供測試人員分析測試結(jié)果。
虛擬外設(shè)將測試人員在上位機(jī)界面設(shè)置的仿真數(shù)據(jù),轉(zhuǎn)換為滿足外設(shè)特定格式的數(shù)據(jù)幀,將轉(zhuǎn)換后的數(shù)據(jù)幀發(fā)送給被測件,實(shí)現(xiàn)測試激勵(lì)的注入。同時(shí),虛擬外設(shè)接收被測件運(yùn)行過程中輸出的數(shù)據(jù),轉(zhuǎn)交給上位機(jī)界面,完成數(shù)據(jù)的解析、顯示、存儲等處理。
其中,虛擬外設(shè)的設(shè)計(jì)與實(shí)現(xiàn)主要包括:總線1553B虛擬化、AD采集虛擬化、總線RS422虛擬化、被測件I/O接收虛擬化。
開展總線1553B虛擬化工作之前,需要研究1553B總線的物理實(shí)現(xiàn)邏輯,分析開發(fā)測試平臺需要仿真1553B總線的方法及內(nèi)容。本小節(jié)首先介紹測試平臺所關(guān)注的1553B總線簡介、1553B物理實(shí)現(xiàn)邏輯。其次,根據(jù)總線1553B物理實(shí)現(xiàn)邏輯的研究,設(shè)計(jì)并實(shí)現(xiàn)1553B中總線控制器(BC,bus controller)、遠(yuǎn)程終端(RT,remote terminal)的仿真。
2.1.1 1553B總線簡介
1553B出自美軍標(biāo)準(zhǔn)MIL-TD-1553B,原為美軍航空電子綜合通信的標(biāo)準(zhǔn),全稱為“飛機(jī)內(nèi)部時(shí)分制指令響應(yīng)式多路傳輸數(shù)據(jù)總線”[14]。1553B為基于消息(Message)的通信協(xié)議,每條消息的最大信息量32字,分為命令字、數(shù)據(jù)字、狀態(tài)字,每類字長20 bit(有效數(shù)據(jù)16 bit),每個(gè)字的前3位為單字的同步字頭,最后1位是奇偶校驗(yàn)位[15]。命令字位于每條消息的起始部分,其內(nèi)容決定消息的特征與標(biāo)識,狀態(tài)字只能由RT發(fā)出,其內(nèi)容表征RT向BC發(fā)出的有效命令的反饋,BC根據(jù)狀態(tài)字內(nèi)容決定下一步操作。數(shù)據(jù)字支持RT->BC、BC->RT、RT->RT傳輸數(shù)據(jù)[16],具體字內(nèi)容如圖2所示。
圖2 1553B總線字格式
1553B總線采用指令/響應(yīng)型通信協(xié)議,包括3種終端:總線控制器BC、遠(yuǎn)程終端RT、總線監(jiān)視器(MT,monitor terminal)。傳輸?shù)男畔⒏袷接蠦C->RT、RT->BC、RT->RT、廣播方式和系統(tǒng)控制方式,且全部在BC的參與下完成。1553B總線傳輸消息的標(biāo)準(zhǔn)過程為:BC向某RT發(fā)送接收/發(fā)送指令,RT在給定的響應(yīng)時(shí)間范圍內(nèi)發(fā)回一個(gè)狀態(tài)字,并執(zhí)行消息的接收/發(fā)送[17]。消息傳輸格式如圖3所示。其中*表示響應(yīng)時(shí)間,范圍是4.0~12.0 μs,表示消息間隔時(shí)間,規(guī)定>4 μs。
圖3 消息傳輸格式
2.1.2 1553B物理實(shí)現(xiàn)邏輯研究
1553B實(shí)現(xiàn)虛擬化,完成與被測件數(shù)據(jù)、指令交互,需要清晰的梳理出1553B物理實(shí)現(xiàn)邏輯。在1553B總線簡介中指出3種終端:BC、RT、MT,其中BC、RT完成總線指令、總線數(shù)據(jù)的收發(fā)。本段著重介紹BC、RT的物理邏輯。
RT存儲器結(jié)構(gòu)在非增強(qiáng)模式和增強(qiáng)模式下,有如表1所示幾個(gè)區(qū)域均被設(shè)置為專用區(qū)。其他區(qū)域?yàn)閿?shù)據(jù)塊等。RT查找表實(shí)現(xiàn)將TX/RX/BCST子地址對應(yīng)的數(shù)據(jù)塊映射到共享RAM區(qū)的機(jī)制。可對單獨(dú)子地址所指向的存儲空間進(jìn)行讀寫操作,對廣播、接收、發(fā)送數(shù)據(jù)分離處理,實(shí)現(xiàn)安全、獨(dú)立的存取數(shù)據(jù)。RT指令堆棧的長度可設(shè)為125字、512字、1 024字、2 048字。
1553B采用雙緩存機(jī)制,對應(yīng)查找表A、B。每個(gè)查找表分4塊:32個(gè)發(fā)送子地址、32個(gè)接收子地址、32個(gè)廣播子地址、32個(gè)子地址控制字。RT查找表具體內(nèi)容如表2所示。
表1 RT存儲器機(jī)構(gòu)固定部分
表2 RT查找表
子地址控制字中存儲管理器2、存儲管理器1、存儲管理器0(MM,memery management)3 bit的取值,設(shè)置每次發(fā)送、接收或廣播數(shù)據(jù)的長度,長度可設(shè)置為128字、256字、512字、1 024字、4 096字及8 192字。1553B虛擬化設(shè)計(jì)中要支持根據(jù)子地址控制字設(shè)置收發(fā)緩存大小[18]。
在1553B虛擬化時(shí),根據(jù)總線指令的收發(fā)子地址,對應(yīng)查找表查詢到該子地址對應(yīng)的內(nèi)存存儲起始地址。接收到的數(shù)據(jù)被寫入由查找表指針指向的數(shù)據(jù)塊,需要發(fā)送的數(shù)據(jù)從查找表指針指向的數(shù)據(jù)塊取出并發(fā)送。
2.1.3 BC虛擬化實(shí)現(xiàn)
1553B的BC虛擬化需要仿真上述“物理實(shí)現(xiàn)邏輯研究”中指出的1553B初始化、查詢查找表、讀寫子地址對應(yīng)存儲區(qū)等。仿真BC2RT數(shù)據(jù)、BC2RT指令、RT2BC數(shù)據(jù)、RT2BC指令等數(shù)據(jù)、指令的交互過程。使用共享內(nèi)存模擬查找表及數(shù)據(jù)塊的存儲邏輯。定義兩個(gè)枚舉結(jié)構(gòu)體Enum1553B_Channel_Num、EnumCommand分別表示AB區(qū)、BC指令類型,對應(yīng)代碼如下所示:
public enum Enum1553B_Channel_Num{
ChannelA = 0,
ChannelB = 1
}
public enum EnumCommand{
BC2RT,
RT2BC,
RT2RT,
Broadcast,
RT2RTs,
ModeCode,
BroadcastModeCode,
NoUsed,
Error
}
定義BC仿真類BcHelper,完成1553B總線的初始化。初始化包括:映射的內(nèi)存地址StartAddr、1553B指令地址BcCmdAddr,1553B相關(guān)寄存器地址映射(RT指令堆棧指針A、RT指令堆棧指針B、傳送矢量字、數(shù)據(jù)同步、查找表A起始地址、查找表B起始地址、發(fā)送查找指針表、接收查找指針表、廣播查找指針表、子地址控制字表等),初始化內(nèi)容如下所示:
public static EnumIntName IntName = EnumIntName.NoInt;
// BC模擬器地址映射
public static UInt32 StartAddr = 0; //映射的mem地址
public static UInt16 BcCmdAddr = 0; //映射的1553B指令地址
//增強(qiáng)型1553B寄存器地址映射
private static UInt32 AddressStackA = 0; //堆棧
public static UInt32 AddressRtCommandStackPointerA = 0x100;
public static UInt32 AddressRtCommandStackPointerB = 0x104;
private static UInt32 AddressTransmitVetcorWord = 0x120;
private static UInt32 AddressSynchronizeWithData = 0x111;
private static UInt32 AddressReceiveLookupPointerTableA = 0x140;
private static UInt32 AddressReceiveLookupPointerTableB = 0x1c0;
private static UInt32 AddressTransmitLookupPointerTableA = 0x160;
private static UInt32 AddressTransmitLookupPointerTableB = 0x1e0;
private static UInt32 AddressBroadcastLookupPointerTableA = 0x180;
private static UInt32 AddressBroadcastLookupPointerTableB = 0x200;
private static UInt32 AddressSubaddressControlWordTableA = 0x1a0;
private static UInt32 AddressSubaddressControlWordTableB = 0x220;
private static UInt32 AddressDataBlock = 0x260;
}
BC端發(fā)送控制命令的仿真函數(shù)如下所示:
///
/// 發(fā)控制命令
///
/// RT地址
/// 發(fā)送標(biāo)志,0標(biāo)識RT端接收
/// 子地址
/// 長度/方式字(指1553B發(fā)送的"字"的長度)
/// 發(fā)送的數(shù)據(jù)
/// 是否是廣播標(biāo)志
/// 通道標(biāo)志
public static void SendCmd(Enum1553B_Channel_Num channel, bool bcst, int rtAddr, bool rx, int sa, int len, byte[] data)
仿真控制命令后可實(shí)現(xiàn)如下過程模擬:BC發(fā)送廣播、BC2RT數(shù)據(jù)、BC2RT命令、方同步碼等??刂泼盍鞒倘鐖D4所示。其中查找表仿真方法為:
1)判斷當(dāng)前控制命令的類型:廣播、發(fā)送。
2)判斷當(dāng)前命令由BC發(fā)到RT的哪個(gè)SA。
3)查詢查找表中該SA對應(yīng)的存儲起始地址,以及嵌入式軟件設(shè)置的內(nèi)存起始地址,計(jì)算出該SA數(shù)據(jù)塊在共享內(nèi)存中的存儲區(qū)域。
4)將SA對應(yīng)的存儲區(qū)域數(shù)據(jù)取出后發(fā)送給RT。
圖4 控制命令仿真流程
BC端接收RT發(fā)來數(shù)據(jù)(RT2BC數(shù)據(jù))的仿真過程如圖5所示。其中對查找表的使用與發(fā)送控制命令仿真部分相同。
圖5 BC接收RT數(shù)據(jù)流程
2.1.4 RT虛擬化實(shí)現(xiàn)
實(shí)際應(yīng)用中被測件有時(shí)作為BC端使用,在構(gòu)建測試環(huán)境時(shí)需要對外設(shè)RT進(jìn)行虛擬化仿真,即實(shí)現(xiàn)RT2BC數(shù)據(jù)、RT2BC指令、RT2RT、RT2RTS、BC2RT等數(shù)據(jù)、指令的交互過程[19]。
模擬RT端接收BC發(fā)來的指令、數(shù)據(jù),將收到的數(shù)據(jù)放入本地共享內(nèi)存,共享內(nèi)存的組織方式與“BC端仿真模擬”一致。外設(shè)RT收到作為BC的被測件發(fā)送的。模擬RT端的處理流程如圖6所示。
圖6 RT端仿真處理流程
2.2.1 AD采集虛擬化設(shè)計(jì)
實(shí)際應(yīng)用中嵌入式軟件通過AD采集模塊采集模擬信號,經(jīng)過模數(shù)轉(zhuǎn)化,將轉(zhuǎn)換后的數(shù)字量用于軟件的后續(xù)使用[20]。
嵌入式軟件采集信號后的處理過程,實(shí)際使用的是數(shù)字量而非模擬量。因此,在測試平臺中無需仿真模數(shù)轉(zhuǎn)換過程,可直接將數(shù)字量值賦給嵌入式軟件。數(shù)字量可通過AD采集界面設(shè)置任意值,供嵌入式軟件采集。既能滿足嵌入式軟件從AD采集模塊獲取數(shù)字量的要求,又能滿足AD采集模塊測試的充分性。
2.2.2 AD采集虛擬化實(shí)現(xiàn)
不同被測件AD采集部分的處理過程有相似之處,將通用的處理過程抽象為AD采集模塊,完成AD采集外設(shè)的虛擬化。AD數(shù)據(jù)的采集與外設(shè)的交互部分涉及采集通道選擇、采集高低字節(jié)、采集次數(shù)等。嵌入式軟件與外設(shè)交互的流程如圖7所示。
圖7 AD采集外設(shè)交互流程
實(shí)現(xiàn)AD采集虛擬化,需要開辟一段共享內(nèi)存用于存儲測試人員設(shè)置的一組AD值,數(shù)值內(nèi)容要求:
1)采集的路數(shù);
2)每路數(shù)據(jù)采集次數(shù);
3)每次采集值,支持設(shè)置不同值。
被測件第某次采集某路AD數(shù)據(jù)時(shí),觸發(fā)測試平臺的讀回調(diào)函數(shù)。在回調(diào)函數(shù)中判斷當(dāng)次采集為嵌入式軟件第幾次采集第幾路AD數(shù)據(jù),取出共享內(nèi)存中對應(yīng)的AD值,供嵌入式軟件采集。AD采集虛擬化處理流程與圖7所示的嵌入式軟件與AD外設(shè)交互流程相同。
不同嵌入式軟件通過測試平臺界面可配置采集AD數(shù)據(jù)通道、采集地址、CPU時(shí)鐘頻率、采集方式等信息,如圖8所示。
圖8 AD采集配置界面
2.3.1 總線RS422虛擬化設(shè)計(jì)
串行總線RS422通信由于其在傳輸距離、抗干擾能力方面的優(yōu)勢,在航天嵌入式軟件中普遍應(yīng)用[21]。嵌入式軟件測試時(shí)主要關(guān)心被測件從串口采集數(shù)據(jù)之后的處理流程正確與否,以及觀察被測件輸出的串口數(shù)據(jù)。被測件通過串口采集數(shù)據(jù)的方式為:MOV A SBUF;通過串口輸出數(shù)據(jù)的方式為:MOV SBUF A。其中SBUF為寄存器0x99。
因此,在測試平臺開發(fā)中無需仿真串口全部物理功能,只需實(shí)現(xiàn)被測件從串口采集、輸出數(shù)據(jù)的過程。測試人員根據(jù)測試需求,靈活設(shè)置正確值、邊界值、異常值等供被測件采集,用白盒測試法分析被測件采集串口數(shù)據(jù)后不同處理分支的正確性。被測件通過串口輸出的數(shù)據(jù),由測試平臺接收并依據(jù)通信協(xié)議完成解析,方便測評人員觀察。
2.3.2 總線RS422虛擬化實(shí)現(xiàn)
實(shí)現(xiàn)對總線RS422的虛擬化,處理邏輯如圖9所示。
圖9 RS422總線數(shù)據(jù)交互流程
具體方法如下:
1)測試人員設(shè)置輸入激勵(lì)并存入共享隊(duì)列;
2)被測件運(yùn)行到需要從RS422獲取數(shù)據(jù)處,即從寄存器0x99讀取數(shù)據(jù),觸發(fā)測試平臺的讀回調(diào)函數(shù)。測試平臺將共享隊(duì)列中的測試激勵(lì)通過0x99注入被測件;
3)被測件通過串行總線RS422輸出數(shù)據(jù)時(shí),即通過寄存器0x99輸出數(shù)據(jù),觸發(fā)測試平臺寫回調(diào)函數(shù)。測試平臺依據(jù)被測件通信協(xié)議接收一整幀串口數(shù)據(jù)后,完成解析并在測試平臺界面顯示。測評人員通過界面觀察被測件輸出的串口數(shù)據(jù),判斷其運(yùn)行是否合理。
2.4.1 I/O虛擬化設(shè)計(jì)
嵌入式軟件外設(shè)包括上述通用的1553B、RS422、AD采集,還包括與FPGA、DSP或其他外設(shè)交互的硬件信號、數(shù)據(jù)等。建立完整的嵌入式軟件數(shù)字仿真測試環(huán)境,還需定制化的完成被測軟件全部輸入數(shù)據(jù)、全部輸出數(shù)據(jù)解析的仿真[22]。這部分定制化的外設(shè)仿真統(tǒng)稱為I/O虛擬化。
2.4.2 I/O虛擬化實(shí)現(xiàn)
I/O虛擬化實(shí)現(xiàn)過程與總線RS422虛擬化相似,與流程圖9不同之處為:“測試人員設(shè)置外圍激勵(lì)”,此處提供兩種設(shè)置激勵(lì)的方法,測試人員可通過界面和具有固定格式的Excel表格設(shè)置外圍激勵(lì);其次,被測件從總線RS422取數(shù),改為從通過I/O交互數(shù)據(jù)的外設(shè)采集取數(shù)。I/O虛擬化實(shí)現(xiàn)的具體方法如下:
1)針對不同外設(shè)開辟一段獨(dú)占的共享內(nèi)存,用于存儲測試人員設(shè)定的測試激勵(lì)。
2)設(shè)計(jì)固定格式的Excel表格,如表3所示。測試人員將測試激勵(lì)填入表格,測試平臺運(yùn)行后自動(dòng)讀取表格內(nèi)容,將數(shù)據(jù)及地址成對的存入共享內(nèi)存。
表3 I/O固定輸入數(shù)據(jù)格式
3)測試過程中,通過界面實(shí)時(shí)設(shè)置測試激勵(lì)。
4)被測件運(yùn)行至采集外設(shè)數(shù)據(jù)地址處,觸發(fā)測試平臺的讀回調(diào)函數(shù)。測試平臺根據(jù)接收到的“讀地址”,將共享內(nèi)存中對應(yīng)的數(shù)據(jù)發(fā)送給被測軟件。
5)被測件向“寫地址”輸出1字節(jié)數(shù)據(jù)或者一幀遙測數(shù)據(jù)時(shí),觸發(fā)測試平臺的寫回調(diào)函數(shù)。測試平臺記錄接收到的“寫地址”以及對應(yīng)1字節(jié)數(shù)據(jù)或者一幀遙測數(shù)據(jù),依照通信協(xié)議完成被測件輸出數(shù)據(jù)的解析。測試人員可通過界面實(shí)時(shí)觀察被測軟件的輸出信息。
為驗(yàn)證上述描述的嵌入式軟件外設(shè)虛擬化的有效性和可靠性。以某電源下位機(jī)軟件測試平臺開發(fā)為例,模擬1553B、RS422、I/O、AD采集等外設(shè),實(shí)現(xiàn)被測件外圍環(huán)境的正常功能測試、異常故障用例注入,提高測試的充分性,完成對該電源下位機(jī)軟件的測試工作。該電源下位機(jī)軟件主要功能是太陽電池陣功率調(diào)節(jié)、蓄電池組充放電管理功能。需要完成工程參數(shù)的采集處理、遙控指令的執(zhí)行、蓄電池充電管理、均衡器控制等功能,通過1553B總線實(shí)現(xiàn)與綜合電子分系統(tǒng)的信息交換。
3.1.1 上位機(jī)部分搭建
基于自研測試平臺選擇1553B模塊、AD采集模塊、針對該電源下位機(jī)開發(fā)的I/O模塊。測試平臺模塊選擇界面如圖10所示。
圖10 測試平臺搭建界面
總線1553B虛擬化后需要通過界面配置接收發(fā)送子地址、廣播子地址、寄存器、中斷觸發(fā)等信息,以完成被測試軟件與外部設(shè)備通過1553B傳輸數(shù)據(jù)的仿真。配置界面如圖11所示。
圖11 總線1553B配置界面
AD采集外設(shè)模擬需要配置被測試軟件采集地址、采集高低字節(jié)地址等信息,配置界面如圖8所示。
3.1.2 被測件運(yùn)行環(huán)境配置
嵌入式軟件電源下位機(jī)程序的仿真運(yùn)行環(huán)境由Keil提供,配置基于AGSI編寫的動(dòng)態(tài)鏈接庫,使用Keil加載源程序完成編譯。使用Keil軟件運(yùn)行電源下位機(jī)程序,可完成電源下位機(jī)程序動(dòng)態(tài)運(yùn)行下的白盒測試。其中動(dòng)態(tài)鏈接庫實(shí)現(xiàn)測試平臺與Keil軟件UDP通信、被測試軟件內(nèi)存、寄存器的讀寫監(jiān)視、定時(shí)器設(shè)置、時(shí)需同步、中斷觸發(fā)等。
測試平臺運(yùn)行界面如圖12所示。測試人員可通過運(yùn)行界面的左側(cè)設(shè)置注入激勵(lì)的內(nèi)容,實(shí)時(shí)更改注入的總線1553B、RS422的指令幀或者數(shù)據(jù),以及被測件需要從I/O外設(shè)采集的全部數(shù)據(jù)。運(yùn)行界面右側(cè)為被測件上傳數(shù)據(jù)的實(shí)時(shí)顯示。
圖12 運(yùn)行界面
AD采集界面如圖13所示,測試人員可實(shí)時(shí)更改供被測件采集的各路AD數(shù)據(jù)。支持直接在界面上更改AD值、導(dǎo)入AD數(shù)據(jù)Excel表格兩種方式設(shè)置AD值。
圖13 AD采集界面
通過測試平臺完成被測件中斷INT0、T0、T1執(zhí)行時(shí)間、中斷響應(yīng)總線指令時(shí)間的記錄,以及周期發(fā)送指令、覆蓋率統(tǒng)計(jì)。程序地址計(jì)數(shù)器(PC,program counter)用于存放要執(zhí)行指令的地址,16位,能自動(dòng)加1。一個(gè)機(jī)器周期(M-Machine周期)是12個(gè)時(shí)鐘周期,當(dāng)主頻為12 MHz時(shí),一個(gè)機(jī)器周期為:1 M = 1/12 MHz*12=1 μs。被測件某段程序執(zhí)行時(shí)間的計(jì)算方法是:記錄該段程序起止PC之間執(zhí)行的機(jī)器周期數(shù),乘以一個(gè)機(jī)器周期的時(shí)間,得到該段程序的執(zhí)行時(shí)間。
該電源下位機(jī)軟件共使用3種中斷INT0、T0、T1,中斷服務(wù)程序執(zhí)行時(shí)間的測試結(jié)果如表4所示。
表4 中斷服務(wù)程序執(zhí)行時(shí)間
覆蓋率統(tǒng)計(jì)支持被測件目標(biāo)碼覆蓋率情況保存、多個(gè)覆蓋率文件合并,源碼目標(biāo)碼對照顯示。統(tǒng)計(jì)結(jié)果針對目標(biāo)碼執(zhí)行情況進(jìn)行分析,其中包括6種執(zhí)行結(jié)果:
1)EX:executed,該條目標(biāo)碼語句執(zhí)行,覆蓋率統(tǒng)計(jì)結(jié)果中以綠色顯示;
2)NE:Not Executed,語句沒有執(zhí)行,覆蓋率統(tǒng)計(jì)結(jié)果中以紅色顯示;
3)JF:Jump Fully,分支完全執(zhí)行,覆蓋率統(tǒng)計(jì)結(jié)果中以黃色顯示;
4)JN:Jump Never,分支順序執(zhí)行,但是沒有跳轉(zhuǎn),即每次執(zhí)行到這條語句,跳轉(zhuǎn)條件都不滿足,覆蓋率統(tǒng)計(jì)結(jié)果中以黃色顯示;
5)JO:Jump Only,執(zhí)行了分支跳轉(zhuǎn),但是沒有順序執(zhí)行,即每次執(zhí)行到這條語句都是跳轉(zhuǎn),覆蓋率統(tǒng)計(jì)結(jié)果中以黃色顯示;
6)JNE(jump not executed),跳轉(zhuǎn)分支、順序分支都沒有執(zhí)行,覆蓋率統(tǒng)計(jì)結(jié)果中以紅色顯示。
目標(biāo)碼覆蓋率統(tǒng)計(jì)結(jié)果中先顯示一句源碼,緊接著顯示對應(yīng)的目標(biāo)碼,并在第一列顯示每條目標(biāo)碼的執(zhí)行情況。根據(jù)每條目標(biāo)碼的執(zhí)行情況標(biāo)示綠色、紅色、黃色,方便測評人員觀察,如圖14所示。
被測件目標(biāo)碼覆蓋率統(tǒng)計(jì)情況如表5所示,包括目標(biāo)碼模塊名、總指令數(shù)、執(zhí)行指令數(shù)、執(zhí)行百分比、總跳轉(zhuǎn)指令數(shù)、JF指令數(shù)、JO指令數(shù)、JN指令書、JNE指令數(shù)、JF執(zhí)行百分比。部分嵌入式軟件目標(biāo)碼分支、語句覆蓋率均要達(dá)到百分之百。表5展示覆蓋率統(tǒng)計(jì)功能,并非電源下位機(jī)軟件第三方測試的最終覆蓋率統(tǒng)計(jì)結(jié)果。
實(shí)驗(yàn)結(jié)果證明,在自研測試平臺基礎(chǔ)上,基于Keil C51完成嵌入式軟件外設(shè)虛擬化,實(shí)現(xiàn)嵌入式軟件仿真運(yùn)行、外圍激勵(lì)注入、外設(shè)硬件接口模擬的方法切實(shí)可行。通過數(shù)字測試平臺不僅能夠完成與實(shí)物測試平臺相同的測試效果,還能完成故障注入、邊界測試、目標(biāo)碼覆蓋率等。
表5 目標(biāo)碼覆蓋率統(tǒng)計(jì)結(jié)果
附注:表格中為第三方測試進(jìn)行中,被測件目標(biāo)碼覆蓋率統(tǒng)計(jì)結(jié)果的部分展示
本文提出的基于Keil C51的嵌入式軟件外設(shè)虛擬化,實(shí)現(xiàn)了在真實(shí)環(huán)境中運(yùn)行的嵌入式軟件與全部外部設(shè)備交互數(shù)據(jù)的仿真,使得測試過程不受硬件實(shí)物平臺的使用限制,擁有充分的測試時(shí)間。
1)在測試過程中,外部設(shè)備的虛擬化提供了靈活的測試激勵(lì)注入方式,能夠完成實(shí)物測試環(huán)境難以模擬的故障注入、邊界測試以及測試結(jié)果實(shí)時(shí)顯示。
2)目標(biāo)碼覆蓋率統(tǒng)計(jì)能夠幫助測評人員分析被測件代碼執(zhí)行情況,精準(zhǔn)定位未執(zhí)行的語句、分支。輔助測評人員分析未執(zhí)行的原因,針對性的設(shè)計(jì)測試用例,進(jìn)而完成未執(zhí)行語句、分支的覆蓋。
3)嵌入式軟件外設(shè)虛擬化后,主要解決了測試工作中的兩個(gè)問題:測試過程不依賴嵌入式軟件真實(shí)的運(yùn)行環(huán)境;測試過程內(nèi)存、寄存器信息可控可改,測試用例注入方式靈活,能夠完成實(shí)物測試環(huán)境不能滿足的故障、邊界測試。
4)外設(shè)的虛擬化設(shè)計(jì),不僅能夠緩解目前航天型號領(lǐng)域嵌入式軟件測試過程中實(shí)物運(yùn)行環(huán)境使用時(shí)間沖突的問題,而且對提高嵌入式軟件的測試效率和測試充分性也有幫助。