将VxWorks移植到AT91RM9200处理器之上

 

 

 

 

 

 

将VxWorks移植到AT91RM9200

 

 

 


目  录

目录

0修改记录...3

1 硬件平台...3

2 vxWorks映像...3

3 文件组成说明...4

4 重要宏定义...8

5 移植注意事项以及问题...10

6 调试技巧...12

 

 

 




0修改记录

序号

修订版本

修改内容

修改者

1

创建文档V1.00

初始文档

xuezj

 

硬件平台

       用于调试的硬件平台如下:

类别

型号

备注

处理器

AT91RM9200

 

FLASH

16MB

片选地址:0x1000 0000

SDRAM

64MB

片选地址:0x2000 0000

外部晶振

18.432M

 

 

 

 

 

此次软件设计的目标是让AT91RM9200的主工作始终工作于90M (89856000),而Processer时钟PCK工作于180M频率。

 

2. 映像

2.1 映像组成的组成

       1.文本段(.text/.code):相当于代码段,是由一些指令组成。

      2. 数据段(.data):初始化过的全局和静态变量组成

       3.  BSS段:未经初始化的全局变量和静态变量组成。

2.2 VxWorks映像类型

(1).VxWorks(Loadablebinary VxWorks image)

RAM based VxWorks image, linked to RAM_LOW_ADRS. Itis loaded into RAM via some external program such as abootROM.This is thedefault development image.

(2).vxWorks_rom(UncompressedROMable binary VxWorks image)

RAM based image that starts in ROM. The ROMstartup code copies the entireimage to RAM and then jumps to it. This imagegenerally has a slower startup time, but faster execution time, thanvxWorks_romResident.

(3).vxWorks_romCompress(compressed ROMable binary VxWorks image)

Compressed RAMbased image thatstartsin ROM. This image can fit almost twice the codeas other ROM images.But it has the slowest boot time, since the image mustbe uncompressed. The run-time speed is the same as for vxWorks_rom.

(4).vxWorks_romResident(ROM-resident version binary VxWorks image)

ROM resident image. The program textremains inROM, only the data iscopied to RAM. Thisimage has the fastest boot time and uses the least amount of RAM, butrunsslower on boards with slow ROM access.

相关后缀的含义同bootrom。

 

故我们可以将VxWorks image的文件类型划分为两类三种:

类别

种类

说明

A类:加载型映像

(vxworks类型)

Loadable image

Loadable image是包含用户程序的VxWorks操作系统映像,其不具备引导功能,需要借助bootloader引导程序通过网口或串口下载到RAM中。bootloader在此扮演了“搬运工”的角色。

B类:可引导型映像

(bootable类型),该类映像往往由bootstrap programme(romInit.s+

romStart.c)和紧随其后的为vxworks映像组成

ROM-based Image(压缩/没有压缩)

即将Image直接烧入ROM/FLASH,运行时将Image拷入(如果压缩则需要解压)RAM中与西宁

ROM-resident Image

Image的执行部分主流在ROM中运行,仅将数据段部分拷入RAM。

 

注意,以上三种映像都是包含完整VxWorks操作系统的映像,其中后两种可以直接启动并运行起来,但是第一种不行,它必须借助另外一叫Boot Image的映像(可以在Tornado中的Build->build bootrom中生成)才能运行起来,也就是利用Boot Image引导起来后通过网口或串口下载真正包含VxWorks的Loadable Image然后才能运行起来。

现在看来一共有四种映像文件:

(1)   Boot Image:包含一段起始引导程序(BootStrap Program)和一段ROM引导程序(ROM Boot Program)

(2)   Loadable Image:由操作系统VxWorks和应用组成的映像

(3)   ROM-Based Image(压缩/没有压缩):包含一段叫做BootStrap Program的程序+Loadable Image(即有操作系统VxWorks和应用组成的映像)

(4)   ROM-Resident Image:同上。

 

3文件组成说明

3.1vxWorks_romCompress.bin类型

       用Tornado集成开发环境建立一个Bootable类型的项目工程后,工程中会自动添如下文件:

 

 通过下图的Build ALL编译过程可以知道,其中prjComps.h,prjParams.h,prjConfig.c以及linkSyms.c是\host\src\hutils\configGen.tcl 脚本自动生成的。



而其他几个重要的文件:

(1)   romInit.s:就是Bsp中的romInit.s,属于同一个文件,即不是拷贝生成的。

