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