- 相關(guān)推薦
實時嵌入式軟件測試工具的研究
摘要:應用仿真的方法對實時嵌入式軟件進行脫離硬件環(huán)境的測試,構(gòu)造適用于仿真環(huán)境的被測軟件運行環(huán)境,提出了適用于不同運行環(huán)境的測試模型。
關(guān)鍵詞:軟件測試 仿真 軟件測試平臺
A Research on Real-Time Embedded Software Testing Tools
ABSTRACT This thesis has a test for the Real-Time Embedded Software under the environment without the real hardware with simulation. Construct an environment suitable for the simulation of software running, and put forward some testing models suitable for varied environment.
引言
在國內(nèi),目前大型的軟件工程中大都使用國外的軟件測試平臺,我們在測試工程中使用法國的LOGISCOPE測試平臺對C語言開發(fā)的實時嵌入式軟件進行測試。
由于實時嵌入式軟件主要是對外部接口設備進行控制,而被送檢的軟件需要大量不同的硬件環(huán)境,在進行測試時,由于無法建立大量不同的接口設備的硬件仿真環(huán)境,每當執(zhí)行輸入輸出指令時,程序便無法繼續(xù)運行,因此,測試軟件無法完整地覆蓋整個程序的各個分支和語句。同時,被測試軟件常常需要多個模塊同時對某個外設進行共同測試,需要通過網(wǎng)絡環(huán)境進行集中測試。
為了完成對各種實時嵌入式軟件的測試工作,我們研制開發(fā)了基于網(wǎng)絡的接口設備的軟件仿真環(huán)境,使得用戶程序運行時不再需要真正的接口硬件設備,而是與仿真軟件進行通訊,交換數(shù)據(jù),從而使得被測程序在脫離硬件的環(huán)境中順利運行。本課題主要解決C語言和匯編語言混合編程中,把所有原來控制外設的輸入輸出指令都修改成與仿真軟件進行通信的函數(shù),同時,把原來由硬件觸發(fā)的中斷處理功能轉(zhuǎn)由軟件觸發(fā),以及通過網(wǎng)絡環(huán)境完成多模塊的集中測試。
本課題的意義在于建成一種通用的方法,使得不同軟件開發(fā)的程序都能夠使用這些功能模塊與接口仿真軟件進行通信,從而順利地進行軟件測試。
被測軟件的運行環(huán)境絕大多數(shù)是基于DOS的,在仿真環(huán)境下進行測試時,由于原來的硬件環(huán)境不再存在,因此要求對被測軟件進行相應的修改,使其在一個新的系統(tǒng)模型當中運行:原來與硬件進行I/O的指令,變成對仿真軟件通訊動態(tài)鏈接庫中函數(shù)的調(diào)用;由硬件觸發(fā)的中斷信號變成來自仿真軟件的消息;更重要的是,原來由CPU負責調(diào)度的中斷服務函數(shù)必須由新的模型來負責(因為不再有硬件中斷信號),而由于DOS是一個單任務的操作系統(tǒng),系統(tǒng)模型需要解決以下的問題:系統(tǒng)如何在程序運行的時刻檢測到通過網(wǎng)絡發(fā)過來的“中斷信號”,如何中斷當前的程序,去執(zhí)行相應的中斷服務函數(shù),如何具有中斷嵌套的功能。
基于以上要求,系統(tǒng)模型采用以下兩種:
基于DOS的多任務調(diào)度系統(tǒng)模型
基于Windows多線程環(huán)境的系統(tǒng)模型
2.基于DOS環(huán)境的多任務調(diào)度模型
2.1實現(xiàn)原理
想要在DOS環(huán)境下實現(xiàn)多任務調(diào)度,必須使每個任務具有自己的堆棧。首先,棧用來實現(xiàn)任務切換,其次,它用來存貯任務的局部變量。
任務的切換是通過調(diào)用一個子程序來實現(xiàn)的,該子程序?qū)⒍褩V羔樣稍瓉碇赶蚶先蝿盏亩褩V脼橹赶蛐氯蝿盏亩褩。程序返回時,新的任務指令指針(IP)就從棧中彈出。新任務就開始自動開始執(zhí)行。
這個負責調(diào)度的子程序是通過時鐘中斷來定期觸發(fā)的。當產(chǎn)生時鐘中斷時,需要做兩件事情。首先,將標志(Flags)寄存器的內(nèi)容壓入棧中,其次,緊跟在指令指針(IP)之后,將CS(代碼段)也壓入棧中。最后,將中斷服務子程序的段地址裝入CS寄存器中,將偏址裝入IP寄存器中。這樣可以使ISR開始運行。中斷返回時,CS,IP和Flags寄存器的內(nèi)容自動彈出。為了實現(xiàn)任務的調(diào)度,新的時鐘中斷服務函數(shù)要完成兩項工作。首先,它將除了棧指針(SP)和棧段(SS)寄存器之外的所有寄存器的值都存到棧中。(SP和SS的值存在另外的位置)。其次,它改變SS和SP寄存器的值,使它們指向另一個任務的堆棧。因此,當ISR返回時,新的任務的堆棧被彈出到各寄存器中,這使得機器的狀態(tài)是針對新的任務的。由于IP中也是彈出的寄存器的值,因此新任務就開始執(zhí)行。
在任務運行前,它必須按一定方式使堆棧初始化,這樣使得當?shù)谝粋時間片到來時,從棧中彈出的值能夠使該任務從頭開始運行。因此,任務的堆棧必須初始化并存放正確的寄存器值,同時指令指針也必須指向程序中的第一條指令。
2.2調(diào)度內(nèi)核實現(xiàn)所用到的數(shù)據(jù)結(jié)構(gòu)
interrupt 類型
當說明一個函數(shù)為interrupt類型時,它告訴編譯器自動保存所有寄存器(sp和ss除外)的值,并且IRET指令終止該函數(shù)。每當進入到interrupt函數(shù)時,執(zhí)行下列指令:
push ax, push bx, push cx,
push dx, push es, push ds
push si, push di, push bp
發(fā)生中斷時,CPU自動將Flags,cs和IP寄存器壓棧。因此,在interrupt函數(shù)入口處,堆棧如圖2.2.1.2所示。我們將利用interrupt函數(shù)的棧的安排方式對要執(zhí)行的任務的堆棧進行初始化。
Bp<-top of stack
DI
SI
DS
ES
DX
CX
BX
AX
IP
CS
PLAGS
任務中使用的寄存器的數(shù)據(jù)結(jié)構(gòu)
typedef struct int_regs{
unsigned bp;
unsigned di;
unsigned si;
unsigned ds;
unsigned es;
unsigned dx;
unsigned cx;
unsigned bx;
unsigned ax;
unsigned ip;
unsigned cs;
unsigned flags;
};
此結(jié)構(gòu)嚴格按照interrupt函數(shù)入口處堆棧的結(jié)構(gòu)定義,初始化時,將結(jié)構(gòu)中的代碼段(CS),指令指針(IP)設置成構(gòu)成此任務的函數(shù)的段地址和偏移地址。
用于任務管理的數(shù)據(jù)結(jié)構(gòu)
struct task_struct{
unsigned sp;
unsigned ss;
unsigned char *stck;
unsigned LastTask;
unsigned IntNum;
unsigned Status;
}
當執(zhí)行任務切換時,sp和ss保存當前棧指針和堆棧段地址,而任務調(diào)度程序?qū)斍皸V羔槪╛SP)和棧地址(_SS)設置成下一個將要執(zhí)行的任務的棧指針和棧地址,當調(diào)度程序結(jié)束運行時,由于從棧中彈出的各個寄存器,包括代碼段和指令指針都是指向新任務的,因此,新任務將自動運行,從而達到任務切換的目的。
2.3應用多任務調(diào)度功能實現(xiàn)對中斷的仿真處理
由于被測試的用戶源程序是工作在仿真環(huán)境下,無法接收硬件產(chǎn)生的中斷信號從而自動執(zhí)行相應的中斷服務程序。因此,改編后的程序應該能夠定期檢查是否有從仿真軟件發(fā)過來的中斷信號,若有,則中斷當前程序的執(zhí)行,轉(zhuǎn)入相應的中斷服務函數(shù)執(zhí)行。
因為用戶的程序當中顯式地設置中斷向量,在改寫用戶的程序時,將每個中斷服務函數(shù)入口都置于一個向量數(shù)組當中,此數(shù)組即為全局中斷向量表,將任務號與相應的中斷號一一對應。
當時鐘中斷觸發(fā)任務調(diào)度程序時,調(diào)度程序首先檢測由仿真軟件發(fā)來的中斷信號,如果有,則調(diào)度程序在當前運行的任務的數(shù)據(jù)結(jié)構(gòu)中保存堆棧段段地址寄存器(_SS)、棧指針寄存器(_SP)、當前任務號,并將堆棧段段地址寄存器和棧指針寄存器設置成新的中斷服務程序所在的任務的相應的值,使得當調(diào)度程序返回時,能夠從新的任務開始運行。然后生成一個新的任務,在此任務當中調(diào)度對應于此中斷號的中斷服務程序這樣就可以實現(xiàn)中斷功能。
3.基于Windows多線程環(huán)境的系統(tǒng)模型
3.1實現(xiàn)原理
考慮部分由C語言編寫的實時嵌入式程序經(jīng)過適當?shù)男薷目梢杂蒝C編譯后,在Windows環(huán)境中運行。因此可以利用Windows的多線程特性構(gòu)造系統(tǒng)模型:把用戶的主函數(shù)放在系統(tǒng)初始化時生成的一個主線程當中運行,同時,系統(tǒng)主函數(shù)監(jiān)測由Socket端口發(fā)來的數(shù)據(jù),如果是一個中斷產(chǎn)生信號,系統(tǒng)主函數(shù)掛起當前正在執(zhí)行的線程,新生成一個新的線程,并在新線程中執(zhí)行相應的中斷服務函數(shù)。
3.2系統(tǒng)的結(jié)構(gòu)
由于CSocket類不能夠由各個線程之間共享,而各個線程內(nèi)部又要通過Socket端口接收和發(fā)送數(shù)據(jù),因此應建立高效而又防止各線程之間沖突的機制,下面是系統(tǒng)的結(jié)構(gòu)圖:
當線程需要通過Socket接口收發(fā)數(shù)據(jù)時,首先檢測/設置相應函數(shù)的信號量,若此資源不能使用,則線程被自動掛起。系統(tǒng)的主調(diào)函數(shù)負責輪詢來自Socket接口的數(shù)據(jù)以及各個信號量資源,當資源可用時,喚醒相應的線程,完成其請求的操作。如果接收到中斷產(chǎn)生信號,則生成新的線程,并掛起當前的線程,從而完成對中斷請求的響應。
4.結(jié)束語
本文介紹了針對實時嵌入式軟件的測試工具的研究與完善工作,根據(jù)不同的軟件特點,
構(gòu)造了兩種系統(tǒng)模型。通過實際的使用,都達到了比較滿意的結(jié)果。
這兩種系統(tǒng)模型經(jīng)過適當?shù)男薷,可以應用在其它語言編寫的軟件上,從而可以實現(xiàn)通用的模塊功能。
參考文獻
呂強 楊季文等 C語言的DOS系統(tǒng)程序設計 清華大學出版社
李沐孫 TURBO C 常駐內(nèi)存實用程序及窗口式軟件編程技術(shù) 北京科海
陳宗海 基于C/S體系的工業(yè)過程仿真模型調(diào)試環(huán)境。計算機應用。1999,4
張海藩 軟件工程導論。清華大學出版社,1995
朱利群 軟件測試模型及其實現(xiàn)。湖南師范大學自然科學學報1998 9
王 璞 基于覆蓋的軟件測試技術(shù)在實時嵌入式軟件中的應用研究。 計算機工程與設計 1998 12
VOL.19 No.6
洪 洋 軟件測試方法的應用研究。 光電對抗與無源干擾 1998 ,2
鄭人杰 計算機軟件測試技術(shù)清華大學出版社1990
【實時嵌入式軟件測試工具的研究】相關(guān)文章:
嵌入式軟件的覆蓋測試08-06
改善嵌入式Linux實時性能的方法研究08-19
嵌入式實時系統(tǒng)中斷管理技術(shù)研究08-06
嵌入式微內(nèi)核實時操作系統(tǒng)分析與測試08-06
嵌入式系統(tǒng)的實時性問題08-06
基于模塊化設計的嵌入式軟件測試方法08-06