郭勇等
【摘 要】本文簡(jiǎn)單介紹了VxWorks實(shí)時(shí)操作系統(tǒng)和龍芯2F處理器,對(duì)基于龍芯2F平臺(tái)的VxWorks系統(tǒng)移植進(jìn)行了分析,并詳細(xì)介紹了移植內(nèi)容,包括文件的配置、中斷管理、PCI庫(kù)的實(shí)現(xiàn)和驅(qū)動(dòng)程序等方面詳細(xì)。
【關(guān)鍵詞】龍芯2F;VxWorks;BSP;系統(tǒng)移植
0 引言
VxWorks是美國(guó)WindRiver公司推出的一種嵌入式實(shí)時(shí)操作系統(tǒng),以其良好的可靠性和卓越的實(shí)時(shí)性被廣泛地應(yīng)用在通信、軍事、航空、航天等高精尖技術(shù)及實(shí)時(shí)性要求極高的領(lǐng)域中。
龍芯系列處理器是中國(guó)科學(xué)院計(jì)算所自主開(kāi)發(fā)的國(guó)產(chǎn)處理器系,龍芯2F微處理器是64位MIPS 指令集的通用RISC處理器,其最高工作頻率為1GHZ[1],具有高性能、低功耗等特點(diǎn)?,F(xiàn)有的龍芯平臺(tái)大都基于Linux操作系統(tǒng),但是在工業(yè)控制、高性能嵌入式等領(lǐng)域,對(duì)實(shí)時(shí)性、定制性的要求很高,因此VxWorks系統(tǒng)才是比較理想的選擇。
本文首先明確移植的基本思路,然后分別從中斷分級(jí)管理性維護(hù)、地址空間的訪問(wèn)擴(kuò)展、PCI設(shè)備的讀寫(xiě)機(jī)制和驅(qū)動(dòng)程序開(kāi)發(fā)與配置的建立等幾個(gè)方面來(lái)展開(kāi)相關(guān)的工作。
1 BVxWorks移植分析
1.1 VxWorks移植的主要內(nèi)容
VxWorks主要由三部分組成:BSP、微內(nèi)核及I/O系統(tǒng),BSP( Board Support Package)是板級(jí)支持包,是介于主板硬件和操作系統(tǒng)之間的一層,包括硬件初始化、中斷處理、時(shí)鐘管理、MMU等功能.在龍芯2F平臺(tái)上移植VxWorks,主要就是完成板級(jí)支持包BSP的開(kāi)發(fā).
1.2 VxWorks啟動(dòng)流程分析與移植思路
與X86的BIOS不同,龍芯2開(kāi)發(fā)板的BIOS采用了PMON,可以通過(guò)網(wǎng)絡(luò)或硬盤(pán)直接加載ELF格式的VxWorks映像文件到內(nèi)存中運(yùn)行。對(duì)可下載型的VxWorks映像文件,說(shuō)明如下[2]。
SysInit()為VxWorks映像的入口函數(shù),它由匯編語(yǔ)言編寫(xiě)。SysInit()通過(guò)對(duì)CPU內(nèi)部各種控制與狀態(tài)寄存器的設(shè)置來(lái)使得CPU具有確定的工作方式和穩(wěn)定的狀態(tài)等,然后跳到c語(yǔ)言函數(shù)usrInit()。
usrInit()函數(shù)主要進(jìn)行外圍硬件初始化,為下載VxWorks內(nèi)核映像做初始準(zhǔn)備,主要包括cache庫(kù)初始化、系統(tǒng)中斷向量初始化、目標(biāo)板硬件初始化等,最后調(diào)用kernelInit()。
kernelInit()為由風(fēng)河vxWorks庫(kù)文件封裝的,功能為提取kernel并運(yùn)行,使得后期的初始化能夠以kernel下運(yùn)行的任務(wù)來(lái)完成。該任務(wù)名為tRootTask,它執(zhí)行的方式類(lèi)似于usrRoot。
針對(duì)龍芯2F開(kāi)發(fā)板,usrInit()調(diào)用的cacheLibInit()、sysHwInit()、sysHwInit2()等函數(shù)是與硬一些主要的硬件初始化函數(shù)。一部分處理器由于有第三方支持的BSP,可以使用戶(hù)方便的使用。而對(duì)于龍芯2F,由于其為國(guó)產(chǎn)處理器,則通常需要自己建立龍芯2F 專(zhuān)用的BSP。
通常情況下BSP開(kāi)發(fā)的流程是,先實(shí)現(xiàn)一個(gè)最小化的VxWorks內(nèi)核,向其中添加定時(shí)器、串口設(shè)備、中斷控制器等基本驅(qū)動(dòng)程序,使得VxWorks系統(tǒng)基本可用,然后在此基礎(chǔ)上添加其他設(shè)備,最終滿(mǎn)足目標(biāo)需求.本文進(jìn)行龍芯2F平臺(tái)的BSP開(kāi)發(fā)也是基于該流程。
2 龍芯2F平臺(tái)的VxWorks移植
2.1 Config.h與MakeFile文件的配置
為了使Pmon能夠直接加載VxWorks,需要在BSP 包的MakeFile與Config.h件中修改VxWorks映像文件的入口地址,使其在Pmon支持的加載地址范圍內(nèi)。Config.h文件還涵蓋了龍芯2F的所有包含文件和定義,需要對(duì)其修改.修改Config.h文件如下:
#define ROM_BASE_ADRS 0xbfc00000
#define ROM_TEST_ADRS 0xbfc00000
#define ROM_SIZE 0x00100000
#define ROM_HIGH_ADRS 0x bfd00000
#define ROM_LOW_ADRS 0x 00100000
中,ROM_BASE_ADRS表示ROM的基地址,ROM_TEST_ADRS表示初始化啟動(dòng)代碼存放在ROM中的起始地址,ROM_SIZE表示ROM 的大小,若存儲(chǔ)空間大小為8Mbit,則應(yīng)該定義為為0x00100000.ROM_HIGH_ADRS表示復(fù)制BooTROM 到RAM 所使用的目標(biāo)地址,ROM_LOW_ADRS表示RAM中的VxWorks運(yùn)行的起始地址。
此外還要修改MakeFile文件,如CPU類(lèi)型號(hào),選擇編譯工具,附加編譯選項(xiàng)等。應(yīng)注意要保證MakeFile和ConFig.h中ROM和RAM宏定義中地址一致等。
2.2 中斷管理
龍芯處理器在它的Cause寄存器中有8個(gè)獨(dú)立的中斷位,分別對(duì)應(yīng)IP1-IP8,當(dāng)中斷發(fā)生觸發(fā)異常,異常處理函數(shù)讀取Cause寄存器的EXCODE域?yàn)?,判斷異常為中斷產(chǎn)生,然后讀取Cause寄存器IP位判斷中斷來(lái)自哪個(gè)引腳[3-4]。
VxWorks通過(guò)intPrioTable[]來(lái)管理MIPS的一級(jí)中斷,intPrioTable[]表項(xiàng)數(shù)據(jù)類(lèi)型為PRIO_TABLE,根椐本課題實(shí)際應(yīng)用,intPrioTable[]數(shù)組設(shè)計(jì)如下。
PRIO_TABLE intPrioTable[] =
{
{CAUSE_SW1, (ULONG) IV_SWTRAP0_VEC, 0x000100, 0},
{CAUSE_SW2, (ULONG) IV_SWTRAP1_VEC, 0x000200, 0},
{CAUSE_IP3, (ULONG) sysFeiInt, 0x000400, 1},
{CAUSE_IP4, (ULONG) sysSerialprint, 0x000800, 36},
{CAUSE_IP5, (ULONG) NULL, 0x001000, 0},
{CAUSE_IP6, (ULONG) NULL, 0x002000, 0},
{CAUSE_IP7, (ULONG) sysNetInt, 0x004000, 40},
{CAUSE_IP8, (ULONG) IV_TIMER_VEC, 0x008000, 0},
};
2.3 PCI庫(kù)的實(shí)現(xiàn)
在Vxworks的硬件初始化函數(shù)sysHwInit()中對(duì)PCI庫(kù)進(jìn)行初始化。對(duì)于龍芯2而言,PCI采用配置機(jī)制0,讀寫(xiě)函數(shù)具體由sysPciConfigRead()和sysPciConfigWrite()來(lái)實(shí)現(xiàn),通過(guò)PCI總線號(hào),PCI設(shè)備號(hào),PCI功能號(hào),按傳入的字節(jié)寬度,實(shí)現(xiàn)對(duì)PCI配置空間的寄存器地址進(jìn)行讀寫(xiě)操作。PCI庫(kù)初始化如下:
pci Config LibInit (PCI_MECHANISM_0, ULONG) sysPciConfigRead, ULONG)sysPciConfigWrite,NONE);sysPciConfigRead()和sysPciConfigWrite()基本實(shí)現(xiàn)見(jiàn)[4]。Vxworks中實(shí)現(xiàn)PCI資源(I/O端口地址、PCI Memory地址、中斷號(hào))的自動(dòng)分配可以通過(guò)sysPciAutoConfig ()接口來(lái)實(shí)現(xiàn)。
2.4 串口驅(qū)動(dòng)程序開(kāi)發(fā)
龍芯2F平臺(tái)的啟動(dòng)過(guò)程中,需要對(duì)串口設(shè)備初始化.普通多模式串行驅(qū)動(dòng)程序存放在target/src/drv/sio目錄下.此目錄中包括了很多常見(jiàn)的串口設(shè)備的驅(qū)動(dòng)源文件,如i8250SIO.c和nsl16550sio.c等等,同時(shí)還包含了templateSio.c模板文件.龍芯2F中的UART串口設(shè)備兼容NS 16550,因此可以直接使用nsl16550sio.c作為串口驅(qū)動(dòng).如果需要添加特殊串口設(shè)備時(shí),需要先在模版templateSio.c上創(chuàng)建驅(qū)動(dòng)程序,然后修改BSP的syslib.c或sysSerial.c文件,以使它們包括所需的驅(qū)動(dòng)程序.由于本文龍芯2F平臺(tái)的所用硬件均為普通的常用設(shè)備,可同樣按照上述方式添加與配置.
3 結(jié)束語(yǔ)
針對(duì)不同的用途和需求,龍芯2F的硬件平臺(tái)配置也各不相同,但Vxworks移植的方法是類(lèi)似的.本文詳細(xì)研究了龍芯2F平臺(tái)下的Vxworks移植方法,并在龍芯2F開(kāi)發(fā)板上驗(yàn)證了其可行性,一定程度上可以拓展龍芯系列在高性能嵌入式等領(lǐng)域的應(yīng)用范圍。
【參考文獻(xiàn)】
[1]龍心.中國(guó)科學(xué)院計(jì)算技術(shù)研究所.2F處理器用戶(hù)手冊(cè)[Z].2008.
[2]王金剛,譯.Wind River.VxWorks BSP開(kāi)發(fā)人員指南[M].北京:清華大學(xué)出版社,2003.
[3]Wind River Ststem,Inc,VxWorks BSP Developers Guide [Z] ,2008.
[4]趙傳良,張福新,陶品,等,譯.Dominic Sweetman MIPS處理器設(shè)計(jì)透視[M]. 北京:北京航空航天大學(xué)出版社,2005.
[責(zé)任編輯:薛俊歌]
{CAUSE_SW2, (ULONG) IV_SWTRAP1_VEC, 0x000200, 0},
{CAUSE_IP3, (ULONG) sysFeiInt, 0x000400, 1},
{CAUSE_IP4, (ULONG) sysSerialprint, 0x000800, 36},
{CAUSE_IP5, (ULONG) NULL, 0x001000, 0},
{CAUSE_IP6, (ULONG) NULL, 0x002000, 0},
{CAUSE_IP7, (ULONG) sysNetInt, 0x004000, 40},
{CAUSE_IP8, (ULONG) IV_TIMER_VEC, 0x008000, 0},
};
2.3 PCI庫(kù)的實(shí)現(xiàn)
在Vxworks的硬件初始化函數(shù)sysHwInit()中對(duì)PCI庫(kù)進(jìn)行初始化。對(duì)于龍芯2而言,PCI采用配置機(jī)制0,讀寫(xiě)函數(shù)具體由sysPciConfigRead()和sysPciConfigWrite()來(lái)實(shí)現(xiàn),通過(guò)PCI總線號(hào),PCI設(shè)備號(hào),PCI功能號(hào),按傳入的字節(jié)寬度,實(shí)現(xiàn)對(duì)PCI配置空間的寄存器地址進(jìn)行讀寫(xiě)操作。PCI庫(kù)初始化如下:
pci Config LibInit (PCI_MECHANISM_0, ULONG) sysPciConfigRead, ULONG)sysPciConfigWrite,NONE);sysPciConfigRead()和sysPciConfigWrite()基本實(shí)現(xiàn)見(jiàn)[4]。Vxworks中實(shí)現(xiàn)PCI資源(I/O端口地址、PCI Memory地址、中斷號(hào))的自動(dòng)分配可以通過(guò)sysPciAutoConfig ()接口來(lái)實(shí)現(xiàn)。
2.4 串口驅(qū)動(dòng)程序開(kāi)發(fā)
龍芯2F平臺(tái)的啟動(dòng)過(guò)程中,需要對(duì)串口設(shè)備初始化.普通多模式串行驅(qū)動(dòng)程序存放在target/src/drv/sio目錄下.此目錄中包括了很多常見(jiàn)的串口設(shè)備的驅(qū)動(dòng)源文件,如i8250SIO.c和nsl16550sio.c等等,同時(shí)還包含了templateSio.c模板文件.龍芯2F中的UART串口設(shè)備兼容NS 16550,因此可以直接使用nsl16550sio.c作為串口驅(qū)動(dòng).如果需要添加特殊串口設(shè)備時(shí),需要先在模版templateSio.c上創(chuàng)建驅(qū)動(dòng)程序,然后修改BSP的syslib.c或sysSerial.c文件,以使它們包括所需的驅(qū)動(dòng)程序.由于本文龍芯2F平臺(tái)的所用硬件均為普通的常用設(shè)備,可同樣按照上述方式添加與配置.
3 結(jié)束語(yǔ)
針對(duì)不同的用途和需求,龍芯2F的硬件平臺(tái)配置也各不相同,但Vxworks移植的方法是類(lèi)似的.本文詳細(xì)研究了龍芯2F平臺(tái)下的Vxworks移植方法,并在龍芯2F開(kāi)發(fā)板上驗(yàn)證了其可行性,一定程度上可以拓展龍芯系列在高性能嵌入式等領(lǐng)域的應(yīng)用范圍。
【參考文獻(xiàn)】
[1]龍心.中國(guó)科學(xué)院計(jì)算技術(shù)研究所.2F處理器用戶(hù)手冊(cè)[Z].2008.
[2]王金剛,譯.Wind River.VxWorks BSP開(kāi)發(fā)人員指南[M].北京:清華大學(xué)出版社,2003.
[3]Wind River Ststem,Inc,VxWorks BSP Developers Guide [Z] ,2008.
[4]趙傳良,張福新,陶品,等,譯.Dominic Sweetman MIPS處理器設(shè)計(jì)透視[M]. 北京:北京航空航天大學(xué)出版社,2005.
[責(zé)任編輯:薛俊歌]
{CAUSE_SW2, (ULONG) IV_SWTRAP1_VEC, 0x000200, 0},
{CAUSE_IP3, (ULONG) sysFeiInt, 0x000400, 1},
{CAUSE_IP4, (ULONG) sysSerialprint, 0x000800, 36},
{CAUSE_IP5, (ULONG) NULL, 0x001000, 0},
{CAUSE_IP6, (ULONG) NULL, 0x002000, 0},
{CAUSE_IP7, (ULONG) sysNetInt, 0x004000, 40},
{CAUSE_IP8, (ULONG) IV_TIMER_VEC, 0x008000, 0},
};
2.3 PCI庫(kù)的實(shí)現(xiàn)
在Vxworks的硬件初始化函數(shù)sysHwInit()中對(duì)PCI庫(kù)進(jìn)行初始化。對(duì)于龍芯2而言,PCI采用配置機(jī)制0,讀寫(xiě)函數(shù)具體由sysPciConfigRead()和sysPciConfigWrite()來(lái)實(shí)現(xiàn),通過(guò)PCI總線號(hào),PCI設(shè)備號(hào),PCI功能號(hào),按傳入的字節(jié)寬度,實(shí)現(xiàn)對(duì)PCI配置空間的寄存器地址進(jìn)行讀寫(xiě)操作。PCI庫(kù)初始化如下:
pci Config LibInit (PCI_MECHANISM_0, ULONG) sysPciConfigRead, ULONG)sysPciConfigWrite,NONE);sysPciConfigRead()和sysPciConfigWrite()基本實(shí)現(xiàn)見(jiàn)[4]。Vxworks中實(shí)現(xiàn)PCI資源(I/O端口地址、PCI Memory地址、中斷號(hào))的自動(dòng)分配可以通過(guò)sysPciAutoConfig ()接口來(lái)實(shí)現(xiàn)。
2.4 串口驅(qū)動(dòng)程序開(kāi)發(fā)
龍芯2F平臺(tái)的啟動(dòng)過(guò)程中,需要對(duì)串口設(shè)備初始化.普通多模式串行驅(qū)動(dòng)程序存放在target/src/drv/sio目錄下.此目錄中包括了很多常見(jiàn)的串口設(shè)備的驅(qū)動(dòng)源文件,如i8250SIO.c和nsl16550sio.c等等,同時(shí)還包含了templateSio.c模板文件.龍芯2F中的UART串口設(shè)備兼容NS 16550,因此可以直接使用nsl16550sio.c作為串口驅(qū)動(dòng).如果需要添加特殊串口設(shè)備時(shí),需要先在模版templateSio.c上創(chuàng)建驅(qū)動(dòng)程序,然后修改BSP的syslib.c或sysSerial.c文件,以使它們包括所需的驅(qū)動(dòng)程序.由于本文龍芯2F平臺(tái)的所用硬件均為普通的常用設(shè)備,可同樣按照上述方式添加與配置.
3 結(jié)束語(yǔ)
針對(duì)不同的用途和需求,龍芯2F的硬件平臺(tái)配置也各不相同,但Vxworks移植的方法是類(lèi)似的.本文詳細(xì)研究了龍芯2F平臺(tái)下的Vxworks移植方法,并在龍芯2F開(kāi)發(fā)板上驗(yàn)證了其可行性,一定程度上可以拓展龍芯系列在高性能嵌入式等領(lǐng)域的應(yīng)用范圍。
【參考文獻(xiàn)】
[1]龍心.中國(guó)科學(xué)院計(jì)算技術(shù)研究所.2F處理器用戶(hù)手冊(cè)[Z].2008.
[2]王金剛,譯.Wind River.VxWorks BSP開(kāi)發(fā)人員指南[M].北京:清華大學(xué)出版社,2003.
[3]Wind River Ststem,Inc,VxWorks BSP Developers Guide [Z] ,2008.
[4]趙傳良,張福新,陶品,等,譯.Dominic Sweetman MIPS處理器設(shè)計(jì)透視[M]. 北京:北京航空航天大學(xué)出版社,2005.
[責(zé)任編輯:薛俊歌]