文獻(xiàn)標(biāo)識碼: A
文章編號: 0258-7998(2015)02-0031-04
0 引言
當(dāng)今嵌入式系統(tǒng)的功能日趨多元化,,系統(tǒng)間通過總線、背板以及網(wǎng)絡(luò)通信的互聯(lián)日趨復(fù)雜,,這導(dǎo)致嵌入式系統(tǒng)的調(diào)試,、集成和測試變得相對困難。嵌入式軟件開發(fā)者經(jīng)常因?yàn)槿狈τ布_發(fā)板等物理設(shè)備,,導(dǎo)致開發(fā)效率低下,。譬如在獲取硬件開發(fā)板實(shí)物之前,系統(tǒng)開發(fā)者很難提前開發(fā)基于硬件開發(fā)板的軟件程序,;當(dāng)硬件開發(fā)板數(shù)量有限時,,并不能保證每個系統(tǒng)開發(fā)者都能拿到硬件開發(fā)板進(jìn)行相關(guān)軟件的設(shè)計(jì)與開發(fā)。
Simics作為一款快速的,、功能精確的全系統(tǒng)仿真環(huán)境[1],,較好地解決了上述問題。Simics為多種任務(wù)提供了一個共用框架來實(shí)現(xiàn)處理器設(shè)計(jì),、存儲器分級體系設(shè)計(jì),、元器件開發(fā)和測試、軟件質(zhì)量的自動化測試,、SOC虛擬原型,、軟硬件協(xié)同仿真,以及固件,、驅(qū)動程序和操作系統(tǒng)的開發(fā)等功能,。首先,Simics提供了一個功能強(qiáng)大的虛擬平臺,,可以模擬處理器,、存儲器、板級硬件和復(fù)雜網(wǎng)絡(luò)系統(tǒng)等任意規(guī)模的硬件目標(biāo)設(shè)備,,解決了軟件開發(fā)者因缺乏硬件設(shè)備引起的問題,。Simics允許開發(fā)者在硬件開發(fā)板實(shí)物到位之前,就開始進(jìn)行相應(yīng)的軟件開發(fā),、系統(tǒng)集成以及系統(tǒng)測試,,從而縮短產(chǎn)品的上市時間。針對于目標(biāo)設(shè)備的板級支持包(Board Support Package,,BSP),、固件、實(shí)時操作系統(tǒng),、中間件和應(yīng)用程序等目標(biāo)軟件不需要進(jìn)行任何更改,,即可運(yùn)行在Simics模擬的硬件平臺上[2]。其次,,Simics提供了故障注入,、虛擬系統(tǒng)時間的控制和硬件寄存器管理等功能,并且支持整個系統(tǒng)精確地,、并可恒現(xiàn)地正向和回溯執(zhí)行以及創(chuàng)建系統(tǒng)檢查點(diǎn)快照,。嵌入式軟件開發(fā)者可以借助Simics特有的開發(fā)及調(diào)試方式,降低調(diào)試難度,,提高開發(fā)效率,。譬如,同時啟動或暫停操作系統(tǒng)與處理器的時鐘,,檢查所有系統(tǒng)部件的狀態(tài),。
美國風(fēng)河系統(tǒng)公司推出的VxWorks嵌入式操作系統(tǒng)具備實(shí)時性好、可靠性高,、可定制性強(qiáng)等特點(diǎn),。VxWorks嵌入式操作系統(tǒng)在實(shí)時嵌入式系統(tǒng)領(lǐng)域一直占據(jù)一席之地,尤其是在國防,、航空,、工業(yè)控制等領(lǐng)域具有統(tǒng)治地位。
本文以VxWorks 6.9嵌入式操作系統(tǒng)為例,,論述了在風(fēng)河Simics全系統(tǒng)仿真環(huán)境下進(jìn)行嵌入式操作系統(tǒng)的bootrom開發(fā),、操作系統(tǒng)的定制、設(shè)備驅(qū)動和應(yīng)用程序的開發(fā)方法,,探究出了利用Simics全系統(tǒng)仿真環(huán)境協(xié)助開發(fā)者進(jìn)行嵌入式操作系統(tǒng)底層軟件,、中間層軟件和上層應(yīng)用軟件開發(fā)的新方法。
1 Simics全系統(tǒng)仿真環(huán)境架構(gòu)
借助于Simics全系統(tǒng)仿真環(huán)境,,開發(fā)者不僅可以進(jìn)行硬件建模,,還可以模擬真實(shí)硬件環(huán)境中運(yùn)行的所有軟件。Simics全系統(tǒng)仿真環(huán)境架構(gòu)圖如圖1所示,。Simics主要由虛擬硬件和目標(biāo)軟件棧兩部分組成,。虛擬硬件與真實(shí)的硬件設(shè)備相對應(yīng),開發(fā)者可以使用模型庫,利用C/C++,、SystemC,、Python或DML等語言進(jìn)行處理器、內(nèi)存,、存儲設(shè)備等虛擬設(shè)備模型的開發(fā)和配置,。目標(biāo)軟件棧自底向上分為Hypervisor層、驅(qū)動層,、BSP層,、固件層和實(shí)時操作系統(tǒng)(Real Time Operating System,RTOS)層,、應(yīng)用軟件和中間件層,。其中Hypervisor、驅(qū)動,、BSP,、固件和RTOS作為中間層負(fù)責(zé)上層軟件與虛擬硬件的交互。此外,,Eclipse,、風(fēng)河Workbench、Tornado等常用的開發(fā)調(diào)試工具均可配合Simics進(jìn)行協(xié)同開發(fā)[3],。Simics支持運(yùn)行各種目標(biāo)軟件,,只要是能在實(shí)際硬件設(shè)備上運(yùn)行的目標(biāo)軟件,均可在相應(yīng)的Simics全系統(tǒng)仿真環(huán)境下運(yùn)行且無絲毫差異[4],。
與VMware,、VirtualBox等常用的虛擬機(jī)相比,Simics能夠支持包括Power PC,、Intel x86,、MIPS、ARM,、M68K,、SPARC在內(nèi)的更多類型的處理器架構(gòu)[5]。與EDA仿真工具相比,,Simics能夠更加高效準(zhǔn)確地運(yùn)行目標(biāo)軟件,,并提供強(qiáng)大的調(diào)試功能。雖然EDA仿真工具能夠非常準(zhǔn)確地仿真硬件設(shè)備,,但速度往往不夠快,,或者不能完整地運(yùn)行的整個目標(biāo)軟件。Simics能夠較好地克服EDA仿真工具的上述缺陷,。
2 開發(fā)VxWorks操作系統(tǒng)的bootrom
Simics可以運(yùn)行風(fēng)河公司官方提供的硬件目標(biāo)設(shè)備模型以及開發(fā)者自定義的硬件目標(biāo)設(shè)備模型,。本文選用了風(fēng)河官方提供的Model Library Intel Core i7 with X58 and ICH10 4.6(下文簡稱x86-X58-ICH10)硬件目標(biāo)設(shè)備模型,。該硬件目標(biāo)設(shè)備模型可以仿真一個具有Intel Core i7處理器、X58北橋高速芯片組以及ICH10南橋的硬件系統(tǒng),。
在Simics x86-X58-ICH10硬件模型上啟動VxWorks下載型映像,,需要開發(fā)相應(yīng)的VxWorks啟動引導(dǎo)程序bootrom。首先,,使用風(fēng)河Workbench 3.3集成開發(fā)環(huán)境創(chuàng)建VxWorks Boot Loader Project類型的工程,。輸入工程名字,,指定工程保存的位置,,設(shè)置工程基于的BSP為Intel Nehalem BSP,設(shè)置工具鏈為gnu,,設(shè)置bootrom格式為二進(jìn)制bin格式,,設(shè)置映像壓縮類型為壓縮型。然后,,配置源代碼索引,,完成工程的創(chuàng)建。
如需修改VxWorks映像啟動時的默認(rèn)IP地址,,則需修改Intel Nehalem BSP目錄下的config.h頭文件,。將VxWorks映像啟動時的IP地址設(shè)置為“172.21.28.64”的相應(yīng)代碼如下所示:
#if !defined (CDF_OVERRIDE) && !defined (PRJ_BUILD)
#define DEFAULT_BOOT_LINE \
"gei(0,0)host:vxWorks h=172.21.28.110 e=172.21.28.64 u=
target"
#endif
修改完畢后,編譯該工程即可生成bootrom.bin映像,。
3 定制VxWorks嵌入式操作系統(tǒng)
首先,,創(chuàng)建VxWorks Image Project類型的工程。輸入工程名字,,指定VIP工程保存的位置,。由于所定制的VxWorks鏡像將要運(yùn)行在Intel Core i7處理器上,因此設(shè)置工程所基于的BSP為Intel Nehalem BSP,,設(shè)置工具鏈為gnu,。然后,配置SMP,、IPv6,、Debug和編譯器優(yōu)化選項(xiàng)等。最后,,配置源代碼索引,,完成VIP工程的創(chuàng)建。
完成創(chuàng)建VIP工程后,,可在工程資源管理器選項(xiàng)卡中查看該工程的文件列表信息,。其中Kernel Configuration是內(nèi)核配置工具,幫助開發(fā)者快速添加或移除內(nèi)核組件,。vxWorks.bin,、vxWorks.hex和vxWorks均是工程經(jīng)過編譯后生成的映像,。
上述步驟只是定制了具有基本功能的VxWorks映像。由于VxWorks具有很好的可裁剪性,,開發(fā)者可以根據(jù)需求添加相應(yīng)的組件,。以添加系統(tǒng)符號表組件INCLUDE_SYM_TBL_INIT及其依賴組件為例進(jìn)行說明。首先選中Kernel Configuration,,點(diǎn)擊右鍵,,單擊Edit Kernel Configuration,或者直接雙擊Kernel Configuration打開組件配置列表,。然后,,按下Ctrl+F,打開內(nèi)核組件查看器,,輸入INCLUDE_SYM_TBL_INIT,。在組件樹下會顯示找到的組件,點(diǎn)擊“Find”按鈕,,組件配置列表自動定位到找到的組件,。最后,選中該組件,,點(diǎn)擊右鍵,,選擇“Include”即可將該組件添加到內(nèi)核中。其他組件的添加方式與上述步驟類似,。組件添加完畢后,,重新編譯映像。
4 開發(fā)VxBus架構(gòu)的驅(qū)動程序
自VxWorks 6.2引入了VxBus設(shè)備驅(qū)動架構(gòu),,該驅(qū)動架構(gòu)提供了針對操作系統(tǒng)和硬件設(shè)備的標(biāo)準(zhǔn)接口,。VxBus架構(gòu)的最核心功能是VxBus驅(qū)動程序能夠在風(fēng)河Workbench開發(fā)環(huán)境中以組件的形式進(jìn)行配置。開發(fā)者可以根據(jù)需求添加或刪除驅(qū)動組件,,重新編譯VxWorks內(nèi)核映像即可完成驅(qū)動的配置,。在引入VxBus驅(qū)動架構(gòu)之前,開發(fā)者若要添加或者刪除VxWorks驅(qū)動,,則需要修改繁瑣的底層文件和代碼,。譬如,配置VxWorks5.5驅(qū)動程序時,,開發(fā)者需要修改BSP中的sysLib.c等文件,。此外,非VxBus架構(gòu)的驅(qū)動程序的可移植性差,,更換BSP時需要重新移植驅(qū)動程序,。
開發(fā)基于VxBus的驅(qū)動,并將其集成到風(fēng)河Workbench開發(fā)環(huán)境中,,一般至少需要如下6個文件,。其中組件描述文件,、driverName.dc和driverName.dr被稱為驅(qū)動配置文件。
(1)驅(qū)動源文件:實(shí)現(xiàn)驅(qū)動的邏輯,;
(2)組件描述文件:將驅(qū)動集成至Workbench開發(fā)環(huán)境中,;
(3)driverName.dc:提供了驅(qū)動注冊程序的原型;
(4)driverName.dr:提供了一段調(diào)用驅(qū)動注冊程序的代碼,;
(5)README:自述文件,;
(6)Makefile:編譯信息。
驅(qū)動源文件負(fù)責(zé)實(shí)現(xiàn)驅(qū)動的邏輯功能,,從而實(shí)現(xiàn)對硬件設(shè)備的控制與操作,。一個驅(qū)動可以包含一個或者多個驅(qū)動源文件以及可選的頭文件。
組件描述文件提供了將驅(qū)動以組件的形式集成到風(fēng)河Workbench開發(fā)環(huán)境中所需要的信息,。VxWorks配置工具通過組件描述文件能夠?qū)⒒赩xBus的驅(qū)動識別成獨(dú)立的組件,,并集成到開發(fā)環(huán)境中,。開發(fā)第三方驅(qū)動時,,需要將組件描述文件拷貝到installDir\vxworks-6.x\target\config\comps\vxWorks路徑下,以便VxWorks配置工具能夠讀取該文件,。
driverName.dc文件聲明了驅(qū)動注冊程序的原型,,其文件名要和驅(qū)動源文件保持一致。driverName.dr文件描述了調(diào)用驅(qū)動注冊程序的方法,。若新增驅(qū)動至VxWorks源碼樹,,則需在installDir\vxworks-6.x\target\config\comps\src\
hwif路徑下執(zhí)行如下指令,將新增驅(qū)動的配置文件合并到vxbUsrCmdLine.c文件中:
makevxbUsrCmdLine.c
README文件包含驅(qū)動的版本列表,、文件列表以及所支持的設(shè)備等信息,。在撰寫README文件時,可以參考風(fēng)河官方提供的驅(qū)動的README文件,。
Makefile文件定義了編譯驅(qū)動的源文件的規(guī)則,,并通過OBJ_COMMON宏指定了編譯出的目標(biāo)文件列表。
5 Simics上啟動VxWorks操作系統(tǒng)
在x86-X58-ICH10硬件模型上啟動VxWorks操作系統(tǒng),,首先要編寫Session腳本文件,。Simics在加載bootrom之前需要BIOS的引導(dǎo)。BIOS執(zhí)行完畢后,,跳轉(zhuǎn)到bootrom繼續(xù)執(zhí)行,。具體的實(shí)現(xiàn)方法是:將bootrom加載到RAM中,然后將BIOS的INT 19控制句柄切換到bootrom所在的RAM處,。代碼如下:
#itl_nehalem架構(gòu)的bootrom入口點(diǎn)
$ram_boot_entry = 0x8000
#bootrom.bin文件的完整路徑
$bootrombin="d:/bootrom.bin"
#VxWorks內(nèi)核的完整路徑
$kernel="d:/vxWorks"
#創(chuàng)建具有磁盤和串口控制臺的x86-X58-ICH10虛擬機(jī)
#設(shè)置磁盤大小為512 KiB,,涵蓋了引導(dǎo)扇區(qū)(Boot Sector)
$disk_size = 0x80000
#啟用串口控制臺
$uart0_text_console = TRUE
#初始化x86-X58-ICH10硬件配置
run-command-file"%simics%/targets/x86-x58-ich10/x86-x58-ich10-system.include"
#初始化組件
instantiate-components
#設(shè)置系統(tǒng)信息,設(shè)置VxWorks可使用的CPU數(shù)目
$system->system_info = "Viper - vxWorks 6.9 SMP"
$system.mb.cpu0.core[0][0]->cpuid_logical_processor_count=0x1
cpu-switch-time 0.0001
#為BIOS設(shè)置一個假想的啟動磁盤
#MBR直接跳轉(zhuǎn)到bootrom入口處
$disk.hd_image.set 0x0 0xea 1
$disk.hd_image.set 0x1 ($ram_boot_entry& 0xFF ) 1
$disk.hd_image.set 0x2 (($ram_boot_entry& 0xFF00)>>8) 1
$disk.hd_image.set 0x3 (($ram_boot_entry& 0xFF0000)>>16) 1
$disk.hd_image.set 0x4 (($ram_boot_entry& 0xFF000000)>>24) 1
#引導(dǎo)扇區(qū)(Boot Sector)設(shè)置為0x55AA,,分區(qū)結(jié)束標(biāo)志
$disk.hd_image.set 0x1fe 0x55 1
$disk.hd_image.set 0x1ff 0xaa 1
#開始啟動VxWorks映像
script-branch{
local $bpID = (break $ram_boot_entry)
local $con = $system.serconsole.con
#等待BIOS跳轉(zhuǎn)至bootrom入口處
wait-for-breakpoint $bpID
delete $bpID
#加載bootrom
load-file $bootrombin $ram_boot_entry
$con.wait-then-write "auto-boot..." "*"
$entry = ( load-binary $kernel )
$con.wait-then-write -s "Boot]:"("g"+(hex $entry)+"\n")
}
上述代碼在x86-x58-ich10-system.include文件中初始化了x86-X58-ICH10的硬件配置,。首先,,設(shè)置了硬盤大小為20 GB,設(shè)置時鐘時間為當(dāng)前本地時間,。其次,,設(shè)置CPU執(zhí)行一條指令所需的平均時鐘周期數(shù)為1,CPU類型為core-i7,,CPU內(nèi)核數(shù)目為1,,主頻為2 GHz。再次,,設(shè)置主機(jī)名為viper,,指定BIOS文件為seabios-simics-x58-ich10-1.6.3-20121004.bin,指定串口0作為文本控制臺,,設(shè)置MAC地址為00:19:A0:E1:1C:9F,。最后,使用create-chassis-x58-ich10命令創(chuàng)建X58-ICH10主板,,并配置南橋和北橋,。
Session腳本編寫完畢后,即可啟動Simics,。點(diǎn)擊“New Session from Script”按鈕,,選中并載入編寫好的Session腳本。此時,,Simics控制板上顯示將要啟動的操作系統(tǒng)的名字以及硬件模型的相關(guān)信息,。VxWorks在x86-X58-ICH10硬件模型上啟動成功,如圖2所示,。
在VxWorks的啟動過程中,,開發(fā)者可以在任意時刻暫停啟動過程,查看啟動輸出信息和相關(guān)的寄存器狀態(tài),。開發(fā)者還可以使用Simics特有的檢查點(diǎn)功能,,將當(dāng)前目標(biāo)硬件平臺以及所有軟件的運(yùn)行狀態(tài)完整地保存在檢查點(diǎn)文件中。該類型的文件可以在任意安裝了相關(guān)Simics硬件安裝包的環(huán)境下完全恢復(fù)現(xiàn)場,。檢查點(diǎn)調(diào)試主要有兩大優(yōu)勢,。第一,Simics可以通過重載檢查點(diǎn)文件,,恢復(fù)檢查點(diǎn)位置的軟硬件狀態(tài),,迅速并精確地回到用戶想要的位置;第二,,檢查點(diǎn)文件可以在用戶之間進(jìn)行共享,,可以在世界任何地方重新載入,增強(qiáng)了開發(fā)團(tuán)隊(duì)協(xié)作能力,,大大提高了調(diào)試效率,。上述調(diào)試方法在傳統(tǒng)的開發(fā)過程中是極難實(shí)現(xiàn)的,。
譬如,在遇到某個故障錯誤時,,用戶可以暫停Simics并在命令行窗口中執(zhí)行write-configuration “my-configuration”命令,,創(chuàng)建一個名字為my-configuration的檢查點(diǎn),保存故障現(xiàn)場,。檢查點(diǎn)文件主要由info,、config和鏡像文件等三類文件組成。info文件提供了開發(fā)主機(jī)名,、主機(jī)上安裝的Simics產(chǎn)品列表等信息,。config文件提供了硬件模型的配置信息。鏡像文件保存了當(dāng)前軟硬件的運(yùn)行狀態(tài),。檢查點(diǎn)創(chuàng)建完成后,,用戶可以將my-configuration檢查點(diǎn)文件共享給其他用戶。其他用戶在Simics命令行窗口上執(zhí)行read-configuration "my-configuration"命令即可重載檢查點(diǎn),,恢復(fù)軟硬件狀態(tài),,然后分析故障并進(jìn)行調(diào)試。
6 開發(fā)具有圖形界面的VxWorks應(yīng)用程序
開發(fā)具有圖形界面的VxWorks應(yīng)用程序需要用到風(fēng)河媒體庫,。風(fēng)河媒體庫以源代碼的方式提供了基本的圖形,、音頻和視頻開發(fā)技術(shù)以及開發(fā)框架。開發(fā)者需要自行編譯風(fēng)河媒體庫文件,,調(diào)用相應(yīng)的API庫函數(shù)進(jìn)行多媒體應(yīng)用程序的開發(fā)。
風(fēng)河媒體庫主要由軟件開發(fā)工具包(Software Development Kit,,SDK)和驅(qū)動開發(fā)工具包(Driver Development Kit,,DDK)組成。SDK提供了豐富的API集,,涵蓋圖形,、輸入處理、多媒體,、字體,、內(nèi)存管理和設(shè)備管理等操作。開發(fā)者可以使用SDK開發(fā)獨(dú)立于硬件設(shè)備之外的,、具有較高可移植性的應(yīng)用程序,。DDK提供了完整的驅(qū)動程序參考集,這些參考集包括常用的硬件配置和API集,,能夠幫助開發(fā)者快速開發(fā)驅(qū)動程序,。
本文開發(fā)了具有圖形界面的VxWorks啟動型內(nèi)核模式應(yīng)用程序。VxWorks啟動型內(nèi)核模式應(yīng)用程序代碼是VxWorks映像文件的一部分,,VxWorks系統(tǒng)啟動后不需要單獨(dú)下載,。當(dāng)映像編譯和鏈接風(fēng)河媒體庫時,,應(yīng)用程序代碼也會自動鏈接到風(fēng)河媒體庫。由于只有內(nèi)核和應(yīng)用程序所需要的風(fēng)河媒體庫才會被鏈接到內(nèi)核中,,VxWorks內(nèi)核的尺寸較小,。該類型的應(yīng)用程序優(yōu)點(diǎn)是VxWorks映像所需內(nèi)存空間較小和映像尺寸較小,應(yīng)用程序在VxWorks啟動后可以自動執(zhí)行,。
所開發(fā)的圖形應(yīng)用程序能夠繪制不同顏色和不同粗細(xì)的實(shí)線和虛線,、多邊形、圓形和扇形等基本圖形,,如圖3所示,。在調(diào)試圖形應(yīng)用程序時,可以使用Simics強(qiáng)大的正向和回溯執(zhí)行功能,,逐步顯示圖形的繪制過程,。
7 總結(jié)
本文論述了在風(fēng)河Simics全系統(tǒng)仿真環(huán)境下進(jìn)行VxWorks 6.9嵌入式操作系統(tǒng)的bootrom開發(fā)、VxWorks操作系統(tǒng)的定制,、設(shè)備驅(qū)動和應(yīng)用程序的開發(fā)方法,,探究出了利用Simics全系統(tǒng)仿真環(huán)境協(xié)助開發(fā)者進(jìn)行嵌入式操作系統(tǒng)底層軟件、中間層軟件和上層應(yīng)用軟件開發(fā)的新方法,。
參考文獻(xiàn)
[1] Wind River.Wind River Simics getting started 4.4[Z].2012.
[2] Wind River.WindPO_Simics_0411_cn[Z].2011.
[3] Wind River.Wind River Simics Eclipse user′s guide[Z].2014:5-13.
[4] Wind River.Wind River推出功能更強(qiáng)大的全系統(tǒng)仿真工具Simics 4.6[Z].2011.
[5] Wind River. Wind River Simics[Z].2012.