2006年下半年,我玫邻自己设计的BCNG2440开发板下移植了VXWORKS。移植的过程参考了网络下一些BSP代码,与现有的代码不同的是,我们 的BSP实现了内存的沉映射,中断向量的沉新分配;以及cache和MMU的开启。移植的目标是用于一个数据采集系统,ARM从FPGA读取解调数据,通 过100M网络发送到服务器。经过测试,运用UDP发送速率达到了43Mbps,运用TCP发送速率为20Mbps。之前,我玫邻类似的项目中运用了 MPC8260为CPU,当时TCP最高速率也只达到了20多Mbps,因此,我们以为在某些项目中运用ARM替代MPC8260是可行的。
移植的过程分为一下几个部分:
1)异常处理
2) 中断
3)MMU
4)DM9000网卡驱动
5)启动参数保存问题
6)CPU设置
7)其他问题
往常来讲,在嵌入式系统启动之初,CPU将从0地址处(或ffff0000处)开始执行代码,因此初始时将ROM映射在0(或ffff0000)地址处,当进行完必要的初始化并启动异常处理机制后,会将RAM映射到0(或ffff0000)地址处,而将ROM映射到其它地址。
这是因为发生异常时,CPU会跳转到0地址开始处执行异常向量表。由于RAM的访问速度远远高于ROM,因此将RAM映射到0地址后,可以减少异常处理的延迟时间借有其他好处,动态和灵活等。
地址沉映射可通过不同的方式实现,例如MPC8260可通过沉新为每个memory bank分配地址空间来实现,洞口AT91RM9200,可通过设置其独有的“REMAP”控制位来实现。
ARM的体系结构规定在异常发生时,要从0地址开始处读取相应的处理指令,然而S3C2440A的固定地址空间办理方法在VxWorks里会遇到问题。因为从硬件上讲,S3C2440A的地址空间是不能沉分配的,它也不支持所谓的REMAP功能,一旦硬件连线决定了其RAM基地址为0x(nGCS6),0地址上为ROM(nGCS0),就无法再更改。因此必需采用其他办法来解决异常向量表的访问问题。VxWorks办理的RAM中异常向量表结构如下图:
洞口BOOTROM来说,不会使用到MMU,访问地址0就是访问ROM,因此需要将异常向量表建立在启动ROM的开始处。
基本念想是在Flash存储器的起始地址硬编码异常入口,仿vxWorks建立异常向量表。异常发生时,经Flash存储器入口,跳转到自定义函数,再跳转到RAM中异常入口,再调用vxWorks提供的异常处理函数。中断处理流程和中断向量表如下图示意。新异常向量表和原VxWorks设计完全一样。
romInit.c(下面是处理IRQ异常的例子,其它见流代码):
_romInit:
B cold
B _romUndef
B _romSwi
B _romPrefetch
B _romDataAbort
B _romReserved
B _romIRQ
B _romFIQ
_ARM_FUNCTION(romIRQ)
_romIRQ:
sub sp, sp, #4
stmfd sp!, {r0}
ldr r0, L$_promIRQ
ldr r0, [r0]
str r0, [sp, #4]
ldmfd sp!, {r0, pc}
L$_promIRQ:
.long S3C_EXC_BASE + 20
#define S3C_EXC_BASE 0x
config.c中定义:
#define S3C_EXC_BASE 0x
sysLib.c:
添加以下函数声明
void s3cExcVecSet(void);
IMPORT VOIDFUNCPTR excEnterUndef;
移植的过程分为一下几个部分:
1)异常处理
2) 中断
这是因为发生异常时,CPU会跳转到0地址开始处执行异常向量表。由于RAM的访问速度远远高于ROM,因此将RAM映射到0地址后,可以减少异常处理的延迟时间借有其他好处,动态和灵活等。
地址沉映射可通过不同的方式实现,例如MPC8260可通过沉新为每个memory bank分配地址空间来实现,洞口AT91RM9200,可通过设置其独有的“REMAP”控制位来实现。
ARM的体系结构规定在异常发生时,要从0地址开始处读取相应的处理指令,然而S3C2440A的固定地址空间办理方法在VxWorks里会遇到问题。因为从硬件上讲,S3C2440A的地址空间是不能沉分配的,它也不支持所谓的REMAP功能,一旦硬件连线决定了其RAM基地址为0x(nGCS6),0地址上为ROM(nGCS0),就无法再更改。因此必需采用其他办法来解决异常向量表的访问问题。VxWorks办理的RAM中异常向量表结构如下图:
洞口BOOTROM来说,不会使用到MMU,访问地址0就是访问ROM,因此需要将异常向量表建立在启动ROM的开始处。
基本念想是在Flash存储器的起始地址硬编码异常入口,仿vxWorks建立异常向量表。异常发生时,经Flash存储器入口,跳转到自定义函数,再跳转到RAM中异常入口,再调用vxWorks提供的异常处理函数。中断处理流程和中断向量表如下图示意。新异常向量表和原VxWorks设计完全一样。
romInit.c(下面是处理IRQ异常的例子,其它见流代码):
_romInit:
B cold
B _romUndef
B _romSwi
B _romPrefetch
B _romDataAbort
B _romReserved
B _romIRQ
B _romFIQ
_ARM_FUNCTION(romIRQ)
_romIRQ:
sub sp, sp, #4
stmfd sp!, {r0}
ldr r0, L$_promIRQ
ldr r0, [r0]
str r0, [sp, #4]
ldmfd sp!, {r0, pc}
L$_promIRQ:
.long S3C_EXC_BASE + 20
#define S3C_EXC_BASE 0x
config.c中定义:
#define S3C_EXC_BASE 0x
sysLib.c:
添加以下函数声明
void s3cExcVecSet(void);
IMPORT VOIDFUNCPTR excEnterUndef;