本帖最后由 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。 |