您好,  [请登录] [QQ登录]  [支付宝登录[免费注册]

商品分类

分享到: 百度搜藏 搜狐微博 新浪微博 腾讯微博 QQ收藏 人人网 Facebook Twitter

用GNU东西开辟基于ARM的嵌入式体系

发布日期:2011-04-17

         本文先容怎样利用GNU的东西开辟基于ARM的嵌入式体系,以及利用编译器、连接器和调试东西的详细要领,为宽大嵌入式体系开辟职员提供一种低本钱的开辟本领。
   

        当前,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控制器,图略。

       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东西编译。ARMLinux已有很多成熟的版本,可以支持ARM720、ARM920、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东西,同样必要通过串口与上位机上的gdb通讯,对目标板的Linux内核举行调试。由于篇幅所限,感兴趣的读者可以从http://oss.sgi.com/projects/kgdb/上相识详细的利用要领。

   结束语

  本文以一个详细的实例为例,对GNU东西中的常用成果作了先容。着实GNU东西的成果还远不止这些,更进一步的操纵有:针对差别处理惩罚器,差别算法的软件优化、高效的内嵌汇编、大型项目办理成果等。信托GNU能成为越来越多开辟职员的选择。