1 介紹
S3C4510B是三星公司推出的針對嵌入式應用的16/32 位嵌入式處理器,該微控制器專為以太網通信系統的集線器和路由器而設計,具有低成本和高性能的特點, S3C4510B中內置了設計的16/32位ARM7TDMI處理器, 可以執行32位的ARM指令,也可執行16位的THUMB指令, 并集成了多種外圍部件,主要有
● 時鐘頻率50MHz
● 內核/IO電壓3.3V
● 8KB的Cache/SRAM
● 一個10/100Mbps 以太網控制器,MII接口
● 兩個HDLC通道,每個通道可支持10Mbps
● 兩個UART通道
● 兩個DMA通道
● 兩個32位定時/計數器
● 18個可編程I/O口
● 中斷控制器,支持21個中斷源,包括4個外部中斷
● 支持SDRAM,EDO DRAM,SRAM,Flash等
● 具有擴展外部總線
● JTAG接口,支持軟件開發 ,硬件調試
S3C4510B支持目前常用的嵌入式操作系統,如VxWorks、pSoS、ucLinux等,本文將主要介紹VxWorks操作系統下的軟件開發。
ARM7TDMI是ARM家族通用的一款32位微處理器,它主要為用戶提供了高性能、低價格解決方案。
ARM7TDMI具有三級流水線的32位RISC處理器,處理器結構為馮·諾依曼Load/Store。該CPU具有兩種指令集,即ARM和Thumb指令集。ARM指令集是32位,它可以利用CPU最大性能;而Thumb指令集則是16位指令集。
ARM7TDMI內核方塊圖如圖1所示。
2 系統硬件圖
該系統主要以S3C4510B為核心,外圍集成了以太網卡、SDRAM、FLASH、UART以及HDLC等。圖2是以S3C4510B為核心的最小系統設計圖。
SDRAM選用HY57V653220(8Mbyte)、兩片FLASH分別為AM29F040(存放bootrom)和T28F160BT(作為文件系統用)。
3 VxWorks操作系統下BSP構建
在完成板上基本硬件的測試后,下面我就開始對vxWorks操作系統下BSP進行開發,開發前需要做一些準備工作,如準備開發工具等。
① 開發工具用的是Tornado2.2 for ARM;
② 參考資料有BSP Kit、S3C4510B DataSheet;
③ 參考Tornado2.2 for ARM下自帶的wrSBCArm7 BSP;
④ 燒寫程序采用編程器。
通常在開發BSP的時候,我們需要在Tornado原帶BSP目錄下找一個與我們所用的處理器相同或相近。與BSP相關的文件有:romInit.s、sysAlib.s、bootInit.c、bootConfig.c、sysLib.c、config.h、configNet.h、makefile以及與我們硬件相關的,如串口sysSerial.c等。由于篇幅所限,具體的文件作用在此就不說了。下面主要根據S3C4510B來闡述一下BSP開發步驟。
(1)拷貝BSP
將wrSBCArm7 BSP拷貝一份并命名為4510BSP,接下來的工作就是修改該目錄下的文件,從而得到自己的BSP。
(2)修改MakeFile文件
修改4510BSP目錄下的makefile文件,修改如下幾行
TARGET_DIR = 4510BSP # changed by caiyang
VENDOR = CAI # changed by caiyang
BOARD = MyArmBoard # changed by caiyang
ROM_TEXT_ADRS = 01000000 # ROM entry address
ROM_WARM_ADRS = 01000004 # ROM warm entry address
ROM_SIZE = 00080000 # number of bytes of ROM space
RAM_LOW_ADRS = 00006000 # RAM text/data address (bootrom)
RAM_HIGH_ADRS = 00486000 # RAM text/data address (bootrom)
MACH_EXTRA =
注解:ROM_TEXT_ADRS:BOOT ROM的入口地址。對大多數板來說,這就是ROM地址區的首地址,然而也有的硬件配置使用ROM起始的一部分地址區作為復位向量,因此需要根據此設置偏移量作為它的地址。這個偏移量因CPU結構而定。
ROM_WARM_ADRS:BOOT ROM熱啟動入口
]]>VxWorks的一個優勢就是它為應用代碼提供了高度的架構和硬件獨立性。這種可移植性得益于VxWorks的模塊化設計, 而這種模塊化設計將所有硬件相關的功能函數分離到了一套稱為板級支持包(BSP)的庫中。BSP庫為所有開發板的硬件相關功能提供了一個一致的接口。 這些功能包括硬件初始化, 中斷處理, 中斷產生, 硬時鐘和Timer管理, 本地和總線內存空間的映射, 以及內存尺寸控制等等。
總的來說, 有如下幾種類型的VxWorks移植:
A. 宿主移植: 將Tornado和VxWorks的開發能力移植到一個以前不支持的宿主機上。
B. 架構移植: 將VxWorks 和Tornado 調試器移植到一個以前不支持的目標處理器或架構上。
C. 板級移植: 將VxWorks 移植到一個新的目標板上, 在此之前應該已經有了宿主移植和架構移植。
D. 升級pre-Tornado BSPs 使之工作于Tornado 平臺。
E. 移植一個可選的部件。
宿主移植和架構移植需要訪問全部的VxWorks源代碼, 超出了本文的范圍。 板級移植是我們要討論的重點, 板級移植只需要訪問VxWorks中硬件相關的那部分源代碼(BSP)和調試器。
多年以來, 風河公司(Wind River)能夠提供給客戶各種BSP, 然而, 隨著許多新的CPU板的大批流行, 尤其是許多客戶自己設計的CPU板的大量出現, 使得風河已經不能夠跟上市場對于新的BSP的需求。
本書就是為了解決這個問題, 本書旨在幫住你創建、測試新的BSP、部件和項目。 移植VxWorks到一個新的板子上是一件非常有挑戰性的工作, 尤其是只有在移植完成后那些VxWorks開發工具才能夠被使用的時候。根據本書的策略可以使移植變得簡單一點。本書提供了移植策略和系統元件如何相互作用的詳細描述, 本書也包括了基于Tornado2.0來創建和發布部件或項目所需要的 技術信息。
本書所涉及的BSP 工具集與Tornado 2.0 或更高版本兼容, 升級早期的BSP 使之工作于Tornado 2.0 是相當容易的, 參考A。升級一個BSP到Tornado 下。
SCSI 1 廢止: 對于SCSI-1 驅動和庫的支持已經被廢止, 雖然這些庫仍然被包括在Tornado2.0 中,但是它們已經被列為廢除并且不會被包括在將來的版本中。
宏 TYCO5_2被刪除:TYCO5_2這個宏不再被支持, 客戶應當使用Tornado 2.0 下的SIO驅動 。
BSP封裝被變更: 參考10。2 BSP封裝, P???頁以獲得更詳細的關于封裝要求的描述。 參考O。BSP產品內容以獲得一個典型產品內容的的快速總結。
文檔: 所有的在線文檔現在是以HTML格式提供, 在系統中包含了一個稱為refgen的工具,用來從現存的nroff輸入產生HTML頁。
VxWorks網絡協議棧:VxWorks網絡協議棧是Tornado 1.0.1 用戶的可選部件, 現在是唯一被Winriver 支持的協議棧。 所有的BSP現在都使用為VxWorks網絡協議棧而修改的驅動程序。 VxWorks網絡協議棧是基于BSD 44 協議棧的。在BSP中 BSD44 和 END 驅動都可被使用。END驅動是BSP的缺省驅動。
新的驅動: 許多新的END網絡驅動已經被加入到驅動產品中來以便使盡可能多的產品擁有至少一個可用的END 驅動。
集成的模擬器: Tornado 2.0包括一個集成的模擬器, 它允許開發人員在硬件環境就續以前就能夠開始應用的開發。
集成的WindView:Tornado 2.0包括一個集成的WindView 工具, 用來檢查運行時的行為, 參考 <<WindView User’s Guide>> 來了解更多關于WindView的特性。
VTS 測試更新: VTS(驗證測試套件)有了微小的升級以便使它能夠正確地工作于target shell 的新的虛擬輸入輸出特性。
SCSI 測試套件: SCSI性能測試套件在以前的移植工具中被忽略了, 現在可用。
ROM_WARM_ADRS 這個新宏被引入到BSP模板和一些BSP中, 它代表進入到boot ROM 代碼的熱啟動入口, 它被用來去除基于不同CPU家族所手工計算出來的入口地址。 正常情況下, ROM_WARM_ADRS是基于一個來自于ROM_TEXT_ADRS的偏移, 例如:
#define ROM_WARM_ADRS (ROM_TEXT_ADRS + 8)
新的SIO IOCTLs: 新的SIO IOCTL 代碼用來支持modem控制線路。 IOCTLs 例如SIO_OPEN和SIO_HUP當設備被打開和關閉時通知驅動程序。 而SIO_HW_OPTS_SET 和SIO_HW_OPTS_GET允許用戶管理字符長度、奇偶、停止位和modem 控制線路。 可選位 CLOCAL 禁止了modem 控制線路在驅動程序中的使用, 為了保持向后兼容性, CLOCAL選項在Wind River BSP中默認是選擇的。
Target.txt 文件被刪除: 文本格式的target.nr 文件(為Windows 宿主用戶而產生)已經被刪除了, 目前UNIX 和WINDOWS平臺均使用瀏覽器來閱讀HTML格式的文檔。 宿主工具refgen取得nroff的輸入并且產生HTML的輸出。
首先, 你應當有底層C和匯編語言的知識, 熟悉設備驅動, 熟悉中斷, 最好具有同硬件接口的軟件開發經驗, 另外, 你應當熟悉Tornado開發工具或者至少已經讀過了Tornado用戶指南。最后, 你應當有一個基于你的目標系統上所用的CPU的參考BSP, 這可以節省你的大量時間。
你也應當有一個適用于你的項目架構的模板BSP,以及模板驅動程序, 大部分客戶購買一個或多個設備驅動程序的源代碼。
Tornado產生的目標代碼的默認格式是Motorola開發板的Flash下載工具只能下載Intel 32bit格式。必須將它們進行轉換才能將代碼寫入到Flash中去。下面以Motorola的S2格式為例說明格式的轉換。
S2的一種實際格式如下:
S0120000626F6F74726F6D5F726532E686578CF
S214000000060000EABD0300EAA50300EAB70300EA1B
S804000000FB
其中第一條是記錄的頭部。第二條是地址和對應的數據記錄,S2表示24位地址的格式,14表示起始地址000000和對應的數據及奇偶效驗對的總和。最后兩位表示所有十六進制數對的校驗和。最后一條是記錄的結束標志。 Intel 32 bit的一種實際格式如下:
:020000040000FA
:10000000060000EABD0300EABB50300EAB70300EA20
…………
:00000001FF
其中第一條是記錄的頭部,表示32位地址的高16位為0000。在第二條記錄中,:表示記錄的開始,10表示記錄對的個數,0000表示起始地址的值,最后兩位表示校驗和。最后一條是記錄的結束標志。
了解這兩種格式后,編寫格式轉換程序就是很簡單的一件事件。
2 BSP的設計過程及軟件仿真方法
2.1 駐留ROM/Flash的系統各段分配情況
由于LPC2104只有16KB的RAM,故只能程序代碼和數據放在Flash中,開機后再將數據拷貝到RAM內,而程序依然放在Flash中并在其中運行,即所謂的ROM Resident Image設計。在Tornado集成開發環境下,選取templatARM的BSP生成的bootrom_res.hex文件就是這種ROM_Resident文件,其代碼段、數據段、堆棧段分別在Flash和RAM中的情況如圖1。
Flash的分配和對應常量的定義
片內Flash的地址空間為0x00000000~0x00020000
ROM_TEXT_ADRS=00000000代碼段的起始地址
ROM_SIZE=00020000 Flash的大小
RAM的分配和對應常量的定義
片內RAM的地址空間為0x40000000~0x40003FFF
0x40000000~0x4000003F共64字節,放中斷向量表LOCAL_MEM_LOCAL_ADRS=0x400000000
RAM_LOW_ADRS=0x40000600
RAM_HIGH_ADRS=0x40000F00
LOCAL_MEM_SIZE=0x00020000
根據上面的分析,修改Makefile和config.h中相應的部分,使兩者一樣。
堆棧的分配
堆棧的地址設為STACK_ADRS,由系統定義,從RAM_LOW_ADRS開始向下伸展。
2.2 romlnit.s文件
ARM的異常向量表如表1。LPC2104的異常向量表也一樣,只不過它可以重新映射到RAM的頭部,即從0x40000000開始的32個字節。 表1 ARM異常向量位置
地 址異 常
0x0000 0000復位0x0000 0004未定義指令0x0000 0008軟件中斷0x0000 000C預取指中止(從存儲器取指出錯)0x0000 0010數據中止(數據訪問存儲器出錯)0x0000 0014保留0x0000 0018IRQ0x0000 001CFIQ *在ARM文檔中標識為保留,該位置被Boot裝載程序用作者有效的用戶程序關鍵字。
基于ARM體系結構的VxWorks的其中四個異常 入口函數為:excEnterUndef、ecxEnterSwi、excEnterPrefetchAbort、excEnterDataAbort。直接在對應的位置用B指令跳到對應的函數中即可。代碼如下:_ARM_FUNCTION(romInit)
_romInit:
ARM的異常向量表如表1。LPC2104的異常向量表也一樣,只不過它可以重新映射到RAM的頭部,即從0x40000000開始的32個字節。
基于ARM體系結構的VxWorks的其中四個異常入口函數為:excEnterUndef、excEnterSwi、excEnterPrefetchAbort、excEnterDataAbort。直接在對應的位置用B指令跳到對應的函數中即可。代碼如下:
_ARM_FUNCTION(romInit)
_romInit:
cold:
B start /*復位異常*/
B excEnterUndef /*未定義異常 */
B excEnterSwi /*軟中斷*/
B excEnterPreftchAbort/*予取指異常*/
B excEnterDataAbort /*數據異常*/
.ascii "20B9" /*保留空間,由格式轉換程序超填入0xB9205F80*/
LDR pc,[pc,#-0xFF0]/*IRQ中斷入口函數*/
B FIQ_Hander /*FIQ中斷入口函數*/
IRQ中斷函數的入口函數是C語言寫的sysClkInt()和sysAuxClkInt(),需要自己保存現場和恢復現場,代碼為:
_ARM_FUNCTION(TIME0_IRQ_Hander)
_TIME0_IRQ_Hander:
SUB LR,LR,#4 /*計算返回地址*/
STMFD SP!,{R0-R11,R12,LR} /*保存任務環境*/
MRS R3,SPSR /*保存狀態*/
STMFD SP!,{R3}
BL sysClkInt /*調用C語言的中斷處理程序*/
LDMFD SP!,{R3}
MSR SPSR_cxsf,R3
LDMFD SP!,{R0-R11,R12,PC}
_ARM_FUNCTION(TIME1_IRQ_Hander)
_TIME1_IRQ_Hander:
SUB LR,LR,#4 /*計算返回地址*/
STMFD SP!,{R0-R11,R12,LR} /*保存任務環境*/
MRS R3,SPSR /*保存狀態*/
STMFD SP!,{R3}
BL sysAuxClkInt /*調用C語言的中斷處理程序*/
LDMFD SP!,{R3}
MSR SPSR_cxsf,R3
LDMFD SP!,{R0-R11,R12,PC}
快速中斷函數VxWorks不用由用戶自己定義。其框架如下:其中FIQ_Exception()函數由C語言定義,在文件開始用globl FUNC(FIQ_Exception)聲明。
FIQ_Hander:
STMFD SP!,{R0-R12,LR}
BL FIQ_Exception
LDMFD SP!,{R0-R12,LR}
SUBS PC,LR,#4
當系統上電時,如果地址0x00000014內的數據是0xB9205F80,則從Flash的零地址開始執行,也就是執行romInit()函數。此函數將啟動方式BOOT_COLD放在R0中,作為romStart的參數,將系統設為SVC32模式,并禁止IRQ和FIR中斷,設置好系統堆棧指針跳到romStart()執行。驗證此部分程序執行情況的最簡單的一種方法是用匯編寫一段點燈程序,用以指令程序的執行情況。其中常量PINSEL0、PINSEL1、IODIR、SPI_IOCON可以頭文件templatARM.h中用define定義。
#define PINSEL0 0xE002C000
#define PINSEL1 0xE002C004
#define IODIR 0xE0028008
#define SPI_IOCON 0x00003DD0
我們設計的點燈程序如下。將其放在romInit.s適當的位置,可以定位程序的運行情況。
LDR r0,=PINSEL0
MOV r1,#0
STR r1,[R0],#4
STR r1,[R0]
LDR r0,=PINSEL1
MOV r1,#0
STR r1,[R0],#4
STR r1,[R0]
LDR r0,=IODIR
LDR r1,SPI_IOCON
STR r1,[R0]
在Tornado集成開發環境下,templatARM的BSP生成bootrom_res.bin文件后,可以借助ASD1.2的AXD反匯編調方式器進行單步仿真和調試。
2.3 sysLib.c文件
在這個文件中,主要是在sysHwInit()函數內實現系統外設的配置,中斷向量表的拷貝和重映射,系統定時器中斷向量的安裝,串口初始化等功能。在串口還沒有調通之前,可以借助上面提到的簡單點燈函數實現程序的定位。其用C語言重新定義如下(將它插入本文件的適當地址,可以指示各個函數的執行情況):
#include “LPC2106.h”
PINSEL0=0x00000000;
PINSEL1=0x00000000;
IODIR=0x00003DD0;
系統的初始化和配置與硬件系統高度相關。對這部分的代碼不作過多的解釋,請參看代碼注釋。幾個常量定義如下:
#define Fosc 11059200 /*晶振頻率,10MHz~25MHz應與實際一致*/
#define Fcclk(Fosc *4)
/*系統頻率,必須為Fosc的整數倍(1~32),且<=60MHz*/
#define Fcco (Fosc *4)
/*CCO頻率,必須為Fcclk的1、2、4、8倍,范圍為156MHz~320MHz*/
#define Fpclk (Fcclk/4)*2
/*VPB時鐘頻率,只能為(Fcclk/4)的1、2、4倍*/
2.4 templateTimer.c文件
本文件主要實現與系統時鐘和系統輔助時鐘相關的函數。關于系統時鐘的各函數定義如下(系統輔助時鐘的各函數與系統時鐘一樣,只須將T0換成T1即可):
/*SysClkInt(),此函數每個時鐘Tick被調用一次*/
void sysClkInt(void){
/*通知系統中斷結束*/
T0IR=0x01;
T0MR0+=(Fpclk/sysClkTicksPerSecond);
VICVectAddr=0;
/*調用系統中斷函數*/
if(sysClkRoutine!=NULL)
(*sysClkRoutine)(sysClkArg);
}
/*sysClkDisable()禁止系統時鐘*/
void sysClkDisable(void){
if(sysClkRunning){
/*禁止系統時鐘中斷*/
VICIntEnClr=0x10;
T0TC=0;
SysClkRunning=FLASE;
}
}
/*sysClkEnable()啟動系統時鐘*/
void sysClkEnable(void){
static BOOL connected=FALSE;
if(!connected){
/*定時器0初始化*/
T0TC=0;
T0TCR=0x01;
T0MCR=0x01;
T0MR0=(Fpclk/sysClkTicksPerSecond);
VICIntEnable=0x10;
Connected=TRUE;
}
if(!sysClkRunning){
T0TC=0;
sysClkRunning=TRUE;
}
}
3 應用程序設計
由于EasyARM開發板本身資源較少,不可能與PC機連接成宿主機一目標機的調試環境,通過主機將代碼下載到目標機再執行。因此在設計應用程序時,可以修改bootConfig.c文件中的bootCmdLoop()函數,生成bootrom_res.hex文件,格式轉換后,下載到Flash中運行,在PC機上借助串口調試助手打印調試信息。具體過程是:在Tornado2.2集成開發環境下選取Build->Build Boot Rom,BSP選定templateARM,Image選定bootrom_res.hex,編譯器選gnu,確認即可。
4 小結
VxWorks所需要的唯一的驅動程序是系統時鐘,本文詳細給出了系統時鐘源代碼,同時還給出了串口通信的源代碼,使得開發板與PC機能正常通信。另外,給出了基于VxWorks的應用程序的設計方法。由于BSP的設計本身就是一件很具有挑戰性的工作,相信本文對VxWorks的BSP設計得有所幫助。
]]>VxWorks是美國Wind River公司開發的嵌入式實時操作系統,具有高性能、可裁減性好等特點,能支持多種微處理器(如PowerPC、X85、ARM、SPARC);自問世以來,以其良好的町靠性和卓越的實時性被廣泛地應用于通信、航空、航天等高精尖技術及實時性要求極高的領域中。BSP(Board Support Package,板級支持包)的作用是針對特殊的硬件平臺,為操作系統內核提供操作接口,使操作系統能夠獨立于底層硬件。對上層應用屏蔽具體硬件,VxWorks的高可移植性就是通過BSP實現的。AT91RM9200是Atmel公司生產的一款ARM9核芯片,本文重點介紹將VxWorks移植到該芯片過程中BSP的定制過程。
1 BSP概念
BSP通常是指針對具體的硬件平臺,用戶所編寫的啟動代碼和部分設備驅動程序的集合。它所實現的功能包括初始化和驅動部分設備。最基本的BSP僅需要支持處理器復位、初始化、驅動串口和必要的時鐘處理。BSP是相對于操作系統而言的,不同的操作系統對應不同形式的BSP,因此,在寫BSP時一定要按照要求的操作系統對BSP的定義形式來寫。在VxWorks系統中,BSP是介于底層硬件環境和VxWorks之間的一個軟件接口,它的主要功能是系統加電后初始化目標機硬件和VxWorks,并提供部分硬件驅動程序。BSP在VxWorks系統中的層次關系如圖1所示。
BSP為各種板卡的硬件功能提供了統一的軟件接口,包括硬件初始化、中斷的捕捉和處理、硬件時鐘和定時器管理、內存地址映射,以及內存分配等。每個BSP還包括一個ROM啟動或其他啟動機制。
2 VxWorks的引導過程
在編寫BSP之前,首先要了解整個系統的啟動過程。VxWorks的映像由代碼段、數據段和BSS段3部分組成。VxWotks內核可以分為3種:可加載類型映像、基于ROM的VxWorks映像和RoM駐留型映像。這3種類型的映像組織是不一樣的,因此啟動過程有所區別。
可加載映像包括VxWorks和Boot ROM兩部分內容,兩部分是獨立創建的。首先,由系統引導代碼把ROM引導程序搬到RAM_HIGH_ADRS。然后,ROM引導程序開始運行,將VxWorks映像加載到RAM_LOW_ADRS,之后跳轉到VxWorks映像裝入點。
基于ROM的VxWorks映像在BSP初始化時,會把lmage完全搬到RAM中執行,包括代碼段和數據段。在拷貝執行完畢后,系統控制權轉移給RAM中VxWorks映像的初始化代碼。
ROM駐留型映像只是將ROM中VxWorks映像的數據段和BSS段拷貝到RAM中,完成后系統控制權轉移給ROM/Flash里VxWorks映像的初始化代碼,代碼段留在ROM中并在ROM中運行。在ROM中運行的VxWorks映像主要足為了節省RAM空間,帶來的不利則是運行速度慢。
圖2和圖3分別是下載型和ROM型VxWorks映像的初始化流程。
下面以ROM型VxWorks內核啟動流程為例,說明各文件的作用:
romlnit()保存啟動類型,屏蔽中斷;初始化內存和寄存器,屏蔽Cache;初始化CPU,將堆棧指針定位于被拷貝Boot ROM映像在RAM的地址;跳到romStart()。
roraStart()根據不同的映像類型將VxWorks映像的不同部分解壓縮<如果需要)并加載到RAM中。
usrInit() 對VxWorks映像的BSS段清零;調用intVecBaseSet()設置中斷矢量基地址表;調用excVecInit()初始化異常中斷矢量;調用sysHwInit()初始化系統硬件;調用usrKernelInit()初始化wind內核;調用kernellnit()啟動wind內核,啟動usrRoot()任務。
usrRoot()設置操作系統時鐘,創建設備,安裝驅動,調用sysHwInit2()安裝系統時鐘和輔助時鐘中斷以及串口等設備的中斷,初始化I/O、文件系統、調用應用程序。
3 VxWorks在AT91RM9200上的BSP設計
3.1 AT91RM9200簡介
AT91RM9200的片上資源包括:ARM920T處理器棱、16KB的內部SRAM和128KB的內部ROM存儲器;支持SDRAM、SRAM、Burst Flash和CompactFlash、SmartMedia以及NANDFlash的無縫連接;16KB的數據Cache,16KB的指令Cache,完全可編程的外部總線接口EBI,4個32位的PIO控制器可以達到122個可編程I/O引腳(每個都有輸入控制、可中斷及開路的輸出能力);帶有8個優先級、可單獨屏蔽中斷源的先進中斷控制器、6組硬件定時器、4個通用同步/異步收發器USART。
3.2 BSP中幾個重要文件的修改
由于AT91RM9200的內核是ARM920T,所以BSP文件主要在VxWorks編澤環境Tornado的目錄target/config/all和target/config/integrator920t文件夾里。其中,a11文件夾里的文件對于絕大多數BSP都是共用的,一般來說不需要修改,特別是“configAll.h”;integrator920t文件夾里的文件就是所要編寫的BSP文件,這些文件往往與系統硬件密切相關。
3.2.1 修改Makeflie
Makefile文件定義編譯和鏈接整個BSP的規則,如編譯工具的選擇、編譯選項和包含文件路徑等;控制生成VxWorks映像文件的類型,同時含有存儲區大小的信息,對于存儲區大小信息的改動必須與Config.h的對應改動同步。有些參數需在該文件中定義,如處理器類型、編譯工具、目標地址等。下面介紹一些須修改的參數和地址:
4 編譯生成映像
系統定制完成后,有兩種編譯方式:一種是在Tornado下進行編譯,生成映像文件;另一種是直接用Make工具編譯,但要寫好腳本文件。裝載到目標板中的VxWorks映像取決于使用的下載方式,其中主要包括以下幾種:
①VxWorks。這是基于RAM的映像,VxWorks需要通過目標板上的引導程序從串口或網口把它下載到目標板的RAM中運行。在Tornado開發環境下,這是一個默認選項,主要用在調試階段。使用宿主機上的WindSh工具和符號表。
②VxWorks.st。這也是基于RAM的映像,需要通過引導ROM把VxWorks映像下載到目標機內存中才能執行。該對象文件內置符號表。
③VxWorkS_rom。這是一個非壓縮、基于ROM的映像。在這個對象文件執行前,先把自己拷貝到目標機RAM中。這種類型的映像通常在啟動階段速度比較慢,因為代碼在ROM中執行,但執行階段比ROM駐留型的映像要快。
④VxWorks.st_rom。這是基于ROM壓縮的VxWorks映像。它在執行前先把自己解壓并拷貝到目標機RAM中執行。
⑤VxWorks.res_rom。這是ROM駐留型的非壓縮VxWorks的映像。它在執行前把數據段拷貝到目標機RAM中。這種類型的映像在啟動階段比較快,但在目標機上執行的速度比基于ROM類型的映像慢(因為CPU訪問ROM比訪問RAM要慢)。通常在RAM空間比較小的目標機上使用這種類型的映像。
5 需要注意的問題
首先,應該避免在romInit.s中進行過多的初始化操作。該史件中只是進行必要的最小硬件初始化,大部分硬件的初始化都是在sysHwInit()中完成的。另外,romTnit.s中的代碼不應當被其他模塊或函數調用。
其次,應該避免sysAlib.s中工作太少。BSP開發人員通常錯誤地認為在romInit.s里初始化過的設備不需要在sysAlib.s中重新初始化。實際上,VxWorks映像并不認為它是由引導映像程序引導的,因此,它必須重新設置和初始化所有它自己需要使用的設備。sysInit()是該文件中最主要的一個函數,也是第一個函數。該例程中很多工作與romInit()是相同的,目的是保證內核映像在運行與冷啟動時,軟硬件環境高度一致。
最后,對特定的BSF。驅動程序的修改,只能在特定的BSP目錄下。此設計中目錄為target/config/integra-tor920t,不要直接在target/src/drv以及target/h/drv中修改。只有風河公司的源程序才能存放在這些目錄下。
6 結論
本文在介紹BSP的概念、作用和vxWorks映像分類以及系統啟動流程的基礎上,以Atmel公司生產的ARM9處理器AT91RM9200為例,重點介紹了VxWorks的BSP設計中需要修改的幾個重要文件,最后提出了需要注意的問題。盡管目標板硬件不同,BSP的實現也不盡相同,但基本思想是一樣的。本設計對各類開發板的系統移植和后續的應用程序開發有一定的參考價值。
如圖1,嵌入式系統的調試方法一般為通過PC(宿主機)上的集成開發環境交叉編譯針對特定電路板(目標機)的程序,然后將程序通過目標板的JTAG、串口或網口等途徑下載到目標板上運行。因此,為了構造一個嵌入式系統的學習環境,擁有一塊包含CPU、存儲器及I/O電路的目標電路板往往是必要的。雖然許多集成開發環境附帶模擬軟件,但僅限于指令集的模擬,均無法模擬物理的目標機硬件平臺,因而在其上只能進行應用程序的象征性模擬開發。但是,并非所有人都能擁有一塊物理的電路板。在這種情況下,我們如何構造一個模擬的開發環境,其學習效果就如同擁有完全真實的電路板一樣呢?本文試圖解答此問題,主體內容包括四個方面:
<!--[if !supportLists]-->? <!--[endif]-->利用VMware等軟件模擬真實的目標機;
<!--[if !supportLists]-->? <!--[endif]-->構建VMware虛擬PC上VxWorks BSP,建立Bootrom和OS映像;
<!--[if !supportLists]-->? <!--[endif]-->修改Tornado相關設置,連接宿主機與目標機,建立調試通道;
<!--[if !supportLists]-->? <!--[endif]-->寫一個簡單的應用程序并下載到目標系統運行。
id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t"
path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f">
o:title="" />
<!--[if !vml]--><!--[endif]-->
圖1 嵌入式系統的調試
本文工作的最終目標為:
(1)VxWorks在VMware啟動成功并順利運行,如圖2;
style='width:267pt;height:195pt'>
o:title="vxworks in vmware" />
<!--[if !vml]--><!--[endif]-->
圖2 在VMware中運行的VxWorks
(2)可在Tornado上針對目標板編譯程序并進行調試,如圖3。
style='width:334.5pt;height:231pt'>
o:title="tornado in run" />
<!--[if !vml]--><!--[endif]-->
圖3 與目標機建立調試通道的Tornado
PC也具有目標機的所有特點,實際上,我們可以把PC作為嵌入式系統的目標機,從而構造如圖4所示的開發模型:
type="#_x0000_t75" style='width:182.25pt;height:59.25pt' o:ole="">
o:title="" />
<!--[if !vml]--><!--[endif]-->
圖4 PC作為目標機
很遺憾,這種方法實際上非常麻煩,同時開動兩臺PC進行調試將使你和你的室友飽受折磨。因此,我們可以借助VMware來在本機上虛擬出另一PC。
VMware的確是天才的作品!在同一PC上,利用VMware幾乎可以安裝所有的操作系統,而且操作系統之間的切換不需要重新啟動電腦。VM的意義是Virtual Machine,即虛擬出一個邏輯的電腦,它可以提供基于Intel CPU的虛擬PC系統環境,包括CPU、內存、BIOS、硬盤和其他外圍硬件設備。
下面我們講解用VMware來建立一臺虛擬PC的步驟:
(1)下載并安裝VMware;
(2)使用VMware向導建立一個針對VxWorks的虛擬機;
此步驟中注意在操作系統中選擇“other”,如圖5:
style='width:277.5pt;height:246pt'>
o:title="" />
<!--[if !vml]--><!--[endif]-->
圖5 選擇Other操作系統
由于目標機最終通過軟盤啟動,因此要求你的電腦具有軟驅。很遺憾,當年日常使用的軟盤如今成了古董,很少再有電腦配備軟驅。因此,我們再來制造一個假冒偽劣產品,虛擬一個軟驅。又一個天才的工具軟件RamDiskNT為我們提供了這一便利,圖6演示了用RamDiskNT虛擬一個1.44M軟盤的方法。
style='width:289.5pt;height:291.75pt'>
o:title="" />
<!--[if !vml]--><!--[endif]-->
圖6 虛擬軟驅和軟盤
僅僅虛擬一個軟驅是不夠的,把這個軟驅添加到我們建立的虛擬機中才算修成正果,圖7演示了添加軟驅后的虛擬機硬件設置。
id="_x0000_i1032" type="#_x0000_t75" style='width:414.75pt;height:319.5pt'>
o:title="" />
<!--[if !vml]--><!--[endif]-->
圖7 包含軟驅的虛擬機
VMware為運行于其上的操作系統提供虛擬網卡支持,該網卡類型即為AMD的PC-NET。實際上,在Tornado開發包中已經包含了該類型網卡的驅動程序,但經過測試,對于VMware無法正常工作,所以需要從AMD的網站下載最新的驅動程序。
下載得到的是一個可執行的安裝程序,運行該程序將得到一個壓縮包和一個幫助文件,按照該幫助的要求,將壓縮包直接釋放到Tornado目錄下。如果提示是否允許覆蓋文件,則選擇允許。
此后按如下步驟完成驅動程序的編譯和替換:
(1)打開一個控制臺窗口,運行批處理程序:
C:\tornado2.2\host\x86-win32\bin\torVars.bat;
該批處理文件用于設置環境變量,其內容為:
rem Command line build environments
set WIND_HOST_TYPE=x86-win32
set WIND_BASE=C:\Tornado2.2
set PATH=%WIND_BASE%\host\%WIND_HOST_TYPE%\bin;%PATH%
如果沒有設置成功,可以手工設置這些環境變量。
(2)定位到C:\tornado2.2\target\src\drv\end目錄,運行:
make CPU=PENTIUM tool=gnu ln97xend.o
(3)定位到C:\tornado2.2\target\lib\pentium\PENTIUM\common目錄,并將上一步生成的文件ln97xend.o復制到此目錄下。備份此目錄下的文件libdrv.a;
(4)運行命令arpentium -d libdrv.a ln97xEnd.o,刪除libdrv.a中原有的ln97xEnd模塊;
(5)運行命令arpentium -ra iOlicomEnd.o libdrv.a ln97xEnd.o將我們剛剛創建的新ln97xEnd模塊添加進去。
我們要修改編譯VxWorks的配置頭文件Config.h中定義的一些參數,使編譯出來的系統引導程序和VxWorks的映象符合我們的要求;同時還要修改sysLn97xEnd.c這個文件,以使系統的網絡功能正常運行。
(1)定位目錄到C:\tornado2.2\target\config\pcPentium并打開該目錄下Config.h文件;
(2)查找到定義DEFAULT_BOOT_LINE宏的地方,修改預處理條件CPU == PENTIUM分支下的定義如下:
#define DEFAULT_BOOT_LINE \
"lnPci(0,0)your_host_name:d:\\vxWorks h=193.168.80.169 e=193.168.80.254 u=target pw=vxworks tn=target"
其中:
lnPci(0,0)指定了使用第0個網卡和第0個處理器,lnPci這個標識會因為使用的驅動程序不同而有所不同,但這里用lnPci就可以了;
host指定你的主機的名字,使用host就可以;
d:\\vxWorks指定了VxWorks映象下載的完整路徑(后面會有說明);
h=193.168.80.169是宿主機的IP地址,可以根據實際情況修改;
e=193.168.80.254是目標機的IP地址,可以根據實際情況修改;
u=target指定了FTP服務器的用戶名,這個FTP就是用來下載VxWorks映象的,后面還會提到;
pw=target是用戶名對應的口令;
tn=target指定目標機的名字,任意指定即可。
(3)指定網卡驅動程序
首先查找“Network driver options”這段文字,之后你可以看到在該注釋后面定義了一系列的有關網卡驅動的宏定義。注意保證INCLUDE_END和INCLUDE_LN_97X_END這兩個宏處于定義狀態(define),其他的宏都處于未定義狀態(undef),即:
/* Network driver options */
#define INCLUDE_END /* Enhanced Network Driver Support */
#undef INCLUDE_DEC21X40_END /* (END) DEC 21×4x PCI interface */
#undef INCLUDE_EL_3C90X_END /* (END) 3Com Fast EtherLink XL PCI */
#undef INCLUDE_ELT_3C509_END /* (END) 3Com EtherLink III interface */
#undef INCLUDE_ENE_END /* (END) Eagle/Novell NE2000 interface */
#undef INCLUDE_FEI_END /* (END) Intel 8255[7/8/9] PCI interface */
#undef INCLUDE_GEI8254X_END /* (END) Intel 82543/82544 PCI interface */
#define INCLUDE_LN_97X_END /* (END) AMD 79C97x PCI interface */
#undef INCLUDE_ULTRA_END /* (END) SMC Elite16 Ultra interface */
#undef INCLUDE_BSD /* BSD / Netif Driver Support (Deprecated) */
#undef INCLUDE_EEX /* (BSD) Intel EtherExpress interface */
#undef INCLUDE_EEX32 /* (BSD) Intel EtherExpress flash 32 */
#undef INCLUDE_ELC /* (BSD) SMC Elite16 interface */
#undef INCLUDE_ESMC /* (BSD) SMC 91c9x Ethernet interface */
(4)包含PC_CONSOLE
缺省情況下,VxWorks系統是不接受外部輸入設備(如鍵盤)的輸入,也不向外部輸出設備(如顯示器)輸出數據。為了便于調試,我們必須改變它的這種缺省狀態。我們查找定位宏INCLUDE_PC_CONSOLE,然后保證其處于定義狀態(define)即可,即:
#define INCLUDE_PC_CONSOLE /* PC keyboard and VGA console */
#ifdef INCLUDE_PC_CONSOLE
# define PC_CONSOLE (0) /* console number */
# define N_VIRTUAL_CONSOLES (2) /* shell / application */
#endif /* INCLUDE_PC_CONSOLE */
(5)修改sysLn97xEnd.c
打開C:\tornado2.2\target\config\pcPentium目錄下的sysLn97xEnd.c文件,先定位到“memory-mapped IO base”這段文字,然后將其前面的參數由pciRsrc[endUnit].bar[1]修改為NONE,保存即可,即:
sprintf (paramStr, paramTemplate,
endUnit, /* END unit number */
NONE, /* memory-mapped IO base */
pciRsrc[endUnit].bar[0], /* IO address space base */
PCI2DRAM_BASE_ADRS, /* host PCI mem. base */
pciRsrc[endUnit].irqvec, /* IRQ vector */
pciRsrc[endUnit].irq, /* IRQ number */
LN97X_CSR3_VALUE, /* csr3 register value */
LN97X_OFFS_VALUE, /* offset */
LN97X_RSVD_FLAGS, /* flags (reserved) */
&ln97xStrDesc[typeIdx] /* device description */
);
編譯Bootrom
打開Tornado開發工具,在Build菜單下選擇Build Boot ROM,選擇BSP為pcPentium,image類型為bootrom,工具為gnu,如圖8。點擊OK,Bootrom就會編譯。
style='width:254.25pt;height:154.5pt'>
o:title="" />
<!--[if !vml]--><!--[endif]-->
圖8 編譯bootrom
編譯VxWorks映像
編譯生成bootrom后,還要創建一個VxWorks映象(image),也就是VxWorks操作系統本身的代碼,步驟為:
(1)創建一個“bootable VxWorks image”的工程,BSP 選擇pcPentium;
style='width:357.75pt;height:271.5pt'>
o:title="" />
<!--[if !vml]--><!--[endif]-->
圖9 建立基于pcPentium BSP的VxWorks映像
(2)選擇需要的VxWorks組件
如圖10,在這個例子中我們需要包括兩個重要的組件:Telnet server 和 Target shell。前者使我們可以通過Telnet協議登錄到VxWorks操作系統中;后者則可以讓我們通過命令行控制VxWorks系統。另外,需要把所有C++相關的選項都包含進去。
style='width:201.75pt;height:298.5pt'>
o:title="" />
<!--[if !vml]--><!--[endif]-->
圖10 包括Telnet server和Target shell組件
完成選擇后,即可開始編譯程序。到此我們已經生成了VxWorks的系統引導程序和運行時的代碼映象。這里還要提醒讀者,在你每次修改完系統的配置信息(如:config.h)后,都要重新創建一個工程來編譯VxWorks映象,以免出現代碼不一致的問題。將生成的名為“vxworks”的文件(在你創建的工程的目錄下)復制到D:\VxWorks目錄下。這個路徑是由上面我們所設置的DEFAULT_BOOT_LINE宏中的路徑參數決定的,必須保持二者一致。
現在開始制作VxWorks系統引導磁盤,用于引導裝載VxWorks運行映象。定位目錄到C:\tornado2.2\target\config\pcPentium,插入您已經格式化好的軟盤,然后運行:
mkboot a: bootrom
該命令將在軟盤上建立VxWorks系統引導分區,并將引導程序復制到軟盤上。
這里的FTP服務器用于在系統成功引導后,下載VxWorks的運行時映象。我們這里使用Tornado開發環境自帶的FTP服務器。
如圖11,打開Tornado FTP Server,選擇“Security”菜單下的“Users/Rights”子菜單,創建User Name為“target”,修改“Home Directory”為D:\VxWorks目錄(此路徑由上面的DEFAULT_BOOT_LINE參數決定),同時修改口令為“target”,最后點擊“Done”按鈕完成修改。
style='width:291.75pt;height:140.25pt'>
o:title="" />
<!--[if !vml]--><!--[endif]-->
圖11 配置FTP服務器
為了便于調試,我們還要打開FTP Server的日志功能。選擇“Logging”菜單下的“Logging Options”子菜單,其中除了“Winsock Calls”外,讓其他選項全都處于開啟狀態。
保持FTP Server窗口處于打開狀態(這樣FTP服務器就處于運行狀態)。
虛擬機從軟盤啟動,接下來會下載服務器D:\vxworks映像,服務器的FTP會有相關的log,如圖12:
圖12 FTP服務器 id="_x0000_s1026" type="#_x0000_t75" style='position:absolute;left:0;
text-align:left;margin-left:9pt;margin-top:1.8pt;width:415.5pt;height:286.5pt;
z-index:-1;mso-position-horizontal-relative:text;
mso-position-vertical-relative:text' wrapcoords="-39 0 -39 21543 21600 21543 21600 0 -39 0"
o:allowoverlap="f">
o:title="Snap1" />
1. 啟動。 COLDFIRE5235復位后,CS0選通,做為啟動設備。CPU從地址0讀入兩個LONG字,第一個為SP,另一個為PC的值。所以在FLASH映像中,至少前面兩個LONG字必須存儲對應值。另外一個就時PC值,可以在一開始賦值時就給其一個在FLASH中的地址,如0XFFE00008。也可以賦一個以0為基址的偏移給PC,如0X00000008,不過這樣賦值的話,必須在接著的代碼中用JUMP語句調到以0XFFE00000為基址的FLASH空間中去。
2. 調試手段。 剛開始運行時,沒有其他手段,就需要使用LED點燈,或者使用自己定義的串口輸出函數來進行調試。不過要注意的是,在VXWORKS中初始化串口后,注意考慮自己定義的串口函數和系統之間的沖突。
]]>摘要 S3C44BOX固定的中斷管理模式與VxWorks的異常處理機制存在著沖突。本文分析VxWorks的異常處理機制后,提出一種解決方案,實現VxWorks在S3C44BOX上的BSP定制。該方案保留VxWorks原有的中斷處理機制,從而保證VxWorks移植后的穩定性和可靠性。
關鍵詞 VxWorks S3C44BoX BSP 中斷處理機制
引 言
VxWorks是現在所有獨立于處理器的實時系統中最具特色的操作系統之一。它支持的CPU包括:PowerPC、x86、MIPS、ARM等,其微內核Wind具有任務問切換時間短、中斷延遲小、網絡流量大等特點,是一個具有較高性能的標準嵌入式實時操作系統。此外,VxWorks操作系統還具有較好的可裁減性和易于移植等特點。
S3C44BOX是韓國Samsung公司出品的一款ARM(Advanced RISC Machines)微控制器,CPU核心為ARM7TDMI。S3C44BOX具有非常豐富的外圍資源,集成LCD控制器、12C總線控制器、I2S總線控制器、2個串口控制器、2個通用DMA(Direct Memory Access)控制器、8個10位ADC(Analog to Digital Converter)通道、71個通用I/O引腳等,大大減少了系統成本,是各種學習板和開發板的首選ARM芯片。
1 BSP概念
BSP(Board Support Packet,板級支持包)是介于底層硬件和上層軟件之間的底層軟件開發包,它的主要功能為屏蔽硬件,提供操作系統的驅動及硬件的驅動,具體功能包括:
◆目標機硬件初始化,主要是CPU的初始化,為整個軟件系統提供底層硬件支持;
◆為操作系統提供設備驅動程序和系統中斷服務程序;
◆定制操作系統的功能,為軟件系統提供一個實時多任務的運行環境。
2 VxWorks啟動流程
VxWorks的啟動涉及到兩個映像文件:Bootrom映像和VxWorks映像,其中每一類又可以再細分為壓縮、非壓縮、駐留ROM和非駐留ROM類型的映像。不同的映像對應的啟動流程也有所不同,但它們的基本流程是相同的,如表1所列。
[關鍵詞] PC104總線;VxWorks;集成開發環境Tornado;板載支持包BSP
1 引言
VxWorks是由美國的WindRiver推出的一種嵌入式強實時操作系統,它存在多任務調度的方式,可以管理多個外設,而且它可根據應用程序的需求對操作系統進行裁剪,最大程度的壓縮代碼,實現程序的優化。
Intelx86系列處理器的嵌入式應用一般是以PC104的形式出現的,PC104除包括PC/AT的所有標準功能外,它的CPU模塊還有一些獨特的優點:開發周期短、費用低、體積小、層疊連接、功耗小、模塊化、抗沖擊及震動能力強,工作及存儲溫度范圍寬、集成度高,可靠性高。
在PC/104總線設備上使用的數據存儲設備通常有硬盤和基于閃存技術的固態電子盤。由于嵌入式系統工作環境一般比較惡劣,硬盤在惡劣的震動條件下無法正常工作,而固態電子盤的工作范圍很寬,可以選擇相應環境下的器件(零下40℃到零上85℃),并且體積很小,適合嵌入式應用。本嵌入式系統中數據存儲設備采用了CE公司的CF(CompactFlash)卡,而在此軟硬件平臺上設計開發了嵌入式實時操作系統VxWorks的并基于PC104總線的板載支持包。
2 VxWorks板載支持包BSP設計
2.1 基于PC104總線設備的VxWorks操作系統映像開發
在實時操作系統VxWorks中,硬件抽象層是以板載支持包BSP的形式出現的。針對不同的處理器體系結構以及硬件環境設計不同的板載支持包,實時操作系統VxWorks就可以用于不同的硬件環境,大大減少了資源浪費。因為板載支持包同時具有硬件相關性和操作系統相關性,是一個介于硬件與軟件之間的軟件層次,包括了系統中的大部分與硬件相關的軟件模塊。VxWorks板載支持包BSP的設計概念使嵌入式實時操作系統VxWorks成為一個通用的嵌入式軟件開發包,使得相關的高層的嵌入式應用能夠有效地運行于特定的、應用相關的硬件設備之上,使嵌入式實時操作系統VxWorks的可移植性大大加強。
BSP與VxWorks操作系統的層次結構如下圖1所示:
圖1BSP與VxWorks操作系統的層次結構圖
基于PC104總線設備的VxWorks操作系統映像開發主要工作有3個方面:
①板載支持包設計與開發
VxWorks實時操作系統的板載支持包的開發通常提供一般模板程序,選擇一個相同處理器結構板載支持包進行設計。
②相關外圍硬件設備驅動程序
嵌入式系統是針對某一具體應用場合開發的專用系統,因此常常會使用到一些非標準的硬件設備,而VxWorks操作系統并不提供相關的外設驅動程序,使用時需自行開發相應的外設驅動程序。
③操作系統映像配置與生成
對VxWorks操作系統各個功能模塊進行配置,使其在滿足功能需求的條件下達到代碼量最小,同時也減少出錯的可能性。
2.2 BSP的基本功能及其啟動過程分析
VxWorks板級支持包BSP在功能上包含兩個部分:初始化和驅動程序支持。BSP提供了VxWorks同硬件環境的基本接口界面,并在上電時進行硬件初始化(包括中斷向量的初始化、定時器初始化、核心內存映象的加載等),支持VxWorks對硬件驅動的訪問,將VxWorks中軟件集成到一體,其功能相當于PC機的BIOS。
VxWorks內核的加載分為兩個步驟,第一個步驟是PCBIOS對bootrom的加載,第二個步驟是BSP引導映像bootrom對VxWorks操作系統映像加載。基本流程如下所示:
2.3 BSP中函數調用過程分析
BSP啟動操作系統的過程中,需要調用一列函數以完成對系統內存映像的加載,整個過程分析如下,RomInit函數初始化處理器,關閉高速緩存,關中斷,初始化內存。接著調用RomStart,把映像的數據段拷貝到RAM中去,然后調用usrInit()對Bss段清零,調用intVecBaseSet()設置矢量基地址表,調用excVecInt()初始化中斷以及異常的向量表,初始化系統硬件,調用usrKernelInit()初始化wind內核,最后執行流程執行到kernelInit(),kernelInit啟動wind內核。Wind內核的第一個任務是usrRoot它通過調用usrAppInit啟動用戶的任務,系統可真正啟動。
2.4 修改BSP設計概要
一般情況下,Tornado提供一些評估板的板載支持包,而PC104主機板是根據工作實際需要購買的,評估板的板載支持包不能夠直接使用,需要進行修改完善。可行的方法是:基于pc586的BSP作為模板進行適當修改,以滿足這款PC104主機板的特定硬件環境。
板載支持包通常存放在Tornado的安裝目錄下面,其路徑是Root/target/config/bspname,root代表tornado的安裝目錄。設計一個可用的新的板載支持包,必須對Tornado本身自帶板載支持包作一定的分析。pc586板載支持包主要包括一些C文件和一些匯編文件,它們是:config.h,configAll.h,Pc.h,sysLib.c,ctdt.c,sysNetif.c,mkboot.c。板載支持包的缺省配置是由configALL.h來確定的,用戶可通過config.h來改變缺省配置。缺省配置是按照處理器廠商的評估板外圍硬件進行系統配置,根據實際硬件環境,一般需要做一定的改動,通常會在config.h中進行,通過一系列的定義宏,完成系統配制工作。
要設計針對這個半物理仿真試驗的所選用的PC104主機板板載支持包,增加VxWorks對CF卡支持,需要做出較大改動的文件是config.h和configAll.h以及sysLib.c這3個文件,具體如下:
①在config/bspname/bspname.h中找到修改其CF卡的中斷號,因為一般中斷號0x9是預留給硬盤接口,為了避免產生中斷沖突,將#define ATA1_INT_LVL0x9,改為#define ATA1_INT_LVL0xf
②在config/bspname/sysLib.c中找到ATA_RESOURCEataResource[]={................PCMCIA................ }
修改為ATA_RESOURCEataResource[]={................IDE_LOCAL................. }
另外還需要改寫其他的參數,例如ATA1_CONFIG等。
③在config.h中,把#define SYS_WARM_ATA_CTRL 0改為#define SYS_WARM_ATA_CTRL 1這樣系統熱啟動后,就會從CF卡上的引導區上引導。
④在config.h中將#define SYS_WARM_TYPE SYS_WARM_FD/*warmstartdevice*/改為#define SYS_WARM_TYPESYS_WARM_ATA
⑤修改ataType數組使它和所選的CF卡的幾何參數(磁道,扇區,柱面等)相等。
將原來的ataTypes數組ATA_TYPEataTypes[ATA_MAX_CTRLS] [ATA_MAX_DRIVES]= {................{{761,8,39,512,0xff},/*ctrl1drive0*/...............};
改為ATA_TYPE ataTypes [ATA_MAX_CTRLS] [ATA_MAX_DRIVES]= {................{{984,16,4,512,0xff},/*ctrl1drive0*/...............};
這個參數可以在主機板的BIOS中查找到,進入BIOS后使用idedetection就可以查看到CF卡幾何參數,根據查到CF卡的幾何參數,就可以在sysLib.c中做出相應的修改。
2.5 BSP的調試
針對板載支持包的設計開發,VxWorks并沒有提供了非常好的調試手段,這樣就給調試BSP帶來的很大困難。所以在對BSP進行調試之前,盡量減少代碼量,通過改寫BSP目錄下Makefile來去除不需要的代碼編譯,然后再對BSP調試。調試的方式一般采用閃燈的方式,通過在有疑問的代碼之間插入閃燈的代碼,通過對I/O端口的可視LED訪問,觀察燈是否閃亮來判斷BSP的執行流程。
3 結束語
通過多次試驗的調試,最終設計出了基于PC104總線的VxWorks板載支持包。并應用于某型飛機燃油系統的智能化管理,實踐結果表明,這種方法是一種切實可行的方案。
從該設備的概要開始.指出該驅動實現整個設備的部分還是全部細節.
描述所有該設備的操作模式,指出該驅動所實現的是哪種.
寫出該設備在BSP中創建和初始化的步驟.寫出可把該驅動定制為特殊硬件環境的所有宏(macros).
寫出所有可幫助用戶理解該設備如何工作和設備的接口.
模板概要:
這是一個串口驅動模板.可用來作為寫Vxworks5.3或更新版本的新驅動的起點.
這些驅動支持舊串口驅動沒有的新功能,首先,它們提供一個設置硬件選項的接口;
例如,停止位數,數據位,奇偶,等等.
其次,它們提供可用來提供串口線上的外部模式調試(如,ROM監視器調試)的輪巡通訊(polled communication)接口.通常只支持異步模式驅動. 貫穿整個文件,單詞"template"用來替換一個真實的設備名,按慣例采用廠商名的第一個字母加產品編號.例如,Zilog 8530 串口設備應一個名為Z8530——DUSAART
數據結構,好過TEMPLATE_DUSART.
數據結構
設備數據結構在文件 h/drv/sio/templateSio.h里定義。一個數據結構——TEMPLATE_CHAN被定義,為每個通道。具有多串口通道的設備也為整個芯片定義了一個數據結構.例如,此驅動有一個芯片級的,有兩個通道結構作為成員數據結構叫TEMPLATE_DUSART。
回調
傳輸準備就緒(transmitter ready)中斷調用服務采用回調至高層庫以獲得一個字符來傳送。 默認地,此驅動安裝不做任何事情的傀儡回調程序。使用此驅動的高層庫(例如,ttyDrv)將用SIO_INSTALL_CALLBACK控制命令(ioctl command)安裝自己的回調程序. 同樣,一個接受中斷處理采用回調來將字符傳給高層庫。
模式
理想模式下該驅動應支持輪巡和中斷模式,并可動態切換模式。但這并非必須。Vxworks可支持此設備上的tty設備,即使該驅動只支持
中斷模式.
增加動態模式切換允許當信息送至時將外部代理激活(例如,在第一楨時中斷). 對允許動態模式切換的驅動,注意驅動將在其輸入ISR中間被要求切換模式.一個驅動的輸入ISR看起來應如此: inChar = *pDev->dr;/@ 從數據寄存器里讀一個字符 @/ *pDev->cr = GOT_IT;/@ 承認中斷@/ pDev->putRcvChar (...);/@ 發送字符到高層 @/ /@ give the character to the higher layer @/ 如果該通道用作外部模式調試的通訊路徑,且接收的該字符是"幀結束"字符,則代理的回調會鎖定中斷,切換設備到輪巡模式,并使用輪巡模式下的設備片刻.此后代理會解鎖中斷,切換模式到中斷模式,并返回ISR. 特別地,回調能使兩模式切換,首先到輪巡模式然后到中斷模式,后返回. 這要求小心處理中斷處理內的回調。例如,在調用回調前你必須先承認中斷。
用法:
該驅動通常為BSP調用.該模塊里直接調用程序是 templateDevInit(), templateDevInit2(),templateIntRcv(), templateIntTx(), and templateIntErr(). BSP調用templateDevInit()來初始化或重啟芯片.它用intConnect()連接中斷處理(templateIntRcv, templateIntTx,和 templateIntErr). 連接中斷處理后,BSP調用templateDevInit2()來告訴驅動中斷模式操作已可行.
BSP: 按常規所有BSP特定的串口初始化在sysSerial.c(被sysLib.c包含)里進行, sysSerial.c實現至少4個函數:sysSerialHwInit(),sysSerialHwInit2(), sysSerialChanGet(),和sysSerialReset(),如下工作: sysSerialHwInit被sysHwInit調用來初始化串口設備.此程序將在調用能復位設備及安裝驅動函數指針的templateDevinit前初始化TEMPLATE_DUSART結構的所有板特定的區域(如,寄存器的I/O地址,等等).sysSerialHwInit還將執其他所有串口驅動所需要的過程,比如適當配置板上的中斷控制器. sysSerialHwInit2被sysHwInit2調用來用intConnect連接驅動的中斷處理.連接好中斷處理后,templateDevInit2的調用允許中斷模式操作開始. sysSerialChanGet被usrRoot調用來取得與串口通道號相關的串口通描述.該程序使用一個0-NUM_TTY之間的一個數為單一的參數.它返回一個指向相應通道描述——SIO_CHAN * 的指針,它正好是TEMPLATE_CHAN結構的地址. sysSerialReset被sysToMonitor()調用且會復位串口設備到一個不活動的狀態. 該驅動可通過重定義TEMPLATE_REG_READ和TEMPLATE_REG_WRITE宏來定制.這兩個宏用來訪問實際的芯片.如不定義,源代碼會假定用對所有寄存的read/write訪問來對設備進行簡單內存映射.
測試:
中斷驅動接口可用通常方法來測試.當它(測試信息,譯者如是猜測)來到時Vxworks打印到串口控制臺,于是看到加電后VxWorks輸出表示該驅動基本開始工作. VxWorks的Portkit測試也可用來進行更嚴格的測試. 輪巡接口容易被檢驗——你可調用通道的SIO_MODE_SET ioctllai使它進入輪巡模式.注意通常的打印工具不能在輪巡模式下與串口通道一起工作.一些代理必須執行輪巡循環來處理基于字符的字符輸入/輸出.這不是自動進行.當切換WDB串口線到輪巡模式時,WDB代理執行它自己的輪巡循環. 動態模式切換可用tornado工具來檢查.重新配置代理使用WDB_COMM_UDLP_SLIP通訊路徑(詳見VxWorks run_time Guide的配置章節). 如下開始wtxtcl %wtxtcl 從tcl提示符,連接到target server: wtxtcl.ex> wtxToolAttach 通知代理來轉換外部模式檢查回應是OK(0). wtxtcl.ex>wtxAgentModeSet 2 0 要求代理掛起系統(請求會以中斷模式傳到,但回應會以輪巡模式被傳送): wtxtcl.ex>wtxContextSuspend 0 0 0 在此時目標將被掛起.控制臺將顯示凍結(果板卡有一個控制臺設備),你不能"ping"目標的網絡接口.
恢復目標:
wtxtcl.ex>wtxContextResume 0 0 0 現在目標將重新運行,于是你能敲信息到控制臺(如果板卡有一個控制臺設備)并可從主機"ping"目標的網絡接口.
vxworks下bsp制作教程
1 vxworks概述
vxworks是WIND RIVER公司的產品。作為一種商用的嵌入式操作系統?vxworks擁有強大的功能和友好的用戶界面。與免費的嵌入式操作系統相比?商用操作系統經過嚴格的測試?具有良好的實時性?易用性和大量的文檔支持?但是它的源碼是不公開的并且價格昂貴;免費的嵌入式操作系統有很多?大都是linux的移植?公開源代碼?但缺乏文檔?要對照源碼進行開發。
2 BSP的流程
BSP流程分成兩部分。首先是位于BootRom中的Boot代碼?它的作用是實現配置硬件和啟動vxworks下載程序。接下來是下載后跳轉到vxworks的入口地址運行操作系統和應用程序。
流程入圖:
ROM中的啟動代碼部分:RomInit在文件在文件romInit.s中。它是運行的開始?實現這一部分是首先的。它實現判斷啟動類型?配置內核和非內核寄存器以及內存和外圍設備的讀寫時序?因此可以在此處加入內存檢測功能。在BSP中無法進行調試?只能通過閃燈實現云信正確與否的判斷。閃燈功能函數也要在此加入。判斷啟動類型和配置寄存器?這一部分不需要改動。配置內存和外圍設備讀寫時序?要進行改動。這一部分的SDRAM?ROM?FLASH?FPGA有相應的模板可以參考。它的實現是通過使用宏定義來實現的。但是要改動的話也不難?一般是改動空間大小的屏蔽位?讀寫位數?以及片選寄存器OR和BR。至于特殊外設的讀寫有待討論。內存檢測在這里實現較復雜?它根據相應的內存檢測算法實現。主要是對地址線和數據線的檢測。通過寫入數據再會讀出數據來判斷。使用"走步1"和"走步0"
算法。這一部分較多的依賴硬件?可移植性較差?根據自己的單板改動。閃燈在這一部分是強烈推薦的。因為閃燈才能定位程序的運行位置。閃燈函數可移植?一般要改動?因為燈可能接在不同的I/O口上。另外注意860SAR的PORT B是32位的。具體的端口見相應的CPU的I/O口的參數?配置相應的寄存器。
RomInit在函數結尾跳入RomStart。
RomStart在BootInt.c文件中。它是系統運行的第一個C函數。這一部分是Wind River公司提供的標準程序?一般不需改動。該函數是C的入口函數,由匯編程序調用,主要完成清內存,將ROM中的程序拷貝到RAM,解壓并跳至解壓后的程序處運行。UsrInit在BootConfig.c文件中。它主要是實現硬件的初始化。其中涉及到串口?網口的初始化?CONSOLE的配置等。其中串口和網口的配置BSP的重要部分?但860CPU對串口和王口有很好的支持?只要做很小的改動即可?串口很簡單?網口較復雜一些。UsrRoot在BootConfig.c文件中。它主要是實現vxworks文件的下載?并且跳轉到vxworks的入口地址。從而進入到操作系統中去。
VXWORKS文件中的代碼部分:
SysInit在sysAlib.s中。它是vxworks的啟動代碼。它與RomInit的作用相同?對于這個文件?我們一般不需要去改動它。UsrInit在Usrconfig.c中。它的作用與Boot中的UsrInit的作用相同?他們都調用SysLib.c中的子函數。實現相同的硬件初始化功能。UsrRoot在UsrConfig.c中。它的作用與Boot中的UsrRoot的作用類似。但是這里的UsrRoot是最終進入到應用程序中去。
1 系統結構及工作原理
1.1 系統組成及特點
整個通信平臺由語音通信處理主板和語音采集回放子板組成。語音通信處理主板包括CPU MPC860、FLASH存儲器、SDRAM存儲器、10/100Mb/s網絡接口、RS 232串口、BDM調試接口、Console接口、供電和復位電路及120pin連接器。通信處理主板的核心MPC860是Motorola公司的一款由MC68360演變而來的通用單片集成嵌入式微處理器,適用于通信和網絡系統。該微處理器內部有兩個處理器:PowerPC和32位RISC處理器。PowerPC核同內存管理單元(MMU)、指令和數據Cache一同處理高層次應用,CPM則負責完成低層數據通信。兩個處理器主要通過共享內存交互。通信處理模塊利用SCC,SMC,SPI和I2C串行通道與外部設備通信,其中SCC和SMC支持時分復用。設計中,SCC工作在QMC協議Trans-parent Mode。通信處理模塊(CPM)新增了數字信號處理(DSP)功能。語音采集回放子板由語音采集電路、語音回放電路、基于FPGA實現的通信控制器和與語音通信處理主板連接的120pin連接器組成。
由于MPC860的數據傳輸速度相比ADC和DAC要快很多,設計相應的邏輯電路控制語音的采集和回放、協調MPC860和數據采集、回放電路之間的通信是保證系統正常工作的關鍵。文中設計了基于Altera公司的CycloneⅡEP2C8芯片實現的通信控制器來解決這一問題。
將通信平臺分為語音通信處理主板和語音采集回放子板分別設計實現,是為了降低系統開發難度和便于系統維護、升級和擴展。例如語音通信處理主板無需改動即可利用已有的連接器、FEC網絡接口和SDRAM存儲器等資源與視頻編解碼芯片、視頻壓縮/解壓縮芯片組成網絡視頻服務器。
1.2 功能結構和工作原理
語音通信處理主板的功能結構如圖1所示。
系統上電后,語音通信處理主板復位電路產生復位信號,MPC860接收到復位信號后,跳轉到0X100處開始執行啟動代碼。按照BSP配置逐步執行CPU初始化、板上其他硬件電路的初始化、操作系統運行所需數據結構的初始化、啟動VxWorks WIND內核、創建UserRoot任務、初始化系統中用到的可選擴展模塊(如I/O系統、文件系統、網絡協議等)、創建任務usrAppInit(),此時語音通信平臺準備就緒,可以執行語音通信任務。采集板的功能結構如圖2所示,語音通信處理主板啟動完畢后,語音采集回放子板可在通信控制器控制下采集和回放語音,并對語音數據進行壓縮編解碼和IP封裝、解封裝處理。
1.3 數據處理流程
MPC860T和ADC AD7825,DAC AD7305之間的通信由通信控制器控制。通信控制器由數據緩沖區(Rx FIFO,Tx FIFO),基于FSM(有限狀態機)實現的控制邏輯(Rx control,Tx control)和8位串并、并串轉換器,時鐘電路組成。其數據接收過程為:接收控制邏輯(Rx control)控制ADC AD7825將各個通道的語音數字化,并把轉換結果存入接收緩沖區(Rx FIFO),直至Rx FIFO滿時Rx control開始向MPC860T提供周期性幀同步信號,頻率為32 kHz。MPC860在幀同步信號和時鐘信號的驅動下讀取Rx FIFO中的數據到SCC數據接收緩沖區。Rx FIFO讀空(即讀指針追上了寫指針)后,Rx control停止向MPC860發送幀同步信號終止數據傳輸,同時向MPC860發送中斷信號IRQ3,MPC860響應中斷把數據從接收緩沖區讀到接收ring buffer中等待應用程序處理。其數據發送過程為:MPC860完成IP解封裝、解壓縮后的語音數據將會在檢測到發送緩沖區可用時,輸出到SCC發送緩沖區,通信控制器提供發送幀同步信號驅動數據傳輸到Tx FIFO(發送緩沖區),待到Tx FIFO滿時停止發送幀同步信號。數據發送完后,CPM會清零,TxBD)中的R位表示MPC860可向SCC發送緩沖區中裝入新的數據,為下次傳輸做準備。
1.4 QMC通信協議
多通道控制器(QUICC Multichannel Controler,QMC)是為了實現時分復用數據傳輸而設計的,它可以把時分復用幀的數據分發到多達64個邏輯通道。該模式下把每一幀的數據劃分成若干個時隙(Timeslots),每時隙8 b。在時隙分配表中規定每時隙數據從屬于某個通道,每個通道都有一組特定的緩沖區描述符和相應的緩沖區。一個時隙的數據在收發時被放置在特定的緩沖區里,MPC860T就可把分散的數據聚集在一起發送,或把聚集在一起的數據分發到各自專用的緩沖區,而不需要額外的處理來區分各種各樣的數據流。
2 BSP 設計實現
設計中軟件開發主要包括啟動代碼的編寫、操作系統的移植、硬件驅動程序和語音編、解碼和IP封裝、解封裝應用程序。篇幅有限,本文僅介紹BSP移植。BSP即板級支持包,其功能為硬件、軟件初始化、工程影像的下載和設備驅動等。
2.1 BSP的定制
無論是BootRom還是VxWorks都要使用BSP代碼,BSP定制需要根據硬板配置、系統設計需求、軟件功能等實際情況。實際開發過程中,為了縮短產品開發周期,通常以WINDRIVER公司的BSP模板或者第三方公司提供的可供參考的BSP為基礎,根據軟硬件具體配置進行修改,添加新的程序驅動新增硬件和功能。本課題中先把APC860開發板的BSPMPC860TEVB拷貝到installdir:\Tornado\target\collfig\ppcs860目錄下,主要做下列修改。
2.1.1 config.h文件
根據實際情況,需要修改啟動行,內存地址、容量等配置,修改部分代碼如下:
2.1.2 makefile文件的修改
makefile文件的修改,部分程序如下:
當前普遍使用的DSP語音處理技術只能對語音進行簡單處理,不能適應語音業務的多樣化趨勢。本文介紹利用MPC860和VxWorks實現綜合語音通信平臺,支持多板卡、多路語音實時傳輸,可擴展多路語音共聽功能。利用MPC860的通信和信號處理功能,且Vx-Works具有占用空間小、執行效率高、方便進行個性化定制和較好的兼容性等特點,所以該綜合語音通信平臺在功能、硬件結構、體積、功耗以及靈活性上具有較大優勢。
在設計中盡量采用嵌入式開發中的常用器件,以便稍加改動即可應用于其他設計。可以根據實際需要更改系統中語音通道的數目和擴展多路語音共聽功能等。
1 系統結構及工作原理
1.1 系統組成及特點
整個通信平臺由語音通信處理主板和語音采集回放子板組成。語音通信處理主板包括CPU MPC860、FLASH存儲器、SDRAM存儲器、10/100Mb/s網絡接口、RS 232串口、BDM調試接口、Console接口、供電和復位電路及120pin連接器。通信處理主板的核心MPC860是Motorola公司的一款由MC68360演變而來的通用單片集成嵌入式微處理器,適用于通信和網絡系統。該微處理器內部有兩個處理器:PowerPC和32位RISC處理器。PowerPC核同內存管理單元(MMU)、指令和數據Cache一同處理高層次應用,CPM則負責完成低層數據通信。兩個處理器主要通過共享內存交互。通信處理模塊利用SCC,SMC,SPI和I2C串行通道與外部設備通信,其中SCC和SMC支持時分復用。設計中,SCC工作在QMC協議Trans-parent Mode。通信處理模塊(CPM)新增了數字信號處理(DSP)功能。語音采集回放子板由語音采集電路、語音回放電路、基于FPGA實現的通信控制器和與語音通信處理主板連接的120pin連接器組成。
由于MPC860的數據傳輸速度相比ADC和DAC要快很多,設計相應的邏輯電路控制語音的采集和回放、協調MPC860和數據采集、回放電路之間的通信是保證系統正常工作的關鍵。文中設計了基于Altera公司的CycloneⅡEP2C8芯片實現的通信控制器來解決這一問題。
將通信平臺分為語音通信處理主板和語音采集回放子板分別設計實現,是為了降低系統開發難度和便于系統維護、升級和擴展。例如語音通信處理主板無需改動即可利用已有的連接器、FEC網絡接口和SDRAM存儲器等資源與視頻編解碼芯片、視頻壓縮/解壓縮芯片組成網絡視頻服務器。
1.2 功能結構和工作原理
語音通信處理主板的功能結構如圖1所示。
系統上電后,語音通信處理主板復位電路產生復位信號,MPC860接收到復位信號后,跳轉到0X100處開始執行啟動代碼。按照BSP配置逐步執行CPU初始化、板上其他硬件電路的初始化、操作系統運行所需數據結構的初始化、啟動VxWorks WIND內核、創建UserRoot任務、初始化系統中用到的可選擴展模塊(如I/O系統、文件系統、網絡協議等)、創建任務usrAppInit(),此時語音通信平臺準備就緒,可以執行語音通信任務。采集板的功能結構如圖2所示,語音通信處理主板啟動完畢后,語音采集回放子板可在通信控制器控制下采集和回放語音,并對語音數據進行壓縮編解碼和IP封裝、解封裝處理。
1.3 數據處理流程
MPC860T和ADC AD7825,DAC AD7305之間的通信由通信控制器控制。通信控制器由數據緩沖區(Rx FIFO,Tx FIFO),基于FSM(有限狀態機)實現的控制邏輯(Rx control,Tx control)和8位串并、并串轉換器,時鐘電路組成。其數據接收過程為:接收控制邏輯(Rx control)控制ADC AD7825將各個通道的語音數字化,并把轉換結果存入接收緩沖區(Rx FIFO),直至Rx FIFO滿時Rx control開始向MPC860T提供周期性幀同步信號,頻率為32 kHz。MPC860在幀同步信號和時鐘信號的驅動下讀取Rx FIFO中的數據到SCC數據接收緩沖區。Rx FIFO讀空(即讀指針追上了寫指針)后,Rx control停止向MPC860發送幀同步信號終止數據傳輸,同時向MPC860發送中斷信號IRQ3,MPC860響應中斷把數據從接收緩沖區讀到接收ring buffer中等待應用程序處理。其數據發送過程為:MPC860完成IP解封裝、解壓縮后的語音數據將會在檢測到發送緩沖區可用時,輸出到SCC發送緩沖區,通信控制器提供發送幀同步信號驅動數據傳輸到Tx FIFO(發送緩沖區),待到Tx FIFO滿時停止發送幀同步信號。數據發送完后,CPM會清零,TxBD)中的R位表示MPC860可向SCC發送緩沖區中裝入新的數據,為下次傳輸做準備。
1.4 QMC通信協議
多通道控制器(QUICC Multichannel Controler,QMC)是為了實現時分復用數據傳輸而設計的,它可以把時分復用幀的數據分發到多達64個邏輯通道。該模式下把每一幀的數據劃分成若干個時隙(Timeslots),每時隙8 b。在時隙分配表中規定每時隙數據從屬于某個通道,每個通道都有一組特定的緩沖區描述符和相應的緩沖區。一個時隙的數據在收發時被放置在特定的緩沖區里,MPC860T就可把分散的數據*在一起發送,或把*在一起的數據分發到各自專用的緩沖區,而不需要額外的處理來區分各種各樣的數據流。
2 BSP 設計實現
設計中軟件開發主要包括啟動代碼的編寫、操作系統的移植、硬件驅動程序和語音編、解碼和IP封裝、解封裝應用程序。篇幅有限,本文僅介紹BSP移植。BSP即板級支持包,其功能為硬件、軟件初始化、工程影像的下載和設備驅動等。
2.1 BSP的定制
無論是BootRom還是VxWorks都要使用BSP代碼,BSP定制需要根據硬板配置、系統設計需求、軟件功能等實際情況。實際開發過程中,為了縮短產品開發周期,通常以WINDRIVER公司的BSP模板或者第三方公司提供的可供參考的BSP為基礎,根據軟硬件具體配置進行修改,添加新的程序驅動新增硬件和功能。本課題中先把APC860開發板的BSPMPC860TEVB拷貝到installdir:\Tornado\target\collfig\ppcs860目錄下,主要做下列修改。
2.1.1 config.h文件
根據實際情況,需要修改啟動行,內存地址、容量等配置,修改部分代碼如下:
2.1.2 makefile文件的修改
makefile文件的修改,部分程序如下:
2.1.3 romInit文件修改
romlnit.s模塊包含了VxWorks在ROM中的入口點romlnit(),它是單板上電以后最先執行的匯編程序代碼。該函數功能包括處理器的復位、內存的初始化以及其他的最基本和必要的初始化工作。需要修改的內容如下:
內部存儲器映射寄存器IMMR。該寄存器用來標識內部地址空間的基址,將該寄存器設置為“FF000000”。
SIU模式配置寄存器SIUMCR。包括有外部總線仲裁器配置,外部master的支持,DEBUG調試端口配置,系統接口引腳配置以及奇偶校驗支持,將該寄存器設置為“00E10000”。
BSP中討論SDRAM的初始化過程,首先對MAMR寄存器的初始化,再得到UPM的RAM陣列表的地址,然后將RAM陣列表地址中的值寫入MPC860 RAM WORDS ARRAY中,最后初始化OR以及BR寄存器。
2.1.4 ppcs860.h
ppcs860.h是參數配置頭文件,該文件包含大量宏定義,為使MPC860T正常運行且SCC串口工作在QMC協議透明模式,根據實際需要做了如下配置:
(1)修改系統常量對應的宏定義:SCCx參數在雙端口RAM中存儲的起始地址、緩沖區描述符(BD)的基地址、緩沖區和BD的數目等;
(2)串口和時隙分配表的初始化,主要包括時隙分配、引腳分配等,通過設置SI RAM參數,規定了每個邏輯通道對應的時隙和數據路由,本系統中選擇SCC2和TDMB接口實現QMC通信,引腳配置如下:
PC6 RSYNC,PA2 RXC,PA10 RXD,PA0 TXC。PA11 TXD
(3)SCC2初始化:設置SCC2工作在QMC模式;
(4)QMC全局參數初始化:MCBASE(多通道基地址指針),初始化為SCC2對應外部BD表的基地址,MRBLR(最大接收緩沖區長度),接收、發送時隙分配表起始地址的指針(Rx S PTR,Tx S PTR),接收、發送時隙分配表當前時隙的指針(Rx PTR,TxPTR),中斷循環表基地址(INTBASE),中斷循環表下一可用入口的指針(INTPTR)等;
(5)QMC特定通道參數初始化:TBASE,RBASE(該邏輯通道的緩沖區描述符的起始地址),TBPTR,RBPTR(當前發送、接收緩沖區描述符指針),TMR-BLR(最大接收幀長度)等。
2.1.5 驅動程序
驅動程序直接對硬件操作,實現硬件和操作系統、應用程序之間的交互。需要自行編寫MPC860 SCC串口驅動程序ppcs860QmcSio.c,通信平臺中SCC工作在QMC Transparent模式。ppcs860QmcSio.c文件中包含SIO_DRV_FUNCS結構體中定義的5個函數和中斷處理函數ppc860QmcInt()、Qmc邏輯通道復位函數ppc860QmcChannelReset()。ppc860SccIoctl()提供了一些設備控制選項,包括停止數據傳送、察看當前通信狀態(空閑還是忙)、輪詢或中斷模式選擇等;ppc860sccInt()處理QMC通道的中斷請求,通過中斷方式實現數據的收發功能;ppc860SccStartuP()函數啟動一個發送周期;ppc860SccCallbackInstall()安裝回調函數。中斷處理函數的功能有:
(1)提供接收、發送中斷處理函數,調用回調函數完成設備和較高層協議之間的數據傳送。
(2)處理數據接收過程中出現的接收數據過長,數據傳送被迫終止等異常。由于不需要QMC的輪詢模式,因此ppc860SccPollInput()和ppc860SccPollOutput()以NULL函數的形式實現。同時還要編寫sysSccSeri-al.c文件,修改sysLib.c文件和usrConfig.c文件。在sysSccQmc.c中提供SCC設備描述符的初始化例程、SCC中斷連接例程等;通過修改sysLib.c和usrCon-fig.c文件以實現VxWorks對QMC驅動程序的調用和QMC驅動程序與TTY系統的掛接。
2.1.6 通道中斷處理過程
數據收發的核心是中斷處理函數。QMC中的所有邏輯通道共享SCC2的中斷,SCC2維持有一個全局中斷表,表中每一項里面都含有邏輯通道號和中斷源,可以被驅動識別以處理不同情況下出現的事件。中斷發生時,驅動從SCCE寄存器里面判斷全局中斷源,如果中斷是由邏輯通道引起,中斷服務程序便查找全局中斷表以找到該邏輯通道,并從中斷條目里面檢查中斷信息以確定是什么類型,再調用相應的收發和錯誤處理函數。
2.1.7 數據接收和發送
多通道語音通信系統中MPC860T SCC串口時分復用即工作在QMC模式,邏輯通道的通信協議為Trasparent mode,該協議僅傳輸二進制數據,不對數據流進行位級操作,不區分數據幀中的格式位、起止位和數據位等,不對接收的數據做檢錯處理,因而具有較高的數據傳輸速率。
接收函數由中斷服務例程調用。由于是每接收一幀產生一次中斷,故接收函數也每次處理一幀的數據。數據的接收由接收描述符RxBD控制。當要接收數據時,接收函數首先需要確定RxBD有效;確定沒有問題后,才將數據從接收緩沖區拷貝到接收Ring buffer,并復位RxBD;否則在進行相應錯誤處理后復位RxBD。接收函數流程如圖3所示。
數據發送不調用中斷處理函數,發送函數檢測到發送緩沖區可用(即TxBD中R位為1)后,調用回調函數將數據從發送Ring buffer拷貝到串口發送緩沖區(Txbuffer)。這里為發送功能開辟足夠大的環形緩沖區(足以容納應用程序每一幀的數據)。發送函數流程如圖4所示。
2.2 BSP調試方法和遇到的問題
2.2.1 調試方法
開發調試有兩種方法,一種是使用仿真器通過BDM(后端調試模式)一步步地跟蹤調試,另一種是通過點燈的方式進行所謂的“黑”調。“黑”調的方法是通過“燈”閃、用示波器測片選等,根據外部現象和所編的測試代碼進行比較分析來調試程序。進行“黑”調的目的是調通信串口部分代碼,宿主機可以通過串口與目標機的通信,然后再調試其他部分。調試流程分成兩部分。首先是預內核啟動代碼(Pre-Kernel Initializa-tion),待最小內核啟動正常后再添加I/O系統、文件系統、網絡系統等組件和調試應用程序。使用仿真器Vi-sion Probe通過BDM方式調試BSP并將BootRom映像燒入FLASH。
2.2.2 調試中遇到的問題
(1)系統無法正常復位
在調試過程中,發現MPC860T的CLKOUT引腳無輸出信號,系統上電復位過程沒有完成,系統無法正常工作。初步判斷是硬件問題。用萬用表和示波器逐步檢查上電復位、硬件復位、軟件復位、時鐘輸入和BDM調試等模塊電路,發現正常。判斷是BGA焊接出現問題,將芯片取下,重新焊接,系統復位正常,時鐘信號輸出穩定正常。
(2)網絡無法與外界通信
100 Mb/s快速以太網驅動加載中,網絡層協議無法運行,目標板無法與外界網絡建立聯系。目標板網絡啟動時發出的MAC地址信息幀外界無法收到。通過仿真器發現程序單步運行正常。經過反復試驗和測試,最終發現因SDRAM初始化程序沒有運行導致程序運行(需要SDRAM支持突發模式)出錯。更改調試方式,將BootRom開始的所有程序燒入FLASH,上電啟動,網絡正常,目標板與外界建立良好的網絡通信。
3 結 語
該系統在實際測試中話音質量穩定,測試時聲音清晰,沒有串擾和雜音,沒有較大延遲,說明硬件設計正確完備,QMC驅動程序和語音編解碼和IP封裝與解封裝應用程序性能優良。
如果板卡上語音通道更多,則每幀的時隙增多、長度增大,因為FPGA內部電路所提供的的幀同步信號周期并不改變,所以只是實際數據傳輸速率提高,可以保證各路語音的同步和實時性。系統中QMC工作在Transparent Mode限制了它的應用范圍,如何改進使系統支持多種通信協議是需要進一步研究的問題。
]]>1 引言
VxWorks是由美國的WindRiver推出的一種嵌入式強實時操作系統,它存在多任務調度的方式,可以管理多個外設,而且它可根據應用程序的需求對操作系統進行裁剪,最大程度的壓縮代碼,實現程序的優化。
Intelx86系列處理器的嵌入式應用一般是以PC104的形式出現的,PC104除包括PC/AT的所有標準功能外,它的CPU模塊還有一些獨特的優點:開發周期短、費用低、體積小、層疊連接、功耗小、模塊化、抗沖擊及震動能力強,工作及存儲溫度范圍寬、集成度高,可靠性高。
在PC/104總線設備上使用的數據存儲設備通常有硬盤和基于閃存技術的固態電子盤。由于嵌入式系統工作環境一般比較惡劣,硬盤在惡劣的震動條件下無法正常工作,而固態電子盤的工作范圍很寬,可以選擇相應環境下的器件(零下40℃到零上85℃),并且體積很小,適合嵌入式應用。本嵌入式系統中數據存儲設備采用了CE公司的CF(CompactFlash)卡,而在此軟硬件平臺上設計開發了嵌入式實時操作系統VxWorks的并基于PC104總線的板載支持包。
]]>
系統image的生成,image的種類,image的download下載過程,系統的啟動順序和過程,調試環境的配置及遠端調試的方式和方法,相應BSP設置文件的修改(網絡,串口..),BSP各文件的組成和作用.
要對系統底層驅動清楚,也就是對CPU及相關的硬件有所了解.主要是32微處理器(上電啟動過程, download image的方式方法,讀寫ROM,地址空間分配,MMU,寄存器,中斷定義,..).參照硬件資料,多讀一些源碼會有所幫助.
Tornado 2 開發調試環境協議框圖
主機開發(Host Development System)
目標機(Target System)Tornado 工具
WTX協議通信<==========>
Target Server
|
WDB協議通信
<==========>
兩個主要兩個協議
WTX協議(Wind River Tool eXchange): 用于開發機內部Tornado工具與Target Server之間通信.
WDB協議(Wind DeBug): 用于主機Target Server與目標機之間的通信.
一.基本概念
BSP定義:
Provides VxWorks with primary interface to hardware environment.
作用:
在通電后,初始化硬件.
支持VxWorks和硬件驅動通信.
使hardware-dependent 和 hardware-independent在VxWorks系統中很好的結合.
主要BSP主要文件目錄的組成及主要文件的作用:
目錄target/config/All:
這個目錄下的文件
是所有BSP文件共享的,不是特別需要不要更改里面的任何文件.
configAll.h:
缺省定義了所有VxWorks的設置.如果不用缺省的設置,可在BSP目錄下的config.h文件中用#define或#undef方式來更改設置.
bootInit.c:
在romInit.s后,完成Boot ROM的第二步初始化.程序從romInit.s中的romInit()跳到這個文件中的romStart().來執行必要的解壓和ROM image的放置.
bootConfig.c: 完成Boot ROM image的初始化和控制.
usrConfig.c: VxWorks image的初始化代碼.
目錄target/config/comps/src:
涉及系統核心的components,主要由target/config/All中usrConfig.c中函數調用
目錄target/config/bspname:
包含系統或硬件相關的BSP文件.
Makefile
一些命令行控制images的生成,參見 BSP設置部分及生成下載
README
BSP發布紀錄,版本,總的文檔
config.h
包括所有涉及CPU主板的設置及定義(includes,definations),參見 BSP設置文件及生成下載
configNet.h
網絡驅動的主要設置文件,主要對END驅動設置.
romInit.s
匯編語言文件,是VxWorks Boot ROM和ROM based image的入口,參見 系統啟動部分
sysALib.s
匯編語言文件,程序員可以把自己的匯編函數放在這個文件里,在上層調用.VxWorks image的入口點_sysInit在這個文件里,是在RAM中執行的第一個函數.
sysLib.c
包含一些系統相關的函數例程,提供了一個board-level的接口,VxWorks和應用程序可以以system-indepent的方式生成.這個文件還能包含目錄target/config/comps/src的驅動.
sysScsi.c
可選文件用于Scsi設備設置和初始化.
sysSerial.c
可選文件用于所有的串口設置和初始化.
bootrom.hex
ASIC文件包含VxWorks Boot ROM代碼
VxWorks
運行在目標機上,完整的,連結后的VxWorks二進制文件.
VxWorks.sym
完全的,連結后帶有符號表的VxWorks二進制文件
VxWorks.st
完全的,連結后,standalone,帶有符號表的VxWorks二進制文件
BSP用"make"來編譯連接生成(Created),而不是用Tornado的工具.
BSP和應用程序都可以在"make"或"tornade"上開發(developed)
BSP被設置包括以下驅動:
中斷控制interrupt controller,計時器timer(sys/aux),串口UART(serial),顯示屏LCD,鍵盤Keyboard(opt),觸摸屏touch-screen(opt).
前面三個是BSP的主要部分.
BSP默認的download VxWorks RAM image方式是從ethernet.
串口電纜需要用來和開發板(COM1)通信,通過協議WDB.
VxWorks Image的種類:
Loadable images.
ROM-based images---compressed/uncompressed.
]]>