学习嵌入式开发——简介及搭建开发环境

嵌入式技术的发展经历了单片机(SCM)、微控制器(MCU)、系统级芯片(SoC)3个阶段。linux

SCM——随着大规模集成电路的出现及其发展,计算机的CPU、RAM、ROM、定时数器和多种I/O接口集成在一片芯片上,造成芯片级的计算机。c++

MCU——MCU的特征是知足各种嵌入式应用,根据对象系统要求扩展各类外围电路与接口电路,突显其对象的智能化控制能力。实际上,MCU、SCM之间的概念在平常工做中并不严格区分,一律以单片机称呼。随着可以运行更复杂软件(好比操做系统)的SoC的出现,“单片机”一般是指不运行操做系统、功能相对单一的嵌入式系统,但这不是绝对的。编程

SoC——SoC的特征是实现复杂系统功能的VLSI;采用超深亚微米工艺技术;使用一个以上嵌入式CPU/数字信号处理器(DSP);外部能够对芯片进行编程;主要采用第三方IP进行设计。ubuntu

嵌入式处理器种类繁多,有ARM、MIPS、PPC等多种架构。但因为ARM处理器的文档丰富,各种嵌入式软件大多支持ARM处理器,使用ARM开发板来学习嵌入式开发是一个好选择。windows

基于ARM的处理器以其高速度、低功耗、价格低等优势获得很是普遍的应用,它能够应用于如下领域:为无线通讯、消费电子、成像设备等产品提供可运行复杂操做系统的开放应用平台;在海量存储、汽车电子、工业控制和网络应用等领域提供实时嵌入式应用;安全系统,好比信用卡、SIM卡等。安全

ARM体系架构的版本就是它使用的指令集的版本。ARM架构支持32位的ARM指令集和16位的Thumb指令集,后者使得代码的存储空间大大减少。还提供了一些扩展功能,好比Java加速器(Jazelle)、用于提升安全性能的TrustZone技术 、智能能源管理(IEM),SIMD和NEONTM等技术。还在使用ARM指令集(ISA,Instruction Set Architecture)有如下版本:ARMv四、ARMv4T、ARMv5TE、ARMv5TEJ、ARMv六、ARMv7网络

