» 您尚未 登录   注册 | 银行 | 首页调用管理 | 博客 | 帮助 | 社区 | 无图版
华镭社区论坛 -> 应用程序 -> 用GNU工具开发基于ARM的嵌入式系统 (二)
 XML   RSS 2.0   WAP 

--> 本页主题: 用GNU工具开发基于ARM的嵌入式系统 (二) 加入收藏 | 收藏主题 | 上一主题 | 下一主题
reertek




该用户目前不在线
级别: 新手上路
精华: 0
发帖: 18
威望: 19 点
镭: 36 L
贡献值: 0 点
在线时间:1(小时)
注册时间:2008-09-02
最后登录:2009-03-31
查看作者资料 发送短消息 推荐此帖 引用回复这个帖子

用GNU工具开发基于ARM的嵌入式系统 (二)

用GNU工具开发基于ARM的嵌入式系统 (二)



3 GNU 的编译器和开发工具


   GNU提供的编译工具包括汇编器 as、 C编译器 gcc、 C++编译器 g++、连接器 ld和二进制转换工具 objcopy。基于 ARM平台的工具分别为 arm-linux-as、 arm-linux-gcc、 arm-linux-g++、 arm -linux-ld 和 arm-linux-objcopy。 GNU的所有开发工具都可以从 www.gnu.org上下载 ,基于 ARM的工具可以从 www.uclinux.org获得。 GNU的编译器功能非常强大 ,共有上百个操作选项 ,这也是这类工具让初学者头痛的原因。不过 ,实际开发中只需要用到有限的几个 ,大部分可以采用缺省选项。 GNU工具的开发流程如下:编写 C、 C++语言或汇编源程序 ,用 gcc或 g++生成目标文件 ,编写连接脚本文件 ,用连接器生成最终目标文件( elf格式) ,用二进制转换工具生成可下载的二进制代码。 GNU工具都运行在 Linux下 ,开发者需要 1台运行 Linux的 PC作为上位机。由于篇幅所限 ,不能完整地介绍整个嵌入式操作系统的开发过程 ,将以第二节中提到的通过自举模式下载的引导程序为例 ,说明开发的过程。对于像 Linux这样的大系统 ,基本的开发流程是一样的。


  引导程序将通过自举模式下载到 MX1的片内 RAM,从地址 0x00300000开始并执行。完成串口和 SDRAM的初始化后 ,引导程序将等待接收应用程序或操作系统内核 ,将接收到的数据放在 SDRAM中。数据接收完毕后 ,引导程序将 SDRAM中的数据写入 Flash,下一次就可以从 Flash中直接引导系统了。由于操作系统的内核比较大 ,如 Linux有 1 MB以上 ,下载过程必须考虑纠错。因此 ,接收部分采用 Xmode协议 ,可以用 Windows下超级终端的 Xmode发送方式发送文件。


( 1)   编写 C、 C++语言或汇编源程序


  通常汇编源程序用于系统最基本的初始化 ,如初始化堆栈指针、设置页表、操作 ARM的协处理器等。初始化完成后就可以跳转到 C代码执行。需要注意的是 ,GNU的汇编器遵循 AT&T的汇编语法 ,读者可以从 GNU的站点( www.gnu.org)上下载有关规范。汇编程序的缺省入口是 start标号 ,用户也可以在连接脚本文件中用 ENTRY标志指明其它入口点(见下文关于连接脚本的说明)。

( 2)   用 gcc或 g++生成目标文件


  如果应用程序包括多个文件 ,就需要进行分别编译 ,最后用连接器连接起来。如笔者的引导程序包括 3个文件: init.s(汇编代码、初始化硬件) xmrecever.c(通信模块 ,采用 Xmode协议)和 flash.c( Flash擦写模块)。
  分别用如下命令生成目标文件:
   arm-linux-gcc-c-O2-o init.o init.s
   arm-linux-gcc-c-O2-o xmrecever.o xmrecever.c
   arm-linux-gcc-c-O2-o flash.o flash.c
  其中 -c命令表示只生成目标代码 ,不进行连接 ;-o 命令指明目标文件的名称 ;-O2表示采用二级优化 ,采用优化后可使生成的代码更短 ,运行速度更快。如果项目包含很多文件 ,则需要编写 makefile文件。关于 makefile的内容 ,请感兴趣的读者参考相关资料。


( 3)   编写连接脚本文件


   gcc等编译器内置有缺省的连接脚本。如果采用缺省脚本 ,则生成的目标代码需要操作系统才能加载运行。为了能在嵌入式系统上直接运行 ,需要编写自己的连接脚本文件。编写连接脚本 ,首先要对目标文件的格式有一定了解。 GNU编译器生成的目标文件缺省为 elf格式。 elf文件由若干段( section)组成 ,如不特殊指明 ,由 C源程序生成的目标代码中包含如下段: .text(正文段)包含程序的指令代码 ;.data(数据段 )包含固定的数据 ,如常量、字符串 ;.bss(未初始化数据段)包含未初始化的变量、数组等。 C++源程序生成的目标代码中还包括 .fini(析构函数代码)和 .init(构造函数代码)等。有关 elf文件格式 ,读者可自行参考相关资料。连接器的任务就是将多个目标文件的 .text、 .data和 .bss等段连接在一起 ,而连接脚本文件是告诉连接器从什么地址开始放置这些段。例如笔者的引导程序连接文件 link.lds为:


   ENTRY(begin)
   SECTION
   { .=0x00300000;
     .text : { *(.text) }
     .data: { *(.data) }
     .bss: { *(.bss) }
   }


  其中 ,ENTRY(begin)指明程序的入口点为 begin标号 ;.=0x00300000指明目标代码的起始地址为 0x00300000,这一段地址为 MX1的片内 RAM;.text : { *(.text) }表示从 0x00300000开始放置所有目标文件的代码段 ,随后的 .data: { *(.data) }表示数据段从代码段的末尾开始 ,再后是 .bss段。

全国统一报名电话:800-886-3788 (免费)
  成都:(028)-85175020 (028)-85194325
QQ:张老师:619646474   杜老师:1070109944
成都睿尔科技 公司网站:www.re-er.com.cn


[楼 主] | Posted: 2009-03-04 17:08
顶端

华镭社区论坛 -> 应用程序