把VmWare 的启动CD 设定为此iso 文件。
然后在命令行下:
$ mount /dev/cdrom
$ cd /mnt/cdrom
$ ./install [-d <dir>] [<cpu_family>]
最后一句是设定安装到的路径和安装的组建,例如要安装powerpc603 系列的编译器,
目的地址放在/soft 下,则命令为:
$./install –d /soft ppc_6xx
如果不输入cpu 类型,则所有的类型都被安装。 安装完毕还需要设定环境变量:
export CROSS_COMPILE=ppc_6xxexport
PATH=$PATH:/soft/usr/bin:/soft/bin
设定VmWare 的CDROM 为iso 文件
第一句是设定编译的cpu 类型,第二句设定路径,就是编译器安装后的路径。设置完毕之后可以找一个简单的foo.c 文件编译一下,看看是否安装成功。
$ ${CROSS_COMPILE}gcc –o foo foo.c
具体情况参见/mnt/cdrom 下的readme.html。
比较懒的人可以用root 权限,在文件/etc/profile 文件下加入下面两行,这样就不用每次都输入了。(http://www.stcore.com/html/2005/1024/51803.html,里面有单用户设置path
的方
法)
export CROSS_COMPILE=ppc_6xxexport
PATH=$PATH:/soft/usr/bin:/soft/bin
重新启动VmWare,否则这两个环境变量的设置是无效的哦。
2.3 硬件准备
合适的电源,串口线(Windows 下用超级终端监视),对接网线或者正常网线+HUB。 这些调试VxWorks
下的bootrom 也要用,就不多废话了。强烈建议用仿真器,可惜我没有, 导致调试过程中麻烦的要死。还好我有一套已经调试好的bootrom+VxWorks,硬件也都正常,
否则直接改u-boot,估计很难调通。此外,由于启动设备为EEPROM,还需要一个编程器(包括PLCC 到双列直插的转接座)。
3.软硬件结构分析
3.1 软件的存储设备
先来看看板子上的存储设备。
首先是ROM,可以掉电存储,也是我使用的电路板的CPU 上电自动跳转的地址所在。 ROM 的优势是拆卸方便,如果在板上焊了ROM
座,那么可以用编程器烧录的ROM 就是不需要任何软件准备,就可以直接使用的唯一东西。缺点是烧录起来又慢又麻烦。
其次是FLASH,可以掉电存储,可以用CPU 编程控制在线烧录。如果手头有仿真器,而且电路板上的FLASH 做到了地址连续,可以用仿真器烧录,如果再将其地址映射到CPU的上电跳转地址,是最理想的放bootloader
的地方。缺点是普通FLASH 没有方便编程器烧录的封装,而仿真器比较贵。
最后是RAM,不能掉电存储,但是无论是u-boot 还是VxWorks 的bootrom,启动后期都会跳转到RAM 运行,原因是在RAM
里程序的运行速度明显高于ROM 或者FLASH。最终操作系统也需要在RAM 里运行。
综上,如果是将要设计的电路板,且手头上有仿真器,建议用FLASH作为启动设备。 或者使用跳线控制地址映射,选择从ROM 或者FLASH
启动。注意FLASH 的设计必须做到地址连续。
对于我手头的电路板,只能从ROM 启动。因此本文中介绍的是从ROM 启动的修改方式。没有使用仿真器,在u-boot 的调试中借用了bootrom
和VxWorks。如果有其他形式的bootloader 和RTOS,本文也可以作为参考。否则只能建议去购买仿真器了。
3.2 bootrom 和VxWorks 的软件结构
这不是本文的重点,更具体的可以参考源代码和Wind River 的Tornado BSP Training Workshop,熟悉VxWorks
的读者可以直接跳过本节。
首先看看VxWorks,广义上的VxWorks 包括了操作系统引导程序bootrom 和操作系统VxWorks。而用户程序User
Application,在开发过程中通常是使用网络下载,在开发完毕后和VxWorks 结合到一起,因此开发完毕后主要的执行文件,就是bootrom
和VxWorks。这两个文件都是基于Wind River 提供的板级开发包(Board Support Package, 简称BSP)生成的。修改和生成方法分为在IDE
Tornado 的图形界面下编译和在Dos 命令行下输入命令两种。个人认为,图形界面的修改不能解决底层问题,真正底层的修改还是需要修改源代码,且Dos键盘操作比鼠标操作快(估计很多老Dos
和Linux 用户会同意吧),因此我用的是命令行。
首先从BSP 制作一个bootrom,详细的修改和调试步骤就不在这里罗嗦了。
Bootrom 的启动顺序为:
romInit.s:第一个执行的汇编,初始化一堆CPU 内部寄存器,禁止中断、浮点运算, 初始化内存控制。
bootInit.c:romStart()为首个执行的C 程序,将bootrom 代码拷贝到内存。
bootConfig.c:usrInit()为首个在内存中执行的C 程序,之后跳转usrRoot(),它们初始化包括PCI
总线、串口、网口在内的硬件,最后开展多任务,运行bootCmdLoop(),提供串口操作,控制自动启动或者选择其他启动方式。
VxWorks 启动顺序为:
sysALib.s:VxWorks 首个启动的汇编,CPU 内部寄存器初始化。
usrConfig.c: usrInit(),VxWorks 首个执行的C 程序,之后跳转usrRoot(),它们进行更加详细的硬件初始化,初始化多任务内核,最后调用user
application。
Bootrom 运行过程中,不同地址的在不同启动阶段的内容分布如下,其中ROM 由于不可写,因此不再重复:
时间 |
内容 |
首地址 |
大小 |
说明 |
初始上电 |
ROM |
0xfff00000 |
0x00080000 |
包含bootrom.bin |
拷贝剩余
bootrom 后 |
RAM |
0x00400000 |
0x00080000 |
包含bootrom.bin |
运行bootrom |
RAM |
0x00400000 |
0x00080000 |
包含bootrom.bin |
RAM |
0x00400000-0x1000 |
0x1000 |
堆栈 |
RAM |
0x00004200 |
255 |
启动参数 |
加载VxWorks 后 |
RAM |
0x00400000 |
略小于bootrom.bin |
bootrom.bin |
RAM |
0x00010000 |
约1MB, 即vxWorks.bin
的大小 |
VxWorks 映像 |
RAM |
0x00400000 -0x1000 |
0x1000 |
堆栈 |
RAM |
0x4200 |
255 |
启动参数 |
其中各参数的宏定义即意义按出现顺序如下:
0xfff00000(+0x100): ROM_TEXT_ADRS,MPC8240 的启动地址为0xfff00100,在config.h
和makefile 中同时定义,必须一致,且如果系统一上电就运行bootrom,则此地址不能修改
0x00400000: RAM_HIGH_ADRS,bootrom 映像加载到内存的目的地址,在config.h和makefile
中同时定义,必须一致,可以修改
0x1000: STACK_SAVE,bootrom 运行过程中需要的堆栈大小,一般不需要修改
0x00080000: ROM_COPY_SIZE,从ROM 拷贝到RAM 的长度,必须大于非压缩型bootrom 映像的大小,一般不修改
0x00004200: BOOT_LINE_OFFSET,存放诸如本地IP 等启动参数的内存位置,与CPU类型有关,一般不修改
255: BOOT_LINE_SIZE,启动参数的长度,一般不需要修改,除非启动行比较长
0x00010000: RAM_LOW_ADRS,vxWorks 映像加载到内存的目的地址,在config.h 和makefile
中同时定义,必须一致,可以修改
在VxWorks 加载完毕之后,程序跳转到VxWorks 的入口,内存被重新分配,包括bootrom
1
2
3
4
5
6
7
8
9
10
11 |