登录
|
注册会员
开启辅助访问
设为首页
收藏本站
扫一扫关注官方微信
论坛
BBS
M币充值
M currency prepaid phone
M币获取
附件中心
搜索
search
全新论坛MCU智学网上线,欢迎访问新论坛!稀缺资源、技术干货、参考设计、原厂资料尽在MCU智学网
MCU资讯论坛
»
论坛
›
单片机论坛
›
51单片机论坛
›
用GNU工具开发基于ARM的嵌入式系统
更新自动建库工具PCB Footprint Expert 2024.04 Pro / Library Expert 破解版
用GNU工具开发基于ARM的嵌入式系统
[复制链接]
3273
1
ad***
管理员
发表于 2012-9-3 02:28:27
|
查看全部
|
阅读模式
本文包含原理图、PCB、源代码、封装库、中英文PDF等资源
您需要
登录
才可以下载或查看,没有帐号?
注册会员
x
当前,
ARM
公司的32位RISC处理器,以其内核耗电少、成本低、功能强、特有16/32位双指令集,已成为
移动通信、手持计算、多媒体数字消费等嵌入式解决方案的RISC标准,市场占有率超过了75 %。多家公
司都推出了自己的基于ARM内核的处理器产品,越来越多的开发人员开始了针对ARM平台的开发。通常开
发人员需要购买芯片厂商或第三方提供的开发板,还需要购买开发软件,如C编译器或者集成了实时操作
系统的开发环境。开发板的价格从数百到上千美元,而编译器、实时操作系统价格更是动辄数千到数万
美元。这样,在开发初期,软硬件上的投资就需要上万美元,对于国内大多数开发人员来说,无疑是太
贵了。
庆幸的是,GNU所倡导的自由软件给开发者带来了福音。1984 年,旨在开发一个类似 Unix 的,并
且是完全免费的完整操作系统和配套工具:GNU 系统(发音为"guh-NEW")。GNU的操作系统和开发工具
都是免费的,遵循GNU 通用公共许可证 (GPL)协议,任何人都可以从网上获取全部的源代码。关于GNU和
公共许可证协议的详细资料,读者可参看GNU网站的中文介绍:http://www.gnu.org/home.cn.html。
除了大家熟知的Linux操作系统外,GNU的软件还包括编译器(gcc,g++)、二进制转换工具
(objdump,objcopy)、调试工具(gdb,gdbserver,kgdb)和基于不同硬件平台的开发库。GNU开发工
具的主要缺点是采用命令行方式,用户掌握和使用比较困难,不如基于Windows系统的开发工具好用。但
是,GNU工具的复杂性是由于它更贴近编译器和操作系统的底层,并提供了更大的灵活性。一旦学习和掌
握了相关工具,也就了解了系统设计的基础知识,为今后的开发工作打下基础。GNU的开发工具都是免费
的,遵循GPL协议,任何人都可以从网上获取。笔者参与了一个基于ARM平台的嵌入式Linux系统开发,采
用的是摩托罗拉龙珠系列的MC928MX1。从测试代码、引导程序、嵌入式Linux移植、应用程序、图形界面
都可以用GNU工具进行开发,不需要在开发工具上做额外的投入。本文所介绍的开发方法同样适用于其它
公司的基于ARM的产品。
1 硬件平台
MC928MX1(以下简称MX1)是摩托罗拉公司基于ARM核心的第一款MCU,主要面向高端嵌入式应用。内
部采用ARM920T内核,并集成了SDRAM/Flash、LCD、USB、蓝牙(bluetooth)、多媒体闪存卡(MMC)、
CMOS摄像头等控制器。关于MX1的详细资料,感兴趣的读者可以参考
http://www.motorola.com.cn/semiconductors/。作为应用开发的最小系统必须包括RAM(程序运行空间
)、Flash(存放目标代码)和串行接口(用于调试和下载程序)。MX1提供了6个片选端(CS0~CS5),
内置了SDRAM控制器,数据宽度32位。在笔者的系统中采用了2片8M×16位的SDRAM和2片4M×16位的同步
Flash存储器,分别接入数据线的低16位和高16位,如图1所示。
图1中SDRAM接片选端CS2,Flash接片选端CS3,其余为SDRAM/Flash的控制信号。最小系统还包括至
少1个串行接口,可以采用MX1内置的UART控制器,图略。
图 1 (小图点击放大)
2 自举模式
目前,许多嵌入式处理器都提供了自举模式(Bootstrap),供用户写入引导代码。自举模式利用了
固化在芯片内部的一段引导程序,当处理器复位时,如果在特定引脚上加信号,则处理器将在复位后执
行固化ROM中的程序。例如,MX1提供了4条复位引脚,复位时引脚不同的电平组合可以从不同的片选端启
动系统。自举ROM中的程序完成串口的初始化,然后等待用户从串口写入用户代码。自举模式所能接受的
是一种专门格式的文本文件,包括数据和要写入/读出的地址。关于自举模式的代码格式,可参考相关芯
片的手册。在摩托罗拉的网站还提供了许多小工具,帮助开发者将其它格式的文件转换成为自举模式格
式。通过自举模式下载的通常是一段和上位机软件(如超级终端)通信的程序,完成接收数据并写入
Flash的操作。写入的数据可以是用户自己的应用程序、数据或者操作系统的内核。通过自举模式下载的
引导程序同样可以用GNU工具开发。
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段。
(4)用连接器生成最终目标文件
有了连接脚本文件,如下命令可生成最终的目标文件:
arm-linux-ld-nostadlib-o bootstrap.elf-T link.lds init.o xmrecever.o flash.o
其中,ostadlib表示不连接系统的运行库,而是直接从begin入口;-o指明目标文件的名称;-T指明采用
的连接脚本文件;最后是需要连接的目标文件列表。
(5)生成二进制代码
连接生成的elf文件还不能直接下载执行,通过objcopy工具可生成最终的二进制文件:
arm-linux-objcopy-O binary bootstrap.elf bootstrap.bin
其中-Obinary指定生成为二进制格式文件。Objcopy还可以生成S格式的文件,只需将参数换成-O srec。
如果想将生成的目标代码反汇编,还可以用objdump工具:
arm-linux-objdump-D bootstrap.elf
至此,所生成的目标文件就可以直接写入Flash中运行了。如果要通过自举模式下载,还需要转换为
自举模式的文件格式,相关转换工具可以在摩托罗拉的网站上找到。
掌握了GNU工具后,开发者就可以开发或移植C或C++代码的程序。用户可以不需要操作系统,直接开
发简单应用程序。但对于更复杂的应用来说,操作系统必不可少。目前流行的源代码公开的操作系统如
Linux、μC/OS都可以用GNU工具编译。ARM的Linux已有很多成熟的版本,可以支持ARM720、ARM920、
解决方案
,
处理器
,
移动通信
相关帖子
建筑自动化解决方案
饮用水厂解决方案
隧道解决方案
PCB数控钻铣床控制系统解决方案
基于工业以太网的集成式全分布污水处理控制系统
中阶企业储存大容量、高效能、高数据保护解决方案
论坛发布的最新版14.24使用时出现下列问题,有解决方案么?
2014 TI 处理器研讨会十个城市巡回举办
飞凌嵌入式受邀参加德州仪器 2014年9月16日深圳处理器产品研讨会
飞凌嵌入式参加2014 第四季度TI工业应用研讨会
举报
回复
1 个评论
ad***
管理员
发表于 2012-9-3 02:28:31
|
显示全部楼层
ARM1020等多种处理器,读者可从www.uclinux.org或www.armdevzone.com上获取最新信息。Linux移植过
程中和处理器相关的代码都放在arch/arm目录下。对于内核,用户需要做的是设定自己系统的内存映像
,RAM起始地址,I/O地址空间和虚拟I/O地址空间,参看arch/arm/mach-integrator/arch.c文件。除了
内核外,用户还需要为自己的系统编制各种各样的驱动程序。
4 调试工具
Linux下的GNU调试工具主要是gdb、gdbserver和kgdb。其中gdb和gdbserver可完成对目标板上Linux
下应用程序的远程调试。gdbserver是一个很小的应用程序,运行于目标板上,可监控被调试进程的运行
,并通过串口与上位机上的gdb通信。开发者可以通过上位机的gdb输入命令,控制目标板上进程的运行
,查看内存和寄存器的内容。gdb5.1.1以后的版本加入了对ARM处理器的支持,在初始化时加入-
target==arm参数可直接生成基于ARM平台的gdbserver。gdb工具可以从
ftp://ftp.gnu.org/pub/gnu/gdb/上下载。
对于Linux内核的调试,可以采用kgdb工具。由于篇幅所限,感兴趣的读者可以从http://oss.sgi.com/projects/kgdb/上了解
具体的使用方法。
结束语
本文以一个具体的实例为例,对GNU工具中的常用功能作了介绍。其实GNU工具的功能还远不止这些
,更进一步的操作有:针对不同处理器,不同算法的软件优化、高效的内嵌汇编、大型项目管理功能等
。相信GNU能成为越来越多开发人员的选择。
本文章来自中国IT实验室http://embed.chinaitlab.com/
举报
回复
支持
反对
返回列表
*
滑块验证:
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
注册会员
本版积分规则
发表回复
回帖后跳转到最后一页
回复
转播
评分
分享
打开支付宝扫一扫,最高立得1212元红包
搜索
本版
帖子
用户
热搜:
传感器
51串口程序
电子管放大器
夾式電表
夾式電流
Mentor论坛
打印机
版块推荐
百宝箱
My 布拉格
无边框Z9
Z9Max
Z9mini
nubia动态
问题 & 建议
资源分享
爱拍
同城会
牛仔生活
查看论坛所有版块>>
每日签到
论坛任务
摄影技巧
跳蚤市场
互助问答
论坛导读
申请内测
红包中心
每日摇一摇
活动中心
网站地图
官方旗舰店
图文热点
抗干扰LED数码管显示屏驱动芯片/3线串行接
VK1Q68D是一种带键盘扫描接口的数码管或点阵LED驱动控制专用芯片。内部集成有3线
抗干扰能力强/点阵数显LED屏驱动/数码管驱
VK1S68C是一种带键盘扫描接口的数码管或点阵LED驱动控制专用芯片,内部集成有3 线串
可支持14×4的点阵LED显示面板数码管LED驱
VK1624是一种数码管或点阵LED驱动控制专用芯片,内部集成有3线串行接口、数据锁 存
数显驱动器原厂-数显LED显示驱动芯片VK1620
VK1620B是一种数码管或点阵LED驱动控制专用芯片,内部集成有3线串行接口、 数据锁
抗干扰数显驱动数码管LED驱动芯片VK1618 SO
产品品牌:永嘉微电/VINKA 产品型号:VK1618 封装形式:SOP18/DIP18 概述 VK161
更多
精华推荐
抗干扰LED数码管显示屏驱动芯片/3线串行接
抗干扰能力强/点阵数显LED屏驱动/数码管驱
可支持14×4的点阵LED显示面板数码管LED驱
数显驱动器原厂-数显LED显示驱动芯片VK1620
抗干扰数显驱动数码管LED驱动芯片VK1618 SO
VK1616 SOP16/DIP16点阵LED数显驱动芯片/数
点阵数显驱动芯片/LED数码管显示屏驱动VK16
数显驱动电路LED显示驱动芯片VK1650 SOP16/
更多
社区学堂
抗干扰LED数码管显示屏驱动芯片/3线串
抗干扰能力强/点阵数显LED屏驱动/数码
抗干扰LED数码管显示屏驱动芯片/3线串行接
VK1Q68D是一种带键盘扫描接口的数码管或点阵LED驱动控制专用芯片。内部集成有3线
抗干扰能力强/点阵数显LED屏驱动/数码管驱
VK1S68C是一种带键盘扫描接口的数码管或点阵LED驱动控制专用芯片,内部集成有3 线串
可支持14×4的点阵LED显示面板数码管LED驱
VK1624是一种数码管或点阵LED驱动控制专用芯片,内部集成有3线串行接口、数据锁 存
更多
客服中心
QQ:187196467
服务时间:周一至周日 8:30-20:30
在线客服
客服微博
产品咨询
售后中心
关注我们
关于我们
关于我们
友情链接
联系我们
帮助中心
网友中心
购买须知
支付方式
服务支持
资源下载
售后服务
定制流程
关注我们
官方微博
官方空间
官方微信
QQ:187196467
周一到周日 8:30-22:00 (全年无休)
7 x 24小时在线客服
手机版
Powered by
MCUZX!
X3.4 © 2008-2015
MCU资讯论坛
版权所有
京ICP备18035221号-2
客服QQ: 187196467
技术支持:
MCU资讯论坛
|
网站地图
快速回复
返回顶部
返回列表