(2)   romStart.c:该文件跟BSP无关,是target/config/comps/src目录下的romStart.c文件,因为这个文件是很多项目工程共享的,故修改时需要特别注意别影响到其他工程项目。

(3)   sysALib.s:就是BSP中的sysALib.s

(4)   sysLib.c:就是BSP中的sysLib.c文件

 

所以从这里咱们可以了解一下VxWorks的BSP的知识,即编写一个标准的BSP,就需要实现romInit.s,sysALib.s以及sysLib.c。当然还得包含很重要的两个头文件config.h和configNet.h。

 

 

上述过程中一个很是重要的文件就是prjConfig.c文件。对整个项目工程映像文件的生成占据着很大的比分。prjConfig.c文件也是\host\src\hutils\configGen.tcl脚本根据用户的config.h、configNet.h、用户cdf文件(组件定义文件)以及系统的configAll.h生成的,从其文件的构成结构来看,主要是包含三部分的内容,:

序号

包含内容

截图

1

系统头文件

2

Vxworks组件库

3

Vxworks启动流程(主要是调用组件库函数,也可以归结为组件部分)

 

其中“configlettes”就是从组件文件cdf文件,cdf文件就是vxworks的组件定义文件,其主要是存在于/target/config/comps/vxWorks目录下面

 

所以可以将上述的项目函数级的调用框图表示如下图:

 

其中上述图中几个更用户很相关的函数分别是:

序号

函数名称以及功能

存放路径

BSP实现函数

1

sysClkInit();

实现系统心跳功能以及各种定时器功能。

Target/config/

comps/src/

sysClkInit.c


从中可知,需要用户自己实现的三个函数,这三个函数可以AT91RM9200工程中,位于at91Timer.c文件中,该文件就实现了上述3个函数。所以这也是编写系统心跳BSP的三个函数。

2

sysHwInit();

其中可以实现串口等驱动的初始化,在参考的ARM7的BSP中也是将串口的初始化放在了该函数中实现,故某种意义上的一种标准:处理器除以太网驱动外,其他硬件接口驱动似乎都可以放在这个函数里面初始化。

At91rm9200的BSP中

主要是实现硬件上的初始化。参见BSP的sysLib.c文件函数实现,其中参见1005行,其就是串口驱动的入口函数,主要是实现串口的注册以及初始化,至于串口的BSP写法也是标准的,下面将会讲述:

3

usrNetworkInit()à

usrNetDevStart()à

usrNetEndLibInit();

 

这里着重介绍usrNetEndLibInit函数

 

(1)usrNetEndLibInit():

函数存放于:target/config/comps/src/net/coreip/usrNetEndLib.c文件中。

(2) usrNetWorkInit()和usrNetDevStart()两个函数存放于工程的prjConfig.c文件中。


从上图可知,usrNetEndLibInit()函数主要功能是通过muxDevLoad函数,对数组endDevTbl进行初始化。而函数muxDevLoad正是以太网驱动加载函数。也是编写VxWorks以太网驱动的重要函数。在BSP中configNet.h文件(标准BSP文件)定义了endDevTbl数组,这里的uerNetEndLibInit函数使用的正是configNet.h中的endDevTbl数组。

下图给出了configNet.h文件在at91rm9200的BSP中的大致内容:

其中函数图片中secEndLoad函数(存在文件secEnd.c中)正是at91rm9200的以太网驱动入口函数,通过宏定义SEC_END_LOAD_FUNC放在了endDevTbl数组中。这样我们就知道了大致VxWorks的以太网BSP的编写方式,更细一点就是要实现函数数组endFuncTable里面的函数,这个函数数组一般存放于***end.c文件中,比如AT91RM9200的BSP 就是放在了secEnd.c文件中,之前ARM7处理器S3C4510是存放于BSP 的sngks32cEnd.c文件中。

 

===花絮===:

muxDevLoad会调用两次你的Driver的Load例程(第一次参数initString[0]=0,第二次参数initString为真正的初始化参数串指针)


 

 

4重要宏定义

4.1ROM-Basedimage(压缩/非压缩)

       在config.h文件中需要注意的几个宏定义含义如下,同时要注意:


其实,对于ARM系列的处理器来说,宏定义RESERVED不用定义,可以参考configAll.h中对于上述各个宏定义的定义。从configAll.h可以知道,宏定义RESERVED会用在像SPARC等处理器中,具体原因可能跟各个处理器的中断机制有关。

       所以,在AT91RM9200的config.h中,不必去定义RESERVED宏。

 

 

