内核编译成功后,下一步我们就开始弄Hello World,完成这个工作,首先我们去官方网站下载测试程序包。
http://www.rtems.org/ftp/pub/rtems/4.9.4/class-examples-4.9.4.tar.bz2
解压缩,以后我们进入 class-examples-4.9.4 的文件夹。
输入以下命令
cd hello_world_c
export RTEMS_MAKEFILE_PATH=/opt/rtems-4.9/arm-rtems4.9/at9260
make clean; make
应该成功编译结束,编译结束后,应该看到下面多了一个o-optimize的文集夹。hello.exe 即是编译后生成的elf文件。
由于我没有仿真器,为了能使系统能跑起来,可能要使用bootloader加载该镜像,镜像也要转成内存格式。
arm-rtems4.9-objcopy -O binary -S hello.exe hello.bin
我为了图省事,没有去找 Uboot去引导系统,当然如果有现成的更好。我就是使用 ATMEL公司提供的bootstrap程序完成了对RTEMS程序的引导。但bootstrap需要少许的改动一下。
从官方下载bootstrap v1.16 的源代码,bootstrap也是用GNU工具链编译,两个正好统一起来。
我的AT91SAM9260是从dataflash中启动。
修改:Bootstrap_v1.16_for_at9260/board/at91sam9260ek/dataflash/at91sam9260ek.h
#define IMG_ADDRESS 0x10000 /* Image Address in DataFlash */ #define IMG_SIZE 0x300000 /* Image Size in DataFlash */ #define MACH_TYPE 0x44B /* AT91SAM9260-EK */ #define COPY_ADDR 0x20000000 #define JUMP_ADDR 0x20000020 /* Final Jump Address */
这里主要修改了 COPY_ADDR、IMG_SIZE、IMG_ADDRESS
增加了一个宏 JUMP_ADDR
Bootstrap_v1.16_for_at9260/main.c函数修改main函数的返回值
return JUMP_ADDR;
然后修改Bootstrap_v1.16_for_at9260/board/at91sam9260ek/dataflash/Makefile
主要是改成arm-rtems4.9-的工具链,别的没什么。
# TODO: set this appropriately for your local toolchain ifndef ERASE_FCT ERASE_FCT=rm -f endif ifndef CROSS_COMPILE CROSS_COMPILE=arm-rtems4.9- endif
至此,进入Bootstrap_v1.16_for_at9260/board/at91sam9260ek/dataflash/文件夹,直接make就好了
生成一个小于4kb大小的dataflash_at91sam9260ek.bin文件。
这个文件用于引导系统。
这里有些朋友会问我,怎么确定 COPY_ADDR和JUMP_ADDR的。
这里简要的说一下:
COPY_ADDR就是代码加载到SDRAM中,从什么位置开始。而JUMP_ADDR是代码的第一条指令从什么地方开始。
我们的linkcmds中代码是从0x20000000开始的,这没什么好说的。那第一条指令并不是0x20000000开始的。
大家可以查看o-optimize/hello.num这个文件,这个文件是所有符号的位置。可以看到_start标号对应的地址是0x20000020开始的。
RTEMS应用程序规定,第一条指令从_start标号开始。
至于IMG_ADDRESS和IMG_SIZE,只是告诉bootstrap,RTEMS的应用程序放置在dataflash的什么地方,应用程序有多大。
应该不难理解。
烧写代码可以选用j-link完成(如果是学生,建议去淘宝去买个70块钱的j-link),使用ATMEL官方提供的 SAM-BA 烧写。
选择/jlink/ARM0和AT91SAM9260-EK,然后链接目标板。
选择Dataflash的页面,启用CS1片选上的设备,然后Erase all所有内容。时间较长,需要等待一下。
这里说一下,AT45DB321D这个系列的dataflash支持边写边擦除,所以erase all不是必须的。但是为了防止写错,可以erase all,这样更可靠些。然后选择send boot file,选择文件dataflash_at91sam9260ek.bin,写完毕后。在send file name 中选择hello.bin文件,在Address(图中2位置)填写0x10000,然后点击 Send file.烧写完毕后,解除 jlink链接后,重新给板子上电,链接好串口打印,设置好波特率。
你看到了Hello World!!!了吗?
没看到不要着急,仔细检查每个环节,确认问题。如果你对我所说的有疑问,欢迎拍砖。谢谢。