您的位置:首页 > 运维架构 > Linux

替代IAR,使用免费的gcc编译开发cortex-m3产品

2010-05-13 14:29 316 查看
    在写这篇小短文之前,想问问大家,不知道大家用什么编译器编译基于cortex-m3的代码?
项目开始的时候就会购买商业版的编译器么?还是用D版的?反正我是没找到好用的D版(有过贼心,没偷成)。前段时间一直在用IAR开发基于
Luminary
LM3S的一个工具,可是在加入TCP/IP协议栈的时候遇到了32K的代码限制,在google上搜索了好几天都没有找到合适的key,于是只能自己动
手,做了基于4.4.0的gcc编译器(编译的代码已经应用于产品),在附件中可以直接下载。另外,Sourcery G++也可以编译Cortex
M3,但没用过,欢迎有用过经历的朋友拍砖。不多说,做正事。

1.开发环境

    目前的开发都是在Linux上进行的,当然也可以在Windows上做,只是据我知道的,GDB在windows下没有一个比较好用的能够设置
hard
breakpoint的调试界面(对运行在flash上的程序设置断点),Linux下的DDD可以做到,而且一步一步的执行汇编代码,这个对于调试操作
系统的堆栈切换非常有用。除了省钱,另外一个吸引我的是Linux强大的网络功能和开源,可以基于此进行很多网络模拟测试开发。

操作系统选择UBUNTU
9.10。UBUNTU安装软件包很方便。例如后续我们将用到的调试工具OpenOCD,9.10上已经自带0.2的版本,运行命令apt-get
install openocd就自动安装。尽管
10.04已经发布,但离稳定还需要一段时间,所以目前还是比较推荐9.10。当然,其它的Linux版本也可以使用,看个人兴趣。

2.安装编译器

    先在附件中下载编译器,保存在当前目录下面,在终端运行命令tar zxvf cortex-m3-gcc4.4.0.tar.gz。
解压后将目录里面的文件夹cross-cortex拷贝到/opt目录(运行命令cp -r  cross-cortex
/opt),然后用gedit或者vi编辑~/.bashrc,在文件末尾添加如下一行来设置环境变量,“export
PATH=$PATH:/opt/cross-cortex/bin”。这样在任何目录下面,就可以执行编译器arm-elf-gcc了。

3.编译目标文件

    先下载附件中的代码,解压后有三个文件,分别是example.lds,start.c和Makefile。

    example.lds是gcc连接器脚本,连接器通过该脚本决定如何将输入文件的sections映射到输出文件,以及如何控制内存分布(memory layout)。这个脚本文件主要是针对LM3S系列64 RAM, 256K Flash的处理器。

    start.c是CPU上电后开始执行的文件,其入口函数是ResetISR,这个相关资料都有介绍,这个文件只是最简单的一个示例,若要打印一个”hello world!”比这个还要麻烦一些,至少配置串口等。

    最后一个文件就是Makefile,我不太清楚看这篇文章的朋友(常用单片机,从事工业控制等,都能自己设计电路,自己写程序?)了解Linux的
多不多。大家在Windows下面的集成开发环境用的比较多,例如IAR,ADS,或者MS的Visual
Studio开发环境。但Linux的绝大部分软件几乎都是由Makefile来组织的。尽管Makefile很让初学者头疼,但几乎大型嵌入式(或者服
务器等)软件都少不了它(Linux内核编译也是由Makefile来组织)。在当前目录运行make命令的时候,会逐行运行Makefile的如下几行
命令。

    arm-elf-gcc -g -mcpu=cortex-m3 -mthumb start.c -nostartfiles -T example.lds -c -o start.o,生成object文件。

    arm-elf-ld  -T example.lds start.o -o
start.dbg,生成带有调试信息的二进制elf文件,类似于Windows的PE文件,也就是大家常见的exe,包括一些文件头,等等。但这个可执
行文件还不能够烧录到flash,还要执行下面的一步,

    arm-elf-objcopy -O binary -S -R .note -R .comment start.dbg start.bin,生成“纯”二进制文件,去除了调试信息。start.bin就可以通过jtag烧录到单片机的flash。

    arm-elf-objdump -t start.dbg > start.map,最后这样是用来生成内存映射表。例如,变量对应的内存地址,函数入口地址等。这些信息在调试的时候有用。

在当前代码的目录下面,运行make clean就运行命令“rm start.bin start.dbg start.map start.o”删除生成的这些二进制文件。

希望这篇短文对大家有用,有问题欢迎拍砖。下一篇有空将介绍如何通过OpenOCD,控制JTag来调试和烧录程序。

 

 

下载
http://www.interd.net
编译器比较大,有55M。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