后缀字母的含义:T表示支持Thumb指令集、D表示支持片上调试(Debug)、M表示内嵌硬件乘法器(Multiplier)、I支持片上断点和调试点、E表示支持加强型DSP功能、J表示支持Jazelle技术即Java加速器、S表示全合成式。这8个系列中,ARM七、ARM九、ARM9E、ARM10为通用处理器系列,每个系列提供一套相对独立的性能来知足不一样应用领域的需求。要了解更详细的信息请参考ARM公司的网站(http://www.arm.com)架构

随着技术的发展及人们需求的增长,各类消费类电子产品的功能愈来愈大,随身携带的电子设备变得“等同于PC”。当系统愈来愈大、应用愈来愈多,使用操做系统颇有必要,在嵌入式领域能够选择的操做系统有不少,好比嵌入式Linux、Vxworks、WindowsCE等等app


嵌入式Linux开发环境搭建函数

主机与目标板结合的交叉开发模式:即在PC主机上编辑、编译软件,而后在目标板上运行、验证程序。嵌入式设备的资源并不足以用来开发软件,所以都是采用主机与目标板结合的交叉开发模式开发软件。最初的嵌入式设备是一个空白的系统,须要经过主机为它构建基本的软件系统,并烧写到设备中。

对于开发板,进行嵌入式Linux开发时通常能够分为如下3个步骤:

  1. 在主机上编译Bootloader,而后经过JTAG烧入单板。经过JTAG接口烧写程序的效率很是低,它适用于烧写空白单板。为方便开发,一般选用具备串口传输、网络传输、烧写Flash功能的Bootloader,它能够快速地从主机获取可执行代码,而后烧入单板,或者直接运行

  2. 在主机上编译嵌入式Linux内核,经过Bootloader烧入单板或直接启动。一个能够在单板上运行的嵌入式Linux内核是进行后续开发的基础,为方便调试,内核应该支持网络文件系统(NFS),即将应用程序放在主机上,单板启动嵌入式Linux内核后,经过网络来获取程序,而后运行。

  3. 在主机上编译各种应用程序,单板启动内核后经过NFS运行它们,通过验证后再烧入单板。烧写、启动Bootloader后,就能够经过bootloader的各种命令来下载、烧写、运行程序了。启动嵌入式Linux后,也是经过执行各类命令来启动应用程序的,通常经过串口来进行输入/输出。因此交叉开发模式中,主机与目标板一般须要3种链接:JTAG、串口、网络。

通常只有在调试Bootloader时,才使用JTAG接口,所以一般状况下JTAG接口的使用不多:只须要烧写一次Bootloader——当它启动后,基本都是经过串口或网络下载程序,而后烧入单板。

开发板有以下部件:64MB SDRAM、1MB NOR Flash、64MB NANDFlash、两个网卡、5个串口、音频输入输出、2.5寸IDE接口、标准SD/MMC卡座、4个GPIO按键、外接I2C接口的实时时钟RTC芯片。

将主机与目标板经过JTAG、串口线(接单板上的串口0)、网线(接单板上的网卡0)链接起来,将各种设备链接到目标板上去便可完成硬件开发环境的搭建,接下来继续软件环境的搭建便可。

安装一个Linux操做系统,安装方法有以下几种:光盘安装、硬盘安装、网络安装(FTP、HTTP、NFS等)

安装完成后,须要配置Linux的FTP、SSH、NFS这3个服务、配置网络IP等

在Linux上配置软件维护工具,以下:

ubuntu的apt-get:修改/etc/apt/sources.ist,把其中注释掉的网址打开;使用sudo apt-get update更新可用的程序列表。

ubuntu隐藏了root用户,也就是说不能使用root用户登陆,这能够避免不当心使用root权限而致使系统崩溃。当须要使用root权限时,使用sudo命令,好比要修改/etc/exports文件,修改命令以下:#sudo vi /etc/exports。

使用光盘安装的Ubuntu7.10是一个比较精简的Linux发行版,它缺少一些开发用的工具、文件,好比标准C库的头文件、g++编译器等。所以须要检查安装这些工具文件,使用命令安装基本的开发环境:

ubuntu: $sudo apt-get install build-essential    基本开发环境

                 $sudo apt-get install bison flex        bison和flex分别是语法、词法分析器。

                 $sudo apt-get install manpages-dev    安装C函数库的man手册

其光盘内容分为8部分:硬件实验(hardware)、系统移植(system)、驱动和测试程序(drivers_and_test)、GUI、工具(tools)、scratchbox(也是一个工具)、网络文件系统(nfs_root)、调试工具(debug)。

hardware目录下是各个硬件部件的实验代码,进入子目录后执行make命令便可生成可执行二进制程序(名字为子目录名架上后缀“.bin”),烧入开发板的NAND Flash中便可运行。

U-Boot、Linux内核、根据busybox建立的文件系统这3部分构成了基本的、最小的嵌入式Linux系统,它们的代码在system目录下。后面介绍的驱动也所有包含在system/linux-2.6.22内核代码中,drivers_and_test主要是测试程序。

两种GUI系统:qtopia、X window。GUI/xwindow目录下有4个子目录:X目录中主要是Xorg的代码,它提供X Server;matchbox是一个基于X的、用于嵌入式系统的小型GUI环境,它包括一个窗口管理器、一个面板、一个桌面、一个共享功能程序库和一些小的面板应用程序;GTK目录下是GTK+库,GTK+是一个用于建立图形用户界面的多平台工具,它包含有基本的控件和一些很复杂的控件,好比文件选择控件和颜色选择控件;apps目录下是几个基于X、GTK+的应用程序。

tools目录下是运行于主机上的工具,主要是交叉编译工具。arm-linux-gcc-3.4.5-glibc-2.3.6.tar.bz2和scratchbox-arm-linux-gcc-3.4.5-glibc-2.3.6.tar.bz2都是使用create_crosstools目录中的软件编译出来的交叉编译工具链,前一个是在主机上直接运行;后一个是当主机上启动scratchbox后,在scratchbox里面运行。这两个工具编译出来的代码是彻底同样的。

scratchbox是一个交叉编译工具包,它的目的是使嵌入式Linux开发变得像开发PC Linux软件同样容易。在移植X windows时将用到它。

nfs_root目录下是4个子目录:最小的根文件系统fs_mini、使用mdev机制的根文件系统fs_min_mdev、含有qtopia图形程序的根文件系统fs_qtopia、含有X window图形程序的根文件系统fs_xwindow。在开发阶段,单板上的内核启动后能够经过NFS挂载它们中的某一个,而后执行其中的程序:开发完成后,将所用的整个子目录制做为映像文件,烧入开发板。

安装光盘:

$sudo chown book:book /work -R            改变/work目录的拥有者及所属组名

将光盘中的全部内容复制到Linux的/work目录中,有如下方法:使用ftp上传、在VMware挂载光盘、

安装交叉编译工具链

首先约定:在主机上执行的命令提示符为“$";在主机中启动scratchbox,而后在scratchbox里执行的命令,提示符为“〉”;在单板上执行的命令,提示符为"#"。

刚开始学习时,建议使用已经制做好的工具链,使用如下命令解压获得gcc-3.4.5-glibc-2.3.6目录。

$cd /work/tools

$ tar xjf arm-linux-gcc-3.4.5-glibc-2.3.6.tar.bz2

而后在环境变量PATH中增长路径,以下所示:

$export PATH=$PATH:/work/tools/gcc-3.4.5-glibc-2.3.6/bin

这使得能够直接运行这个目录下的程序,而不须要指定目录位置。

为了避免用每次使用时都手动设置PATH,能够在/etc/environment中修改PATH的值以下所示:

PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/work/tools/gcc-3.4.5-glibc-2.3.6/bin"

安装ncurses,它是一个能提供功能键定义(快捷键)、屏幕绘制以及基于文本终端的图形互动功能的动态库。若是没有它,在执行make menuconfig命令配置程序时会出错。使用如下命令安装:

$cd /work/tools

$tar xzf ncureses.tar.gz

$cd ncureses-5.6

$./configure --with-shared --prefix=/usr

$make

$make install

本身制做工具链

用户也能够本身编译工具链。若是要基于gcc和glibc来制做工具链,可使用crosstool来进行编译;若是要基于gcc和uClibc来制做工具链,可使用buildroot来进行编译。若是不借助于这些工具,编译过程是很是繁琐的。uClibc比glibc小,在已有的接口上是兼容的,更适用于嵌入式系统。但uClibc并无包括glibc中的全部接口实现,所以有些硬哟你个可能在uClibc中不能编译。基于这个缘由,初始学习使用glibc会比较好。

编译安装crosstool:

$tar xzf crosstool-0.43.tar.gz

$cp glibc-2.3.6-version-info.h_err.path crosstool-0.43/patches/glibc-2.3.6/

执行demo-arm-softfloat.sh脚本后,它将根据arm-softfloat.dat、gcc-3.4.5-glibc-2.3.6.dat这两个文件中定义的环境变量调用all.sh脚本进行编译。gcc-3.4.5-glibc-2.3.6.dat文件指明了要下载或使用的文件。

须要修改demo-arm-softfloat.sh、arm-softfloat.dat、all.sh这3个文件。

demo-arm-softfloat.sh:

        TARBALLS_DIR=/work/tools/create_crosstools/src_gcc_glibc

        RESULT_TOP=/work/tools

arm-softfloat.dat:

        TARGET=arm-linux        表示编译出来的工具样式为arm-linux-gcc、arm-linux-ld等

all.sh:

        PREFIX=${PREIX-$RESULT_TOP/$TOOLCOMBO}

编译、安装工具链:

$cd crosstool-0.43/

$./demo-arm-softfloat.sh            编译二、3个小时后,将在/work/tools目录下生成gcc-3.4.5-glibc-2.3.6子ulu ,交叉编译器、库、头文件都包含在里面。设置PATH环境变量便可使用。使用西面命令测评一下:

$arm-linux-gcc -v

至此,基本的开发环境已经创建,在后续开发过程当中,要使用到其余工具时,再进行安装。

 

编译器介绍:

GCC是一组编译工具的总称 ,其软件包里包含众多的工具,按其类型,主要有如下的分类:

  1. C编译器—— cc, ccl, cclplus, gcc

  2. C++编译器 —— c++. cclplus, g++

  3. 源码预处理程序—— cpp, cpp0

  4. 库文件 —— libgcc.a, libgcc_eh.a, libgcc_s.so, libiberty.a, libstdc++.[a,so], libsupc++.a

 

汇编器介绍:

Linux平台的标准汇编器是GAS,它是GCC所依赖的后台汇编工具,一般包含在binutils软件包中。GAS使用标准的AT&T汇编语法,能够用来汇编用AT&T格式编写的程序。

 

链接器介绍:

GNU链接器使用一个命令语言脚原本控制链接过程。默认状况下,ld是由一组内部命令进行控制的,这些命令能够进行扩展或覆盖。

 

调试器介绍:

GDB调试器是一个用来调试C和C++程序的调试器(Debugger)。

 

Linux编程库:
libc.so

libdl.so

libglib.so

libm.so

相关文章
相关标签/搜索