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