文獻(xiàn)標(biāo)識(shí)碼: A
文章編號(hào): 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)試、集成和測(cè)試變得相對(duì)困難。嵌入式軟件開發(fā)者經(jīng)常因?yàn)槿狈τ布_發(fā)板等物理設(shè)備,導(dǎo)致開發(fā)效率低下。譬如在獲取硬件開發(fā)板實(shí)物之前,系統(tǒng)開發(fā)者很難提前開發(fā)基于硬件開發(fā)板的軟件程序;當(dāng)硬件開發(fā)板數(shù)量有限時(shí),并不能保證每個(gè)系統(tǒng)開發(fā)者都能拿到硬件開發(fā)板進(jìn)行相關(guān)軟件的設(shè)計(jì)與開發(fā)。
Simics作為一款快速的、功能精確的全系統(tǒng)仿真環(huán)境[1],較好地解決了上述問題。Simics為多種任務(wù)提供了一個(gè)共用框架來(lái)實(shí)現(xiàn)處理器設(shè)計(jì)、存儲(chǔ)器分級(jí)體系設(shè)計(jì)、元器件開發(fā)和測(cè)試、軟件質(zhì)量的自動(dòng)化測(cè)試、SOC虛擬原型、軟硬件協(xié)同仿真,以及固件、驅(qū)動(dòng)程序和操作系統(tǒng)的開發(fā)等功能。首先,Simics提供了一個(gè)功能強(qiáng)大的虛擬平臺(tái),可以模擬處理器、存儲(chǔ)器、板級(jí)硬件和復(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)測(cè)試,從而縮短產(chǎn)品的上市時(shí)間。針對(duì)于目標(biāo)設(shè)備的板級(jí)支持包(Board Support Package,BSP)、固件、實(shí)時(shí)操作系統(tǒng)、中間件和應(yīng)用程序等目標(biāo)軟件不需要進(jìn)行任何更改,即可運(yùn)行在Simics模擬的硬件平臺(tái)上[2]。其次,Simics提供了故障注入、虛擬系統(tǒng)時(shí)間的控制和硬件寄存器管理等功能,并且支持整個(gè)系統(tǒng)精確地、并可恒現(xiàn)地正向和回溯執(zhí)行以及創(chuàng)建系統(tǒng)檢查點(diǎn)快照。嵌入式軟件開發(fā)者可以借助Simics特有的開發(fā)及調(diào)試方式,降低調(diào)試難度,提高開發(fā)效率。譬如,同時(shí)啟動(dòng)或暫停操作系統(tǒng)與處理器的時(shí)鐘,檢查所有系統(tǒng)部件的狀態(tài)。
美國(guó)風(fēng)河系統(tǒng)公司推出的VxWorks嵌入式操作系統(tǒng)具備實(shí)時(shí)性好、可靠性高、可定制性強(qiáng)等特點(diǎn)。VxWorks嵌入式操作系統(tǒng)在實(shí)時(shí)嵌入式系統(tǒng)領(lǐng)域一直占據(jù)一席之地,尤其是在國(guó)防、航空、工業(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ū)動(dòng)和應(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è)備相對(duì)應(yīng),開發(fā)者可以使用模型庫(kù),利用C/C++、SystemC、Python或DML等語(yǔ)言進(jìn)行處理器、內(nèi)存、存儲(chǔ)設(shè)備等虛擬設(shè)備模型的開發(fā)和配置。目標(biāo)軟件棧自底向上分為Hypervisor層、驅(qū)動(dòng)層、BSP層、固件層和實(shí)時(shí)操作系統(tǒng)(Real Time Operating System,RTOS)層、應(yīng)用軟件和中間件層。其中Hypervisor、驅(qū)動(dòng)、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)行且無(wú)絲毫差異[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)行的整個(gè)目標(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(下文簡(jiǎn)稱x86-X58-ICH10)硬件目標(biāo)設(shè)備模型。該硬件目標(biāo)設(shè)備模型可以仿真一個(gè)具有Intel Core i7處理器、X58北橋高速芯片組以及ICH10南橋的硬件系統(tǒng)。
在Simics x86-X58-ICH10硬件模型上啟動(dòng)VxWorks下載型映像,需要開發(fā)相應(yīng)的VxWorks啟動(dòng)引導(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映像啟動(dòng)時(shí)的默認(rèn)IP地址,則需修改Intel Nehalem BSP目錄下的config.h頭文件。將VxWorks映像啟動(dòng)時(shí)的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)符號(hào)表組件INCLUDE_SYM_TBL_INIT及其依賴組件為例進(jìn)行說明。首先選中Kernel Configuration,點(diǎn)擊右鍵,單擊Edit Kernel Configuration,或者直接雙擊Kernel Configuration打開組件配置列表。然后,按下Ctrl+F,打開內(nèi)核組件查看器,輸入INCLUDE_SYM_TBL_INIT。在組件樹下會(huì)顯示找到的組件,點(diǎn)擊“Find”按鈕,組件配置列表自動(dòng)定位到找到的組件。最后,選中該組件,點(diǎn)擊右鍵,選擇“Include”即可將該組件添加到內(nèi)核中。其他組件的添加方式與上述步驟類似。組件添加完畢后,重新編譯映像。
4 開發(fā)VxBus架構(gòu)的驅(qū)動(dòng)程序
自VxWorks 6.2引入了VxBus設(shè)備驅(qū)動(dòng)架構(gòu),該驅(qū)動(dòng)架構(gòu)提供了針對(duì)操作系統(tǒng)和硬件設(shè)備的標(biāo)準(zhǔn)接口。VxBus架構(gòu)的最核心功能是VxBus驅(qū)動(dòng)程序能夠在風(fēng)河Workbench開發(fā)環(huán)境中以組件的形式進(jìn)行配置。開發(fā)者可以根據(jù)需求添加或刪除驅(qū)動(dòng)組件,重新編譯VxWorks內(nèi)核映像即可完成驅(qū)動(dòng)的配置。在引入VxBus驅(qū)動(dòng)架構(gòu)之前,開發(fā)者若要添加或者刪除VxWorks驅(qū)動(dòng),則需要修改繁瑣的底層文件和代碼。譬如,配置VxWorks5.5驅(qū)動(dòng)程序時(shí),開發(fā)者需要修改BSP中的sysLib.c等文件。此外,非VxBus架構(gòu)的驅(qū)動(dòng)程序的可移植性差,更換BSP時(shí)需要重新移植驅(qū)動(dòng)程序。
開發(fā)基于VxBus的驅(qū)動(dòng),并將其集成到風(fēng)河Workbench開發(fā)環(huán)境中,一般至少需要如下6個(gè)文件。其中組件描述文件、driverName.dc和driverName.dr被稱為驅(qū)動(dòng)配置文件。
(1)驅(qū)動(dòng)源文件:實(shí)現(xiàn)驅(qū)動(dòng)的邏輯;
(2)組件描述文件:將驅(qū)動(dòng)集成至Workbench開發(fā)環(huán)境中;
(3)driverName.dc:提供了驅(qū)動(dòng)注冊(cè)程序的原型;
(4)driverName.dr:提供了一段調(diào)用驅(qū)動(dòng)注冊(cè)程序的代碼;
(5)README:自述文件;
(6)Makefile:編譯信息。
驅(qū)動(dòng)源文件負(fù)責(zé)實(shí)現(xiàn)驅(qū)動(dòng)的邏輯功能,從而實(shí)現(xiàn)對(duì)硬件設(shè)備的控制與操作。一個(gè)驅(qū)動(dòng)可以包含一個(gè)或者多個(gè)驅(qū)動(dòng)源文件以及可選的頭文件。
組件描述文件提供了將驅(qū)動(dòng)以組件的形式集成到風(fēng)河Workbench開發(fā)環(huán)境中所需要的信息。VxWorks配置工具通過組件描述文件能夠?qū)⒒赩xBus的驅(qū)動(dòng)識(shí)別成獨(dú)立的組件,并集成到開發(fā)環(huán)境中。開發(fā)第三方驅(qū)動(dòng)時(shí),需要將組件描述文件拷貝到installDir\vxworks-6.x\target\config\comps\vxWorks路徑下,以便VxWorks配置工具能夠讀取該文件。
driverName.dc文件聲明了驅(qū)動(dòng)注冊(cè)程序的原型,其文件名要和驅(qū)動(dòng)源文件保持一致。driverName.dr文件描述了調(diào)用驅(qū)動(dòng)注冊(cè)程序的方法。若新增驅(qū)動(dòng)至VxWorks源碼樹,則需在installDir\vxworks-6.x\target\config\comps\src\
hwif路徑下執(zhí)行如下指令,將新增驅(qū)動(dòng)的配置文件合并到vxbUsrCmdLine.c文件中:
makevxbUsrCmdLine.c
README文件包含驅(qū)動(dòng)的版本列表、文件列表以及所支持的設(shè)備等信息。在撰寫README文件時(shí),可以參考風(fēng)河官方提供的驅(qū)動(dòng)的README文件。
Makefile文件定義了編譯驅(qū)動(dòng)的源文件的規(guī)則,并通過OBJ_COMMON宏指定了編譯出的目標(biāo)文件列表。
5 Simics上啟動(dòng)VxWorks操作系統(tǒng)
在x86-X58-ICH10硬件模型上啟動(dòng)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)建具有磁盤和串口控制臺(tái)的x86-X58-ICH10虛擬機(jī)
#設(shè)置磁盤大小為512 KiB,涵蓋了引導(dǎo)扇區(qū)(Boot Sector)
$disk_size = 0x80000
#啟用串口控制臺(tái)
$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è)置一個(gè)假想的啟動(dòng)磁盤
#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
#開始啟動(dòng)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è)置時(shí)鐘時(shí)間為當(dāng)前本地時(shí)間。其次,設(shè)置CPU執(zhí)行一條指令所需的平均時(shí)鐘周期數(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作為文本控制臺(tái),設(shè)置MAC地址為00:19:A0:E1:1C:9F。最后,使用create-chassis-x58-ich10命令創(chuàng)建X58-ICH10主板,并配置南橋和北橋。
Session腳本編寫完畢后,即可啟動(dòng)Simics。點(diǎn)擊“New Session from Script”按鈕,選中并載入編寫好的Session腳本。此時(shí),Simics控制板上顯示將要啟動(dòng)的操作系統(tǒng)的名字以及硬件模型的相關(guān)信息。VxWorks在x86-X58-ICH10硬件模型上啟動(dòng)成功,如圖2所示。
在VxWorks的啟動(dòng)過程中,開發(fā)者可以在任意時(shí)刻暫停啟動(dòng)過程,查看啟動(dòng)輸出信息和相關(guān)的寄存器狀態(tài)。開發(fā)者還可以使用Simics特有的檢查點(diǎn)功能,將當(dāng)前目標(biāo)硬件平臺(tái)以及所有軟件的運(yùn)行狀態(tài)完整地保存在檢查點(diǎn)文件中。該類型的文件可以在任意安裝了相關(guān)Simics硬件安裝包的環(huán)境下完全恢復(fù)現(xiàn)場(chǎng)。檢查點(diǎn)調(diào)試主要有兩大優(yōu)勢(shì)。第一,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)的。
譬如,在遇到某個(gè)故障錯(cuò)誤時(shí),用戶可以暫停Simics并在命令行窗口中執(zhí)行write-configuration “my-configuration”命令,創(chuàng)建一個(gè)名字為my-configuration的檢查點(diǎn),保存故障現(xiàn)場(chǎng)。檢查點(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)河媒體庫(kù)。風(fēng)河媒體庫(kù)以源代碼的方式提供了基本的圖形、音頻和視頻開發(fā)技術(shù)以及開發(fā)框架。開發(fā)者需要自行編譯風(fēng)河媒體庫(kù)文件,調(diào)用相應(yīng)的API庫(kù)函數(shù)進(jìn)行多媒體應(yīng)用程序的開發(fā)。
風(fēng)河媒體庫(kù)主要由軟件開發(fā)工具包(Software Development Kit,SDK)和驅(qū)動(dòng)開發(fā)工具包(Driver Development Kit,DDK)組成。SDK提供了豐富的API集,涵蓋圖形、輸入處理、多媒體、字體、內(nèi)存管理和設(shè)備管理等操作。開發(fā)者可以使用SDK開發(fā)獨(dú)立于硬件設(shè)備之外的、具有較高可移植性的應(yīng)用程序。DDK提供了完整的驅(qū)動(dòng)程序參考集,這些參考集包括常用的硬件配置和API集,能夠幫助開發(fā)者快速開發(fā)驅(qū)動(dòng)程序。
本文開發(fā)了具有圖形界面的VxWorks啟動(dòng)型內(nèi)核模式應(yīng)用程序。VxWorks啟動(dòng)型內(nèi)核模式應(yīng)用程序代碼是VxWorks映像文件的一部分,VxWorks系統(tǒng)啟動(dòng)后不需要單獨(dú)下載。當(dāng)映像編譯和鏈接風(fēng)河媒體庫(kù)時(shí),應(yīng)用程序代碼也會(huì)自動(dòng)鏈接到風(fēng)河媒體庫(kù)。由于只有內(nèi)核和應(yīng)用程序所需要的風(fēng)河媒體庫(kù)才會(huì)被鏈接到內(nèi)核中,VxWorks內(nèi)核的尺寸較小。該類型的應(yīng)用程序優(yōu)點(diǎn)是VxWorks映像所需內(nèi)存空間較小和映像尺寸較小,應(yīng)用程序在VxWorks啟動(dòng)后可以自動(dòng)執(zhí)行。
所開發(fā)的圖形應(yīng)用程序能夠繪制不同顏色和不同粗細(xì)的實(shí)線和虛線、多邊形、圓形和扇形等基本圖形,如圖3所示。在調(diào)試圖形應(yīng)用程序時(shí),可以使用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ū)動(dòng)和應(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.