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

旧城冷巷雨未停 提交于 2019-12-01 23:56:52

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

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

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

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

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

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

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

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

随着技术的发展及人们需求的增加,各种消费类电子产品的功能越来越大,随身携带的电子设备变得“等同于PC”。当系统越来越大、应用越来越多,使用操作系统很有必要,在嵌入式领域可以选择的操作系统有很多,比如嵌入式Linux、Vxworks、WindowsCE等等


嵌入式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            编译2、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






易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!