怎么使用 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已经正常启动了,网络也能用例如 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的代码。