打印

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

[复制链接]
6114|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ebrother|  楼主 | 2010-5-13 09:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 ebrother 于 2010-5-13 09:41 编辑

在写这篇小短文之前,想问问大家,不知道大家用什么编译器编译基于cortex-m3的代码?项目开始的时候就会购买商业版的编译器么?还是用D版的?反正我是没找到好用的D版(有过贼心,没偷成)。前段时间一直在用IAR开发基于LuminaryLM3S的一个工具,可是在加入TCP/IP协议栈的时候遇到了32K的代码限制,在google上搜索了好几天都没有找到合适的key,于是只能自己动手,做了基于4.4.0的gcc编译器(编译的代码已经应用于产品),在附件中可以直接下载。另外,Sourcery G++也可以编译CortexM3,但没用过,欢迎有用过经历的朋友拍砖。不多说,做正事。
1.开发环境
    目前的开发都是在Linux上进行的,当然也可以在Windows上做,只是据我知道的,GDB在windows下没有一个比较好用的能够设置hardbreakpoint的调试界面(对运行在flash上的程序设置断点),Linux下的DDD可以做到,而且一步一步的执行汇编代码,这个对于调试操作系统的堆栈切换非常有用。除了省钱,另外一个吸引我的是Linux强大的网络功能和开源,可以基于此进行很多网络模拟测试开发。
    操作系统选择UBUNTU9.10。UBUNTU安装软件包很方便。例如后续我们将用到的调试工具OpenOCD,9.10上已经自带0.2的版本,运行命令apt-getinstall 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,在文件末尾添加如下一行来设置环境变量,“exportPATH=$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的VisualStudio开发环境。但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 -ostart.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。

相关帖子

沙发
georgemxx| | 2017-2-21 19:54 | 只看该作者
小弟目前用arm-none-eabi-gcc编译cm4核,可以吗?

使用特权

评论回复
板凳
georgemxx| | 2017-2-22 11:23 | 只看该作者
georgemxx 发表于 2017-2-21 19:54
小弟目前用arm-none-eabi-gcc编译cm4核,可以吗?

已经成功了,哈哈

使用特权

评论回复
地板
wmslecz| | 2017-2-22 14:57 | 只看该作者
为什么不用如此强大的IAR,非要用功能相对较弱的GDB进行调试?这其中有什么厉害关系吗?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

2

帖子

1

粉丝