替代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,但没用过,欢迎有用过经历的朋友拍砖。不多说,做正事。
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。
项目开始的时候就会购买商业版的编译器么?还是用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。
相关文章推荐
- 如何使用GNU编译器GCC来编译Cortex-M3?GCC + STM32
- 【怎样在fans-rt上进行开发】1.windows 系统下 gcc 交叉编译环境搭建(cortex-m3)
- Linux GCC 开发入门(一) -- 使用makefile 命令行编译
- Jlink V7在MDK下使用Cortex-M3-Jlink模式开发STM32的说明
- 关于keil编译cortex-m3纯汇编时为什么问题使用align地址问题
- Linux系统平台下关于GCC编译及使用的方法 (-Werror,它要求GCC将所有的警告当成错误进行处理
- 学生免费使用JetBrains系列产品
- 如何在Linux使用Eclipse + CDT开发C/C++程序? (OS) (Linux) (C/C++) (gcc) (g++) [转]
- 由于Python本身自带的界面库功能并不强大,我们使用Python+wxPython作为界面开发平台,在公司新的项目中进行界面开发。开发过程使用Eclipse+PyDev 作为集成开发环境。产品发布时使用Py2exe进行打包。如今,在我的团队中,Pytho
- 【菜鸟玩Linux开发】在Linux中使用VS Code编译调试C++项目
- C#工程开发中 编译、安装、使用Berkeley DB步骤 (C#版)
- 【快速开发VoIP】(使用Homebrew编译iOS linPhone SDK)
- (Ubantu)使用gcc编译一个程序a.c成a.out,输入a.out运行,提示bash:a.out:command not found,怎么回事
- gcc编译使用静态库/动态库
- stm32 在windows下 使用gcc 编译的makefile脚本
- 使用eclipse开发struts+spring+hibernate免费插件套装
- 摄像头当镜子,Camera as Mirror,使用免费的、开源的、跨平台的lazarus开发。
- 在Magento产品页使用ColorBox 【magento二次开发】
- 需求:使用TOGA来做业务架构 - 价值驱动产品开发
- archlinux 下 vmware player 需要使用 gcc 5.1.0 编译的处理