4.2bootImage+LoadableImage类型

       对于bootImage+LoadableImage类型的,可以分为两部分执行,通过bootrom.bin将boot程序搬运到SDRAM中并执行boot程序,然后监控网络FTP或本地存储器进行vxworks映像的加载。

步骤1:搬运bootrom程序到SDRAM中。

步骤2:运行bootrom程序,等待从本地存储器或者网络下载VxWorks的映像。

下面两幅图分别描述了上述两个步骤过程。

 

步骤1 :先加载BOOTProgramme程序

 

步骤2:从网络或本地加载VxWorks映像

 

55植注意事项以及问题

·文件secEnd.c中,secEndInitMem()函数死机问题

      问题原因:是该函数中cacheDmaMalloc()调用和netPoolInit()调用死机。

       问题解决:修改宏定义,将DRV_NUM_MBLKà128,原来为512

                       修改宏定义,将DRV_NUM_CLUSTERà64,原来为768

·中断不能用,

       问题描述:无论是调用printf还是最后创建的2个任务,都不能正常运行。因为printf

                       会调用串口中断(即PDC中断方式,前期调试我将其改成了轮询模式就能

连续调用printf语句)。创建的2个主任务也是匆匆死机。估计是任务调度中断造成的死机。所以这个问题也是非常致命的问题,直接造成了有printf语句打印信息的模块或组建直接死机。后来无意中修改printf为轮询方式,竟然发现在printf能无限打印且不会死机(当然没有让其进入到任务调度中断里面)。所以从这方面信息来讲,也进一步确定了中断存在问题。

 

中断向量基地址缺省值是定义在了configAll.h中,对于ARM系列的处理器来说,#define VEC_BASE_ADRS (char*)LOCAL_MEM_LOCAL_ADRS

 

所以对于AT91RM9200我的硬件环境就是0x2000 0000,但是ARM系列处理器发生中断的时候是跳转到0x0000 0000处执行中断向量。是不是发生中断的时候跳到0x0000 0000起始的中断向量发生的死机 ???

       问题解决:在prjConfig.c文件中,在usrInit()函数中,如果在cacheLibInit()函数之前

添加一个认为调用的函数:sysHwInit0()(此函数位于sysLib.c中)。

 

且在sysHwInit0()函数(如下图)中添加771行至774行,启用at91rm9200

重映射机制,这样,任务调度以及串口的中断方式都可以使用了:

 

·文件secEnd.c中,DRV_INIT()函数死机。

       问题原因:prinf打印造成死机。

       问题解决:暂时先注释掉printf打印语句。因为从printf打印会调用串口驱动,

而at91rm9200的BSP的串口驱动缺省模式是采用了中断方式。而

这中断方式也是迟迟没有能解决的问题,即中断不能用。任何用到中断的

地方就会死机。

·串口停留在打印出“Adding”后就死机了。

       问题原因:“Adding”打印是在prjConfig.c文件中的usrToolsInit()函数中出现的,而

                       usrToolsInit()函数是根据组件产生的,其定义死机之前定义如下,其中

usrStandaloneInit()函数也正是打印“Adding”信息的函数:

                     voidusrToolsInit()

                     {

                         usrStandaloneInit();

                         usrWdbInit();

                         usrShowInit();

}

注:usrStandaloneInit()由宏定义INCLUDE_STANDALONE_SYM_TBL包含,在组件视图中:develoment tool component->symbol table initialization component.

而对照ARM7处理器的开发环境,查看该函数定义是

void usrToolsInit()

{

       timexInit();

       usrWdbInit();

       usrShowInit();

}

注:timexInit()组件由development tool componentàtimex包含进来

       问题解决:包含timexInit()组件,去掉usrStandaloneInit()组件即可。

 

·包含组件Network ComponentsàNetworkPrivate ComponentsàBoot_parameter_process就

       会死机,此组件会在prjConfig.c文件中函数usrNetDevStart ()àusrCheckNetBootConfig(),程序从查找来看是死在了usrCheckNetBootConfig()函数里面。

       问题原因:

       问题解决:

 

66调试技巧

(1)       添加while(1)死循环,定位打印乱码的地方以及定位程序运行的路径。

(2)       利用AT91F_DBGU_Printk的初级打印函数,打印一些有用的调试信息。

(3)       汇编程序中可以用“B .”来实现死循环。

                     

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值