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