文獻標識碼: A
文章編號: 0258-7998(2015)02-0031-04
0 引言
當今嵌入式系統(tǒng)的功能日趨多元化,,系統(tǒng)間通過總線,、背板以及網(wǎng)絡通信的互聯(lián)日趨復雜,這導致嵌入式系統(tǒng)的調(diào)試,、集成和測試變得相對困難,。嵌入式軟件開發(fā)者經(jīng)常因為缺乏硬件開發(fā)板等物理設備,導致開發(fā)效率低下,。譬如在獲取硬件開發(fā)板實物之前,,系統(tǒng)開發(fā)者很難提前開發(fā)基于硬件開發(fā)板的軟件程序;當硬件開發(fā)板數(shù)量有限時,,并不能保證每個系統(tǒng)開發(fā)者都能拿到硬件開發(fā)板進行相關軟件的設計與開發(fā),。
Simics作為一款快速的、功能精確的全系統(tǒng)仿真環(huán)境[1],,較好地解決了上述問題,。Simics為多種任務提供了一個共用框架來實現(xiàn)處理器設計、存儲器分級體系設計,、元器件開發(fā)和測試,、軟件質(zhì)量的自動化測試、SOC虛擬原型,、軟硬件協(xié)同仿真,,以及固件、驅(qū)動程序和操作系統(tǒng)的開發(fā)等功能,。首先,,Simics提供了一個功能強大的虛擬平臺,可以模擬處理器,、存儲器,、板級硬件和復雜網(wǎng)絡系統(tǒng)等任意規(guī)模的硬件目標設備,解決了軟件開發(fā)者因缺乏硬件設備引起的問題,。Simics允許開發(fā)者在硬件開發(fā)板實物到位之前,,就開始進行相應的軟件開發(fā),、系統(tǒng)集成以及系統(tǒng)測試,從而縮短產(chǎn)品的上市時間,。針對于目標設備的板級支持包(Board Support Package,,BSP)、固件,、實時操作系統(tǒng),、中間件和應用程序等目標軟件不需要進行任何更改,即可運行在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)。
美國風河系統(tǒng)公司推出的VxWorks嵌入式操作系統(tǒng)具備實時性好,、可靠性高,、可定制性強等特點。VxWorks嵌入式操作系統(tǒng)在實時嵌入式系統(tǒng)領域一直占據(jù)一席之地,,尤其是在國防,、航空、工業(yè)控制等領域具有統(tǒng)治地位,。
本文以VxWorks 6.9嵌入式操作系統(tǒng)為例,,論述了在風河Simics全系統(tǒng)仿真環(huán)境下進行嵌入式操作系統(tǒng)的bootrom開發(fā)、操作系統(tǒng)的定制,、設備驅(qū)動和應用程序的開發(fā)方法,,探究出了利用Simics全系統(tǒng)仿真環(huán)境協(xié)助開發(fā)者進行嵌入式操作系統(tǒng)底層軟件、中間層軟件和上層應用軟件開發(fā)的新方法,。
1 Simics全系統(tǒng)仿真環(huán)境架構
借助于Simics全系統(tǒng)仿真環(huán)境,,開發(fā)者不僅可以進行硬件建模,還可以模擬真實硬件環(huán)境中運行的所有軟件,。Simics全系統(tǒng)仿真環(huán)境架構圖如圖1所示,。Simics主要由虛擬硬件和目標軟件棧兩部分組成。虛擬硬件與真實的硬件設備相對應,,開發(fā)者可以使用模型庫,,利用C/C++,、SystemC、Python或DML等語言進行處理器,、內(nèi)存,、存儲設備等虛擬設備模型的開發(fā)和配置。目標軟件棧自底向上分為Hypervisor層,、驅(qū)動層,、BSP層、固件層和實時操作系統(tǒng)(Real Time Operating System,,RTOS)層、應用軟件和中間件層,。其中Hypervisor,、驅(qū)動、BSP,、固件和RTOS作為中間層負責上層軟件與虛擬硬件的交互,。此外,Eclipse,、風河Workbench,、Tornado等常用的開發(fā)調(diào)試工具均可配合Simics進行協(xié)同開發(fā)[3]。Simics支持運行各種目標軟件,,只要是能在實際硬件設備上運行的目標軟件,,均可在相應的Simics全系統(tǒng)仿真環(huán)境下運行且無絲毫差異[4]。
與VMware,、VirtualBox等常用的虛擬機相比,,Simics能夠支持包括Power PC、Intel x86,、MIPS,、ARM、M68K,、SPARC在內(nèi)的更多類型的處理器架構[5],。與EDA仿真工具相比,Simics能夠更加高效準確地運行目標軟件,,并提供強大的調(diào)試功能,。雖然EDA仿真工具能夠非常準確地仿真硬件設備,但速度往往不夠快,,或者不能完整地運行的整個目標軟件,。Simics能夠較好地克服EDA仿真工具的上述缺陷。
2 開發(fā)VxWorks操作系統(tǒng)的bootrom
Simics可以運行風河公司官方提供的硬件目標設備模型以及開發(fā)者自定義的硬件目標設備模型,。本文選用了風河官方提供的Model Library Intel Core i7 with X58 and ICH10 4.6(下文簡稱x86-X58-ICH10)硬件目標設備模型,。該硬件目標設備模型可以仿真一個具有Intel Core i7處理器,、X58北橋高速芯片組以及ICH10南橋的硬件系統(tǒng)。
在Simics x86-X58-ICH10硬件模型上啟動VxWorks下載型映像,,需要開發(fā)相應的VxWorks啟動引導程序bootrom,。首先,使用風河Workbench 3.3集成開發(fā)環(huán)境創(chuàng)建VxWorks Boot Loader Project類型的工程,。輸入工程名字,,指定工程保存的位置,設置工程基于的BSP為Intel Nehalem BSP,,設置工具鏈為gnu,,設置bootrom格式為二進制bin格式,設置映像壓縮類型為壓縮型,。然后,,配置源代碼索引,完成工程的創(chuàng)建,。
如需修改VxWorks映像啟動時的默認IP地址,,則需修改Intel Nehalem BSP目錄下的config.h頭文件。將VxWorks映像啟動時的IP地址設置為“172.21.28.64”的相應代碼如下所示:
#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處理器上,,因此設置工程所基于的BSP為Intel Nehalem BSP,,設置工具鏈為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ù)需求添加相應的組件。以添加系統(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架構的驅(qū)動程序
自VxWorks 6.2引入了VxBus設備驅(qū)動架構,該驅(qū)動架構提供了針對操作系統(tǒng)和硬件設備的標準接口,。VxBus架構的最核心功能是VxBus驅(qū)動程序能夠在風河Workbench開發(fā)環(huán)境中以組件的形式進行配置,。開發(fā)者可以根據(jù)需求添加或刪除驅(qū)動組件,重新編譯VxWorks內(nèi)核映像即可完成驅(qū)動的配置,。在引入VxBus驅(qū)動架構之前,,開發(fā)者若要添加或者刪除VxWorks驅(qū)動,則需要修改繁瑣的底層文件和代碼,。譬如,,配置VxWorks5.5驅(qū)動程序時,開發(fā)者需要修改BSP中的sysLib.c等文件,。此外,,非VxBus架構的驅(qū)動程序的可移植性差,更換BSP時需要重新移植驅(qū)動程序,。
開發(fā)基于VxBus的驅(qū)動,,并將其集成到風河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ū)動源文件負責實現(xiàn)驅(qū)動的邏輯功能,從而實現(xiàn)對硬件設備的控制與操作,。一個驅(qū)動可以包含一個或者多個驅(qū)動源文件以及可選的頭文件,。
組件描述文件提供了將驅(qū)動以組件的形式集成到風河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ū)動的版本列表,、文件列表以及所支持的設備等信息。在撰寫README文件時,,可以參考風河官方提供的驅(qū)動的README文件,。
Makefile文件定義了編譯驅(qū)動的源文件的規(guī)則,并通過OBJ_COMMON宏指定了編譯出的目標文件列表,。
5 Simics上啟動VxWorks操作系統(tǒng)
在x86-X58-ICH10硬件模型上啟動VxWorks操作系統(tǒng),,首先要編寫Session腳本文件。Simics在加載bootrom之前需要BIOS的引導,。BIOS執(zhí)行完畢后,,跳轉到bootrom繼續(xù)執(zhí)行。具體的實現(xiàn)方法是:將bootrom加載到RAM中,,然后將BIOS的INT 19控制句柄切換到bootrom所在的RAM處,。代碼如下:
#itl_nehalem架構的bootrom入口點
$ram_boot_entry = 0x8000
#bootrom.bin文件的完整路徑
$bootrombin="d:/bootrom.bin"
#VxWorks內(nèi)核的完整路徑
$kernel="d:/vxWorks"
#創(chuàng)建具有磁盤和串口控制臺的x86-X58-ICH10虛擬機
#設置磁盤大小為512 KiB,涵蓋了引導扇區(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
#設置系統(tǒng)信息,,設置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設置一個假想的啟動磁盤
#MBR直接跳轉到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
#引導扇區(qū)(Boot Sector)設置為0x55AA,,分區(qū)結束標志
$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跳轉至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的硬件配置。首先,設置了硬盤大小為20 GB,,設置時鐘時間為當前本地時間,。其次,設置CPU執(zhí)行一條指令所需的平均時鐘周期數(shù)為1,,CPU類型為core-i7,,CPU內(nèi)核數(shù)目為1,主頻為2 GHz,。再次,,設置主機名為viper,指定BIOS文件為seabios-simics-x58-ich10-1.6.3-20121004.bin,,指定串口0作為文本控制臺,,設置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)的名字以及硬件模型的相關信息。VxWorks在x86-X58-ICH10硬件模型上啟動成功,,如圖2所示,。
在VxWorks的啟動過程中,,開發(fā)者可以在任意時刻暫停啟動過程,,查看啟動輸出信息和相關的寄存器狀態(tài)。開發(fā)者還可以使用Simics特有的檢查點功能,,將當前目標硬件平臺以及所有軟件的運行狀態(tài)完整地保存在檢查點文件中,。該類型的文件可以在任意安裝了相關Simics硬件安裝包的環(huán)境下完全恢復現(xiàn)場。檢查點調(diào)試主要有兩大優(yōu)勢,。第一,,Simics可以通過重載檢查點文件,恢復檢查點位置的軟硬件狀態(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文件提供了硬件模型的配置信息,。鏡像文件保存了當前軟硬件的運行狀態(tài)。檢查點創(chuàng)建完成后,,用戶可以將my-configuration檢查點文件共享給其他用戶,。其他用戶在Simics命令行窗口上執(zhí)行read-configuration "my-configuration"命令即可重載檢查點,恢復軟硬件狀態(tài),,然后分析故障并進行調(diào)試,。
6 開發(fā)具有圖形界面的VxWorks應用程序
開發(fā)具有圖形界面的VxWorks應用程序需要用到風河媒體庫。風河媒體庫以源代碼的方式提供了基本的圖形,、音頻和視頻開發(fā)技術以及開發(fā)框架,。開發(fā)者需要自行編譯風河媒體庫文件,調(diào)用相應的API庫函數(shù)進行多媒體應用程序的開發(fā),。
風河媒體庫主要由軟件開發(fā)工具包(Software Development Kit,,SDK)和驅(qū)動開發(fā)工具包(Driver Development Kit,DDK)組成,。SDK提供了豐富的API集,,涵蓋圖形、輸入處理,、多媒體,、字體、內(nèi)存管理和設備管理等操作,。開發(fā)者可以使用SDK開發(fā)獨立于硬件設備之外的,、具有較高可移植性的應用程序。DDK提供了完整的驅(qū)動程序參考集,,這些參考集包括常用的硬件配置和API集,,能夠幫助開發(fā)者快速開發(fā)驅(qū)動程序。
本文開發(fā)了具有圖形界面的VxWorks啟動型內(nèi)核模式應用程序,。VxWorks啟動型內(nèi)核模式應用程序代碼是VxWorks映像文件的一部分,,VxWorks系統(tǒng)啟動后不需要單獨下載,。當映像編譯和鏈接風河媒體庫時,應用程序代碼也會自動鏈接到風河媒體庫,。由于只有內(nèi)核和應用程序所需要的風河媒體庫才會被鏈接到內(nèi)核中,,VxWorks內(nèi)核的尺寸較小。該類型的應用程序優(yōu)點是VxWorks映像所需內(nèi)存空間較小和映像尺寸較小,,應用程序在VxWorks啟動后可以自動執(zhí)行,。
所開發(fā)的圖形應用程序能夠繪制不同顏色和不同粗細的實線和虛線、多邊形,、圓形和扇形等基本圖形,,如圖3所示。在調(diào)試圖形應用程序時,,可以使用Simics強大的正向和回溯執(zhí)行功能,,逐步顯示圖形的繪制過程。
7 總結
本文論述了在風河Simics全系統(tǒng)仿真環(huán)境下進行VxWorks 6.9嵌入式操作系統(tǒng)的bootrom開發(fā),、VxWorks操作系統(tǒng)的定制,、設備驅(qū)動和應用程序的開發(fā)方法,探究出了利用Simics全系統(tǒng)仿真環(huán)境協(xié)助開發(fā)者進行嵌入式操作系統(tǒ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.