S3C2440 VXWORKS 移植笔记(转载,…

2006年下半年,我们在自己设计的BCNG2440开发板上移植了VXWORKS。移植的过程参考了网络上一些BSP代码,与现有的代码不同的是,我们的BSP实现了内存的重映射,中断向量的重新分配;以及cache和MMU的开启。移植的目的是用于一个数据采集系统,ARM从FPGA读取解调数据,通过100M网络发送到服务器。经过测试,使用UDP发送速率达到了43Mbps,使用TCP发送速率为20Mbps。之
摘要由CSDN通过智能技术生成

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的体系结构规定在异常发生时,要从地址开始处读取相应的处理指令,然而S3C2440A的固定地址空间管理方法在VxWorks里会遇到问题。因为从硬件上讲,S3C2440A的地址空间是不能重分配的,它也不支持所谓的REMAP功能,一旦硬件连线决定了其RAM基地址为0x30000000(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         0x30000100

config.c中定义:

#define S3C_EXC_BASE         0x30000100

sysLib.c:

添加以下函数声明

void s3cExcVecSet(void);

IMPORT VOIDFUNCPTR excEnterUndef;

IMPORT VOIDFUNCPTR excEnterPrefetchAbort;

IMPORT VOIDFUNCPTR excEnterDataAbort;

IMPORT VOIDFUNCPTR excEnterSwi;

IMPORT VOIDFUNCPTR intEnt;

添加函数s3cExcVecSet()

void s3cExcVecSet(void) 

{

    int i;

    i = (int)&excEnterUndef;

*((volatile int*)(S3C_EXC_BASE + 0x0)) = i;

i = (int)&excEnterSwi;

*((volatile int*)(S3C_EXC_BASE + 0x4)) = i;

i = (int)&excEnterPrefetchAbort;

*((volatile int*)(S3C_EXC_BASE + 0x8)) = i;

i = (int)&excEnterDataAbort;

*((volatile int*)(S3C_EXC_BASE + 0xc)) = i;

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值