摘要:在新的方针板上装置VxWorks的进程极具挑战性。本文较具体地介绍依据LPC2104的arm开发板的BSP规划办法,并给出源代码。
关键词:VxWorks LPC2104 BSP arm
VxWorks是一种商用嵌入式实时操作体系(RTOS)多年来,风河公司为用户供给了一系列广泛的板级支撑包(BSP)。可是,跟着CPU的开展,用户自己规划的硬件渠道越来越多,分散性越来越大,因而介于硬件渠道和操作体系之间的BSP的自主设备也日益急迫。EasyARM开发板是广州周建功单片机有限公司开发的依据飞利浦LPC2104型arm7TDMI芯片的低价位学习板,具有128KB的Flash,16KB的RAM,满意VxWorks运转的最低要求。
1 格局阐明及格局转化程序的制造
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 0018 IRQ
0x0000 001C FIQ
*在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: