文獻標(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)常因為缺乏硬件開發(fā)板等物理設(shè)備,導(dǎo)致開發(fā)效率低下。譬如在獲取硬件開發(fā)板實物之前,系統(tǒng)開發(fā)者很難提前開發(fā)基于硬件開發(fā)板的軟件程序;當(dāng)硬件開發(fā)板數(shù)量有限時,并不能保證每個系統(tǒng)開發(fā)者都能拿到硬件開發(fā)板進行相關(guān)軟件的設(shè)計與開發(fā)。
Simics作為一款快速的、功能精確的全系統(tǒng)仿真環(huán)境[1],較好地解決了上述問題。Simics為多種任務(wù)提供了一個共用框架來實現(xiàn)處理器設(shè)計、存儲器分級體系設(shè)計、元器件開發(fā)和測試、軟件質(zhì)量的自動化測試、SOC虛擬原型、軟硬件協(xié)同仿真,以及固件、驅(qū)動程序和操作系統(tǒng)的開發(fā)等功能。首先,Simics提供了一個功能強大的虛擬平臺,可以模擬處理器、存儲器、板級硬件和復(fù)雜網(wǎng)絡(luò)系統(tǒng)等任意規(guī)模的硬件目標(biāo)設(shè)備,解決了軟件開發(fā)者因缺乏硬件設(shè)備引起的問題。Simics允許開發(fā)者在硬件開發(fā)板實物到位之前,就開始進行相應(yīng)的軟件開發(fā)、系統(tǒng)集成以及系統(tǒng)測試,從而縮短產(chǎn)品的上市時間。針對于目標(biāo)設(shè)備的板級支持包(Board Support Package,BSP)、固件、實時操作系統(tǒng)、中間件和應(yīng)用程序等目標(biāo)軟件不需要進行任何更改,即可運行在Simics模擬的硬件平臺上[2]。其次,Simics提供了故障注入、虛擬系統(tǒng)時間的控制和硬件寄存器管理等功能,并且支持整個系統(tǒng)精確地、并可恒現(xiàn)地正向和回溯執(zhí)行以及創(chuàng)建系統(tǒng)檢查點快照。嵌入式軟件開發(fā)者可以借助Simics特有的開發(fā)及調(diào)試方式,降低調(diào)試難度,提高開發(fā)效率。譬如,同時啟動或暫停操作系統(tǒng)與處理器的時鐘,檢查所有系統(tǒng)部件的狀態(tài)。
美國風(fēng)河系統(tǒng)公司推出的VxWorks嵌入式操作系統(tǒng)具備實時性好、可靠性高、可定制性強等特點。VxWorks嵌入式操作系統(tǒng)在實時嵌入式系統(tǒng)領(lǐng)域一直占據(jù)一席之地,尤其是在國防、航空、工業(yè)控制等領(lǐng)域具有統(tǒng)治地位。
本文以VxWorks 6.9嵌入式操作系統(tǒng)為例,論述了在風(fēng)河Simics全系統(tǒng)仿真環(huán)境下進行嵌入式操作系統(tǒng)的bootrom開發(fā)、操作系統(tǒng)的定制、設(shè)備驅(qū)動和應(yīng)用程序的開發(fā)方法,探究出了利用Simics全系統(tǒng)仿真環(huán)境協(xié)助開發(fā)者進行嵌入式操作系統(tǒng)底層軟件、中間層軟件和上層應(yīng)用軟件開發(fā)的新方法。
1 Simics全系統(tǒng)仿真環(huán)境架構(gòu)
借助于Simics全系統(tǒng)仿真環(huán)境,開發(fā)者不僅可以進行硬件建模,還可以模擬真實硬件環(huán)境中運行的所有軟件。Simics全系統(tǒng)仿真環(huán)境架構(gòu)圖如圖1所示。Simics主要由虛擬硬件和目標(biāo)軟件棧兩部分組成。虛擬硬件與真實的硬件設(shè)備相對應(yīng),開發(fā)者可以使用模型庫,利用C/C++、SystemC、Python或DML等語言進行處理器、內(nèi)存、存儲設(shè)備等虛擬設(shè)備模型的開發(fā)和配置。目標(biāo)軟件棧自底向上分為Hypervisor層、驅(qū)動層、BSP層、固件層和實時操作系統(tǒng)(Real Time Operating System,RTOS)層、應(yīng)用軟件和中間件層。其中Hypervisor、驅(qū)動、BSP、固件和RTOS作為中間層負責(zé)上層軟件與虛擬硬件的交互。此外,Eclipse、風(fēng)河Workbench、Tornado等常用的開發(fā)調(diào)試工具均可配合Simics進行協(xié)同開發(fā)[3]。Simics支持運行各種目標(biāo)軟件,只要是能在實際硬件設(shè)備上運行的目標(biāo)軟件,均可在相應(yīng)的Simics全系統(tǒng)仿真環(huán)境下運行且無絲毫差異[4]。
與VMware、VirtualBox等常用的虛擬機相比,Simics能夠支持包括Power PC、Intel x86、MIPS、ARM、M68K、SPARC在內(nèi)的更多類型的處理器架構(gòu)[5]。與EDA仿真工具相比,Simics能夠更加高效準(zhǔn)確地運行目標(biāo)軟件,并提供強大的調(diào)試功能。雖然EDA仿真工具能夠非常準(zhǔn)確地仿真硬件設(shè)備,但速度往往不夠快,或者不能完整地運行的整個目標(biāo)軟件。Simics能夠較好地克服EDA仿真工具的上述缺陷。
2 開發(fā)VxWorks操作系統(tǒng)的bootrom
Simics可以運行風(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格式為二進制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鏡像將要運行在Intel Core i7處理器上,因此設(shè)置工程所基于的BSP為Intel Nehalem BSP,設(shè)置工具鏈為gnu。然后,配置SMP、IPv6、Debug和編譯器優(yōu)化選項等。最后,配置源代碼索引,完成VIP工程的創(chuàng)建。
完成創(chuàng)建VIP工程后,可在工程資源管理器選項卡中查看該工程的文件列表信息。其中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及其依賴組件為例進行說明。首先選中Kernel Configuration,點擊右鍵,單擊Edit Kernel Configuration,或者直接雙擊Kernel Configuration打開組件配置列表。然后,按下Ctrl+F,打開內(nèi)核組件查看器,輸入INCLUDE_SYM_TBL_INIT。在組件樹下會顯示找到的組件,點擊“Find”按鈕,組件配置列表自動定位到找到的組件。最后,選中該組件,點擊右鍵,選擇“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)境中以組件的形式進行配置。開發(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ū)動源文件:實現(xiàn)驅(qū)動的邏輯;
(2)組件描述文件:將驅(qū)動集成至Workbench開發(fā)環(huán)境中;
(3)driverName.dc:提供了驅(qū)動注冊程序的原型;
(4)driverName.dr:提供了一段調(diào)用驅(qū)動注冊程序的代碼;
(5)README:自述文件;
(6)Makefile:編譯信息。
驅(qū)動源文件負責(zé)實現(xiàn)驅(qū)動的邏輯功能,從而實現(xiàn)對硬件設(shè)備的控制與操作。一個驅(qū)動可以包含一個或者多個驅(qū)動源文件以及可選的頭文件。
組件描述文件提供了將驅(qū)動以組件的形式集成到風(fēng)河Workbench開發(fā)環(huán)境中所需要的信息。VxWorks配置工具通過組件描述文件能夠?qū)⒒赩xBus的驅(qū)動識別成獨立的組件,并集成到開發(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í)行。具體的實現(xiàn)方法是:將bootrom加載到RAM中,然后將BIOS的INT 19控制句柄切換到bootrom所在的RAM處。代碼如下:
#itl_nehalem架構(gòu)的bootrom入口點
$ram_boot_entry = 0x8000
#bootrom.bin文件的完整路徑
$bootrombin="d:/bootrom.bin"
#VxWorks內(nèi)核的完整路徑
$kernel="d:/vxWorks"
#創(chuàng)建具有磁盤和串口控制臺的x86-X58-ICH10虛擬機
#設(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è)置主機名為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。點擊“New Session from Script”按鈕,選中并載入編寫好的Session腳本。此時,Simics控制板上顯示將要啟動的操作系統(tǒng)的名字以及硬件模型的相關(guān)信息。VxWorks在x86-X58-ICH10硬件模型上啟動成功,如圖2所示。
在VxWorks的啟動過程中,開發(fā)者可以在任意時刻暫停啟動過程,查看啟動輸出信息和相關(guān)的寄存器狀態(tài)。開發(fā)者還可以使用Simics特有的檢查點功能,將當(dāng)前目標(biāo)硬件平臺以及所有軟件的運行狀態(tài)完整地保存在檢查點文件中。該類型的文件可以在任意安裝了相關(guān)Simics硬件安裝包的環(huán)境下完全恢復(fù)現(xiàn)場。檢查點調(diào)試主要有兩大優(yōu)勢。第一,Simics可以通過重載檢查點文件,恢復(fù)檢查點位置的軟硬件狀態(tài),迅速并精確地回到用戶想要的位置;第二,檢查點文件可以在用戶之間進行共享,可以在世界任何地方重新載入,增強了開發(fā)團隊協(xié)作能力,大大提高了調(diào)試效率。上述調(diào)試方法在傳統(tǒng)的開發(fā)過程中是極難實現(xiàn)的。
譬如,在遇到某個故障錯誤時,用戶可以暫停Simics并在命令行窗口中執(zhí)行write-configuration “my-configuration”命令,創(chuàng)建一個名字為my-configuration的檢查點,保存故障現(xiàn)場。檢查點文件主要由info、config和鏡像文件等三類文件組成。info文件提供了開發(fā)主機名、主機上安裝的Simics產(chǎn)品列表等信息。config文件提供了硬件模型的配置信息。鏡像文件保存了當(dāng)前軟硬件的運行狀態(tài)。檢查點創(chuàng)建完成后,用戶可以將my-configuration檢查點文件共享給其他用戶。其他用戶在Simics命令行窗口上執(zhí)行read-configuration "my-configuration"命令即可重載檢查點,恢復(fù)軟硬件狀態(tài),然后分析故障并進行調(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ù)進行多媒體應(yīng)用程序的開發(fā)。
風(fēng)河媒體庫主要由軟件開發(fā)工具包(Software Development Kit,SDK)和驅(qū)動開發(fā)工具包(Driver Development Kit,DDK)組成。SDK提供了豐富的API集,涵蓋圖形、輸入處理、多媒體、字體、內(nèi)存管理和設(shè)備管理等操作。開發(fā)者可以使用SDK開發(fā)獨立于硬件設(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āng)映像編譯和鏈接風(fēng)河媒體庫時,應(yīng)用程序代碼也會自動鏈接到風(fēng)河媒體庫。由于只有內(nèi)核和應(yīng)用程序所需要的風(fēng)河媒體庫才會被鏈接到內(nèi)核中,VxWorks內(nèi)核的尺寸較小。該類型的應(yīng)用程序優(yōu)點是VxWorks映像所需內(nèi)存空間較小和映像尺寸較小,應(yīng)用程序在VxWorks啟動后可以自動執(zhí)行。
所開發(fā)的圖形應(yīng)用程序能夠繪制不同顏色和不同粗細的實線和虛線、多邊形、圓形和扇形等基本圖形,如圖3所示。在調(diào)試圖形應(yīng)用程序時,可以使用Simics強大的正向和回溯執(zhí)行功能,逐步顯示圖形的繪制過程。
7 總結(jié)
本文論述了在風(fēng)河Simics全系統(tǒng)仿真環(huán)境下進行VxWorks 6.9嵌入式操作系統(tǒng)的bootrom開發(fā)、VxWorks操作系統(tǒng)的定制、設(shè)備驅(qū)動和應(yīng)用程序的開發(fā)方法,探究出了利用Simics全系統(tǒng)仿真環(huán)境協(xié)助開發(fā)者進行嵌入式操作系統(tǒng)底層軟件、中間層軟件和上層應(yīng)用軟件開發(fā)的新方法。
參考文獻
[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推出功能更強大的全系統(tǒng)仿真工具Simics 4.6[Z].2011.
[5] Wind River. Wind River Simics[Z].2012.