怎么使用 UBOOT 来启动 rtems

怎么使用 UBOOT 来启动 rtems

假设UBOOT已经正常启动了,网络也能用例如 hello world 例子,rtems编译之后的应用程序是 .exe,实际上就是 elf 文件如果有elf解析器,例如调试的时候就是使用 gdb直接加载 .exe 文件就可以了,但是uboot加载的话,应该将它先转换为 bin 文件。
使用命令

$ arm-rtems4.10-objcopy   -R -S -O binary hello.exe hello.bin

接着的关键,应该怎么来启动。首先应该明确各个段是怎么样分配的,例如我使用的 2440 是按照 gp32 移植过来的所以看 \rtems-4.10.2\c\src\lib\libbsp\arm\gp32\startup 里面的连接脚本 linkcmds ,可以看出,所有段是从0x30000000 开始的,而前 0x100 为向量表,真正的代码是从 0x30000100 开始的。也就是说,只要我将 hello.bin 加载到0x30000100 ,然后跳转到这个地址,就也已运行了。

例如在uboot中运行
# tftp 0x30000100 hello.bin
# go 0x30000100

就可以运行了。

另外,比较正式的办法是生成 uboot 的镜像,例如linux镜像要生成 uImage 一样。mkimage 只是在bin文件的前 64个字节添加镜像的一些信息,方便uboot加载。方法是之前编译过 uboot,在 tool 目录下有个工具为 mkimage,将它复制到系统能搜到的目录就行了,例如 /usr/bin

然后执行命令
$ mkimage -A arm -O rtems -T kernel -C none -a 0x30000100 -e 0x30000100 -n "RTEMS Application" -d hello.bin hello.img

其中参数的意义,阅读一下帮助就行了,-a 表示架构, -O 表示操作系统类型, -T 表示要生产的类型,-C 表示是否压缩,一般不压缩也没啥,其中 -a 是指装载地址,这个地址就是刚才说了,代码段在哪里,就应该装载到那里,-e 是 entry point 的意义, -d 只是输入文件, -n 只是文字描述。

有了 hello.img,则镜像可以下载到其他地方都没有问题,采用 bootm 启动。
例如 
# tftp 0x32000000 hello.bin
# bootm 0x32000000

因为uboot会根据镜像开头的 64个字节分析具体需要装载到什么地方,会自动处理,明显这种办法比较好,linux也默认使用了这种办法,是可取的。我之前一直不明白,uboot为什么知道这个镜像的类型,后来我才知道,原来就是 mkimage 生成的时候传入的参数,这样就解释得通了,具体可以看看uboot的代码。


另外 -a 和 -e 的困惑,为什么一个加载地址一个入口地址?只需要明白,加载地址就是运行时地址,是编译的时候指定的 .text 段的地址,很明显,这个地址在运行的时候必须匹配,否则就错了,-e 入口地址呢?一般情况下,对于嵌入式,这个和加载地址是一样的,因为大多从第一条指令开始执行,但是,这不是一定,如果连接的时候代码段还有其他数据,而第一条执行的指令,并不一定在数据段的开头,这是可能的,只有有足够的办法重映射向量就可以了,这样不是难事,所以就有了指定2个地址的用法。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值