關鍵詞:軟件測試 仿真 軟件測試平臺
A Research on Real-Time Embedded Software Testing Tools
ABSTRACT This thesis has a test for the Real-Time Embedded
Software under the environmentwithout the real hardwarewith
simulation. Construct an environment suitable for the simulation of
software running, and put forward some testing models suitable
for varied environment.
引言
在國內,目前大型的軟件工程中大都使用國外的軟件測試平臺,我們在測試工程中使用法國的LOGISCOPE測試平臺對C語言開發的實時嵌入式軟件進行測試。
由于實時嵌入式軟件主要是對外部接口設備進行控制,而被送檢的軟件需要大量不同的硬件環境,在進行測試時,由于無法建立大量不同的接口設備的硬件仿真環境,每當執行輸入輸出指令時,程序便無法繼續運行,因此,測試軟件無法完整地覆蓋整個程序的各個分支和語句。同時,被測試軟件常常需要多個模塊同時對某個外設進行共同測試,需要通過網絡環境進行集中測試。
為了完成對各種實時嵌入式軟件的測試工作,我們研制開發了基于網絡的接口設備的軟件仿真環境,使得用戶程序運行時不再需要真正的接口硬件設備,而是與仿真軟件進行通訊,交換數據,從而使得被測程序在脫離硬件的環境中順利運行。本課題主要解決C語言和匯編語言混合編程中,把所有原來控制外設的輸入輸出指令都修改成與仿真軟件進行通信的函數,同時,把原來由硬件觸發的中斷處理功能轉由軟件觸發,以及通過網絡環境完成多模塊的集中測試。
本課題的意義在于建成一種通用的方法,使得不同軟件開發的程序都能夠使用這些功能模塊與接口仿真軟件進行通信,從而順利地進行軟件測試。
被測軟件的運行環境絕大多數是基于DOS的,在仿真環境下進行測試時,由于原來的硬件環境不再存在,因此要求對被測軟件進行相應的修改,使其在一個新的系統模型當中運行:原來與硬件進行I/O的指令,變成對仿真軟件通訊動態鏈接庫中函數的調用;由硬件觸發的中斷信號變成來自仿真軟件的消息;更重要的是,原來由CPU負責調度的中斷服務函數必須由新的模型來負責(因為不再有硬件中斷信號),而由于DOS是一個單任務的操作系統,系統模型需要解決以下的問題:系統如何在程序運行的時刻檢測到通過網絡發過來的“中斷信號”,如何中斷當前的程序,去執行相應的中斷服務函數,如何具有中斷嵌套的功能。
基于以上要求,系統模型采用以下兩種:
基于DOS的多任務調度系統模型
基于Windows多線程環境的系統模型
2.基于DOS環境的多任務調度模型
2.1實現原理
想要在DOS環境下實現多任務調度,必須使每個任務具有自己的堆棧。首先,棧用來實現任務切換,其次,它用來存貯任務的局部變量。
任務的切換是通過調用一個子程序來實現的,該子程序將堆棧指針由原來指向老任務的堆棧置為指向新任務的堆棧。程序返回時,新的任務指令指針(IP)就從棧中彈出。新任務就開始自動開始執行。
這個負責調度的子程序是通過時鐘中斷來定期觸發的。當產生時鐘中斷時,需要做兩件事情。首先,將標志(Flags)寄存器的內容壓入棧中,其次,緊跟在指令指針(IP)之后,將CS(代碼段)也壓入棧中。最后,將中斷服務子程序的段地址裝入CS寄存器中,將偏址裝入IP寄存器中.這樣可以使ISR開始運行.中斷返回時,CS,IP和Flags寄存器的內容自動彈出。為了實現任務的調度,新的時鐘中斷服務函數要完成兩項工作。首先,它將除了棧指針(SP)和棧段(SS)寄存器之外的所有寄存器的值都存到棧中。(SP和SS的值存在另外的位置)。其次,它改變SS和SP寄存器的值,使它們指向另一個任務的堆棧。因此,當ISR返回時,新的任務的堆棧被彈出到各寄存器中,這使得機器的狀態是針對新的任務的。由于IP中也是彈出的寄存器的值,因此新任務就開始執行。
在任務運行前,它必須按一定方式使堆棧初始化,這樣使得當第一個時間片到來時,從棧中彈出的值能夠使該任務從頭開始運行。因此,任務的堆棧必須初始化并存放正確的寄存器值,同時指令指針也必須指向程序中的第一條指令。
2.2調度內核實現所用到的數據結構
interrupt 類型
當說明一個函數為interrupt類型時,它告訴編譯器自動保存所有寄存器(sp和ss除外)的值,并且IRET指令終止該函數。每當進入到interrupt函數時,執行下列指令:
push ax, push bx, push cx,
push dx, push es, push ds
push si, push di, push bp
發生中斷時,CPU自動將Flags,cs和IP寄存器壓棧。因此,在interrupt函數入口處,堆棧如圖2.2.1.2所示。我們將利用interrupt函數的棧的安排方式對要執行的任務的堆棧進行初始化。
Bp<-top of stack
DI
SI
DS
ES
DX
CX
BX
AX
IP
CS
PLAGS
延伸閱讀
文章來源于領測軟件測試網 http://www.kjueaiud.com/