基于ARM的嵌入式一般流程概括.docx
《基于ARM的嵌入式一般流程概括.docx》由会员分享,可在线阅读,更多相关《基于ARM的嵌入式一般流程概括.docx(23页珍藏版)》请在冰豆网上搜索。
基于ARM的嵌入式一般流程概括
第一章—嵌入式开发概述
1.什么是嵌入式系统:
嵌入式系统就是指以应用为中心,以计算机技术为基础,软硬件可裁剪,适合应用系统对功能、可靠性、成本、体积、功耗等(严格)要求的一种专用计算机系统。
手机、洗衣机、高端武器
2.嵌入式系统特点和应用领域:
它一般由以下几部分组成:
1)嵌入式微处理器
2)外围硬件设备
3)嵌入式操作系统
4)特定的应用程序
其特点为:
专用、灵活性、小巧轻便、成本低、功耗低、效率高
其只要应用领域为:
常见的一些嵌入式产品主要有如下产品:
网络设备:
交换机、路由器
消费电子:
手机、MP3、PDA、可视电话、电视机顶盒、数字电视、数码照相机、数码摄像机、信息家电
办公设备:
打印机、传真机、扫描仪
汽车电子:
ABS(防死锁刹车系统)、车载GPS。
其他设备:
自动售货机、ATM
3.嵌入式系统的历史和前景:
⏹20世纪70年代:
单片机出现
⏹20世纪80年代:
嵌入式操作系统出现
⏹20世纪90年代:
实时多任务操作系统
随着计算机技术、互联网技术及纳米微电子技术的突破,将来我们接触的每一样东西都将装有芯片和嵌入式软件,所以嵌入式系统存在着巨大的商机;计算机产业是垄断,但是可以应用于各种不同应用领域的嵌入式系统是不可能被垄断的,所以留给各个行业的中小规模高技术公司的创新余地很大
4.嵌入式系统的构架:
嵌入式一般有以下几部分组成:
1)嵌入式微处理器
2)外围硬件设备
3)嵌入式操作系统
4)特定的应用程序
5.嵌入式处理器:
嵌入式处理器主要有以下三种:
1)ARM(ARM公司
2)PowePC(Motorola公司)
3)MIPS(MIPS公司)
arm就是该公司设计的嵌入式微处理器核心,arm后面的数字越大越高级,卖给了Intel公司之后intel公司在此基础上又融合了一些新的设计,就出现了strongarm,xscale等。
我们上课的开发板是三星公司生产的S3c2410,其核心处理器是arm9。
ARM现有的系统构架有ARM7,ARM9,ARM11。
6.嵌入式系统:
在嵌入式系统中流行的操作系统有很多。
比较有名的是wince,linux、uclinux、linux的ecos、ucos、palm、vxworks、qnx等。
由于linux免费且公开源代码,成为了大家的首选。
uclinux跟linux的区别:
uclinux不带mmu(内存管理单元),所以uclinux使用在那些不带mmu功能的处理器芯片里,如s3c44x0。
7.嵌入式开发:
开发板就是以ARM处理器为核心,添加了一些外围资源,比如说ROM、RAM、USB口、LCD液晶显示屏、LED灯等等,其实跟一台PC机差不多。
实验室常见的有:
三星的smdk2410和Intel的Sitsang
smdk2410的处理器是三星公司s3c2410,200M的主频,32MB的RAM,32MB的ROM。
而我们使用的开发板是北京博创公司的up-netarm2410-s开发平台。
8.嵌入式开发流程:
嵌入式开发,我们一般都是在PC上写好程序,然后交叉编译生成可执行文件,通过数据线(如串口线、网线)下载到ARM开发板上运行。
实际运行在开发板上进行,成功后,对开发板进行裁减。
一些没有用到的硬件就可以不用了。
画PCB板,制版,移植软件,成品。
宿主机(开发平台)目标机(运行平台)
宿主机采用Linux系统(RedHat6.0)目标板采用修剪过的Linux嵌入式系统。
串口线通常用于在烧写系统用,网线用于传输应用程序用。
9.宿主机LINUX简介:
Linux是一个网络操作系统。
它是由以LinusTorvalds为首的一批Internet上的志愿者开发的,完全免费,并与另一著名的网络操作系统UNIX完全兼容,是一个具有很高性能价格比的可剪裁的网络操作系统。
Linux的版本号又分为两部分:
内核(Kernel)版本和发行(Distribution)版本。
内核版本号由3个数字组成:
r,x,y。
r:
主版本号;x:
偶数(稳定版本)奇数(测试版本);y:
错误修补的次数。
Linux体系结构如下图:
Shell:
直接与系统内核进行交互,无语编译的语言,执行速度快,往往在Windows中需要就百行程序代码的操作,只需要简简单单的几个shell命令就行了。
Linux的发行版本很多,其中商业版本是需要购买的,但是大部分的Linux是非商业的,也就是说其不需要购买,用户只需要下载镜像文件,刻录成光盘,然后安装系统就可以了。
值得注意的是Linux的文件系统与我们常用的WINDOWS文件系统有着千差万别,他只有一个根目录。
下面节解释Linux中各个目录的重要意义:
1)/:
即文系统的根目录。
包含所有的其他目录。
2)/bin:
常用命令的执行规则的存放地
3)/boot:
系统启动时的内核文件和信息文件
4)/dev:
linux把外设都看成文件,对文件操作就是对外设操作
5)/etc:
系统的配置文件,修改这些文件即修改系统的配置
6)/home:
普通用户的根目录,用户的数据一般都放在这里
7)/lib:
存放系统启动时用到的链接库文件
8)/mnt:
额外系统文件的安装目录,如软驱和光驱的挂载地
9)/proc:
通过查看该目录里的文件可以了解系统的运行状况
10)/root:
root用户的主目录,一般用户没有将进入的权限
11)/sbin:
超级用户命令的执行规则存放地,普通的不能执行
12)/tmp:
临时文件存放地,和windows一样
13)/usr:
存放不需要修改的应用程序、文档等,占空间最大
10.宿主机LINUX简介:
目标也采用Linux系统,是常用的Linux系统的阉割版。
当然你也可以采用例如Wince等其他系统,但是Wince的内核是Microsoft独立拥有的,你想剪裁成自己想拥有,且体积不用那么大的内核是很难的,所以嵌入式多采用Linux,其开源,内核可裁剪的特性是其他嵌入式系统所不能拥有的。
Linux做嵌入式的优势,首先,Linux是开放源代码的,不存在黑箱技术,遍布全球的众多Linux爱好者。
Linux开发者的强大技术支持;其次,Linux的内核小、效率高,内核的更新嵌入式linux速度很快,linux是可以定制的,其系统内核最小只有约134KB。
Linux是免费的OS,在价格上极具竞争力。
Linux还有着嵌入式操作系统所需要的很多特色,突出的就是Linux适应于多种CPU和多种硬件平台,是一个跨平台的系统。
到目前为止,它可以支持二三十种CPU。
而且性能稳定,裁剪性很好,开发和使用都很容易。
很多CPU包括家电业芯片,都开始做Linux的平台移植工作。
移植的速度远远超过Java的开发环境。
也就是说,如果今天用Linux环境开发产品,那么将来换CPU就不会遇到困扰。
同时,Linux内核的结构在网络方面是非常完整的,Linux对网络中最常用的TCP/IP协议有最完备的支持。
提供了包括十兆、百兆、千兆的以太网络,以及无线网络,Tokerring(令牌环网)、光纤甚至卫星的支持。
所以Linux很适于做信息家电的开发。
还有使用Linux为的是来开发无线连接产品的开发者越来越多。
Linux在快速增长的无线连接应用主场中有一个非常重要的优势,就是有足够快的开发速度。
这是因为LInux有很多工具,并且Linux为众多程序员所熟悉。
因此,我们要在嵌入式系统中使用Linux操作系统。
Linux的大小适合嵌入式操作系统——Linux固有的模块性,适应性和可配置性,使得这很容易做到。
另外,Linux源码的实用性和成千上万的程序员热切期望它用于无数的嵌入式应用软件中,导致很多嵌入式Linux的出现,包括:
Embedix,ETLinux,LEM,LinuxRouterProject,LOAF,uCLinux,muLinux,ThinLinux,FirePlug,Linux和PizzaBoxLinux
相比微软,Linux的图形界面发展很快,像GNOME,KDE,UTITY等都是很优秀的桌面管理器,并且其背后有着众多的社团支持,可定制性强,已经在Unix和Linux世界普及开来。
第二章—宿主机系统开发环境建立
1.RedHat6.0系统建立
在XP系统下通过VM虚拟机来安装RedHat6.0系统。
1)安装VM虚拟机:
在网上下载VM7.0绿色版版本的虚拟机,解压到XP中即可使用。
2)到网上下载RedHat6.0桌面版,通过虚拟机安装到XP环境下。
(安装步骤网上都可以搜到,很容易实现)。
注意事项:
在选择网络连接的时候,要选择与桥接模式,而不要选择NAT模式。
3)安装VMtools:
VMtool是虚拟机中虚拟系统与现实系统之间交互的工具,安装VMtools后,其更容易与本地计算机进行交互。
用户可以从物理主机直接往虚拟机里面拖文件。
而且鼠标进入虚拟机后可以直接出来,不安装的话要按CTRL+ALT才可以释放鼠标。
另外会自动安装声卡驱动等等。
首先到网上下载对应版本的VMtools,注意是LINUX版本,而不是Windows版本,下载后通过虚拟机的虚拟光驱挂在到LINUX中,解压到Linux桌面。
然后,打开文件夹,查找有没有install.pl的文件,这是VMtools安装的脚本文件。
他的执行需要有可执行的权限,使用终端,输入chomd+xinstall.pl(终端切换到该文件夹),然后继续键入./install.pl来完成安装。
通过以上不步骤即可完成Redhat6.0以及VMtools的安装。
XP与Linux之间的文件传输方案有以下几种:
1)利用VM虚拟机传入,在VM设置中有一个共享文件夹。
2)利用VMTools,可以直接将文件从XP中拖拽到LINUX中
3)利用Xmanger中的Xshell与Linux进行交互,通过其中的文件传送功能,来传送文件到Linux(推荐)
宿主机Linux的C/C++编译环境建立
安装好的Linux如果是不包含g++编译器或者是build-essential(包含C和C++头文件库)。
可以到晚上下载对应的RPM包安装到系统。
通过编写一个简单的C/C++程序,例如hello.cpp,在终端cd到源程序文件夹,键入g++hello.cpp–ohello来检查是否安装好编译器和build-essential
2.宿主机Linux的交叉编译器安装
安装交叉编译器。
所谓的交叉编译器就是简单地说,就是在一个平台上生成另一个平台上的可执行代码。
这里需要注意的是所谓平台,实际上包含两个概念:
体系结构(Architecture)、操作系统(OperatingSystem)。
同一个体系结构可以运行不同的操作系统;同样,同一个操作系统也可以在不同的体系结构上运行。
举例来说,我们常说的x86Linux平台实际上是Intelx86体系结构和Linuxforx86操作系统的统称;而x86WinNT平台实际上是Intelx86体系结构和WindowsNTforx86操作系统的简称。
有时是因为目的平台上不允许或不能够安装我们所需要的编译器,而我们又需要这个编译器的某些特征;有时是因为目的平台上的资源贫乏,无法运行我们所需要编译器;有时又是因为目的平台还没有建立,连操作系统都没有,根本谈不上运行什么编译器。
交叉编译器安装主要有两种发法:
1)arm-linux-gcc:
利用nfs或者文件夹共享,将配好的redhatlinux中opt/crosstools文件夹考到本地linux中opt目录下,修改/root/.bash_profile文件或者利用共享覆盖(PATH=$path:
$home/bin/:
…………),注销登录。
2)armv4l-unknown-linux-gcc:
拷贝armv4l-unknown-linux-gcc的安装包,tar–zvjx来解压缩安装包,在安装的文件夹下,利用终端安装./install.sh,然后利用方法1中来修改/root/.bash_profile文件。
第三章—目标机最小系统的建立和安装
目标机中的Linux的运行离不开三个主要的核心,首先是bootloader,然后是kernel,最后是filesystem,且这个次序是不可以更改的。
在建立目标机环境之前,我们要了解如何与目标板进行交互,以及如何目标机之间进行文件传输。
交互方案:
1)利用XP自带的超级终端来进行交互,其要就宿主机和目标级之间利用串口连接,然后在超级终端建立过程中注意以下设置,第一端口号要选择115200,硬件要选择无。
2)利用软件xshell进行交互,xshell是Xmanger中的一部分功能,其功能类似超级终端,而且他可以利用其带有的一个小功能实现xp和Linux系统之间的文件传输。
3)通过在虚拟机的LINUX中设置NFS服务器,在目标机中使用mount来挂在这个文件夹。
eg:
宿主机IP:
192.168.1.61目标机IP:
192.168.1.71,在linux中配置NFS服务器,然后servicenfsrestart。
通过xshell与目标机交互,然后输入mount192.168.1.61:
/XXX/XXX(共享文件夹)/mnt/nfs
1.bootloader建立和烧写
基础准备知识:
1)PC机的引导装载程序:
普通pc体结构中,引导装载程序一般分为BIOS和操作系统bootloader两部分,bios负责完成硬件的检测和资源分配;而bootloader的任务是将操作系统内核从硬盘上读入RAM中,然后跳转到内核的入口点,从而启动操作系统。
2)嵌入式系统的启动:
由于受硬件资源的限制,通常没有bios,所以整个系统的加载启动全部由bootloader完成。
3)bootloader的基本概念:
BootLoader就是在操作系统内核运行之前运行的一段小程序。
通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的
软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。
Bootloader是一段可执行程序,完成的主要功能是将操作系统搬移到内存中,然后将控制权交给操作系统。
4)开放源代码的Linux引导程序:
U-Boot已经能够支持PowerPC、ARM、X86、MIPS体系结构的上百种开发板,已经成为功能最多、灵活性最强并且开发最积极的开放源码Bootloader。
在我们所学的课中主要是使用U-Boot来实现引导的。
5)bootloader的结构框架(工作过程):
大多数bootloader都分为两个部分stage1和stage2
Stage1:
主要作用是基本硬件的初始化,其中包括①屏蔽所有中断②设置cpu的度和时钟频率③RAM初始化④初始化LED。
为加载stage2准备RAM空间,并且为拷贝stage2内容到RAM空间,设置堆栈指针并跳转到stage2的C入口点。
Stage2:
初始化本阶段要使用的硬件设备(如:
串口、网卡等,成功驱动后,可以输出一些打印信息。
),检测系统的内存映射,加载内核映像和根文件系统映像,设置内核的启动参数,调用内核。
通过U-Boot移植适合s3c2410的bootlater:
通常,BootLoader是严重地依赖于硬件而实现的,特别是在嵌入式世界。
因此,在嵌入式世界里建立一个通用的BootLoader几乎是不可能的。
尽管如此,我们仍然可以对BootLoader归纳出一些通用的概念来,以指导用户特定的BootLoader设计与实现。
U-Boot已经能够支持PowerPC、ARM、X86、MIPS体系结构的上百种开发板,已经成为功能最多、灵活性最强并且开发最积极的开放源码Bootloader
为我们的开发板建立bootloader可移植文件,开发板名字为:
up2410,其主要的移植过程大致有以下几步:
1、修改Makefile文件,2、建立板级支持包,3、建立配置文件(修改),4、修改源文件支持从nand启动,5、编译生成u-boot.bin。
(其详细内容参见实验指导书)
Bootloader的烧写:
一个编译好的bootloader叫做VIVI,一个空白的开发板是没有任何程序的,没有Bootloader,没有内核,也没有文件系统,所以他只能通过并口线来烧写VIVI。
其过程如下:
①把并口线插到pc机的并口,并把并口与JTAG相连,JTAG与开发板
的14针JTAT口相连,打开2410-S.②把整个GIVEIO目录(在\Linux-V6.0\img\flashvivi目录下)拷贝到C:
\WINDOWS下,并把该目录下的giveio.sys文件拷贝到
c:
/windows/system32/drivers下。
③在控制面板里,选添加硬件>下一步>选-是我已经连接了此硬件>下一步>选中-添加新的硬件设备>下一步>选中安装我手动从列表选择的硬件>下一步>选择-显示所有设备>选择-从磁盘安装-浏览,指定驱动为C:
\WINDOWS\GIVEIO\giveio.inf文件,点击确定,安装好驱动④在d盘新建一目录bootloader,把sjf2410-s(在\Linux-V6.0\img\flashvivi目录下)和要烧写的vivi拷贝到该目录下,在程序-附件-msdos下,进入该目录,运行sjf2410-s命令如下:
sjf2410-s/f:
vivi
在此后出现的三次要求输入参数,第一次是让选择Flash,选0;第二次是选择jtag对flash的两种功能,也选0;第三次是让选择起始地址,选0此后就等待大约3-5分钟的烧写时间,当VIVI烧写完毕后选择参数2,退出烧写。
2.内核建立和烧写
内核简介:
内核是所有linux系统的中心软件组件。
嵌入式领域所说的linux,一般是指linux内核。
移植也是指的是移植linux内核到目标平台。
内核的目录结构也包括以下部分:
①arch:
包含和硬件体系结构相关的代码,每种平台占一个相应目录。
如arm、avr32、blackfin、mips等。
②include:
头文件存放目录。
与系统相关的头文件放在include/linux下与ARM体系结构相关头文件放在include/asm-arm下。
③kernel:
内核的核心代码,包括进程调度、定时器等。
和arm平台相关的核心代码在arch/arm/kernel目录下。
④mm:
内存管理代码,和arm平台相关的内核管理代码在arch/arm/mm目录下。
⑤drivers:
设备驱动程序,其下细分为不同种类的设备。
如block、char、mtd、net、usb、video等。
⑥fs:
内核支持的文件系统的实现,如ext2、ext3、cramfs、jffs2、nfs等。
⑦init:
内核初始化代码。
⑧net:
网络相关代码,实现各种常见的网络协议。
⑨scripts:
包含用于配置内核的各种脚本文件。
只在配置时是有意义的。
内核移植涉及文件分布介绍:
①内核移植涉及的头文件:
linux-2.6.18.8/include/asm-arm(与处理器相关的头文件
);linux-2.6.18.8/include/linux(和处理器无关的头文件)
②内核移植涉及的源文件:
linux-2.6.18.8/arch/arm/tools/mach-types
(Mach-types文件定义了不同系统平台的系统平台号。
移植linux内核到新的平台上需要对新的平台登记系统平台号。
编译时根据平台号选择不同的.h文件)
linux-2.6.18.8/arch/arm/boot/compressed
(Head.s是内核映像的入口代码,是自引导程序。
包含了一些与体系结构相关的初始化程序,之后,调用misc.c文件中的decompress_kernel()函数解压缩内核映像到指定的位置,然后跳转到kernel的入口地址。
)
linux-2.6.18.8/arch/arm/kernel
(内核入口处也是由一段汇编语言实现的,由head.s和head-common.s两个文件组成。
Head.s是内核的入口文件,在head.s的末尾处#include“head-common.S”。
主要是完成cpu和体系结构的检查及cpu的初始化;之后跳转到linux-2.6.18.8/init/main.c中的start_kernel()函数中,开始内核的基本初始化过程)
linux-2.6.18.8/arch/arm/mach-s3c2410
(这个目录中的文件都是板级相关的,其中比较
重要是如下几个:
linux/arch/arm/mach-s3c2410/cpu.c
linux/arch/arm/plat-s3c24xx/common-smdk.c
linux/arch/arm/mach-s3c2410/devs.c
linux/arch/arm/mach-s3c2410/mach-smdk2410.c
linux/arch/arm/mach-s3c2410/Makefile.boot
linux/arch/arm/mach-s3c2410/s3c2410.c)
内核镜像文件zImage生成:
①配置:
makemenuconfig:
选择体系结构、文件系统支持及其他功能的选择,配置的目的是减小内核大小。
makemenuconfig采用目录结构选择配置的方式,这些目录由各子目录中的kconfig产生。
我们在配置内核时所做的任何修改,最终都会在.config文件中体现出来。
②编译:
make
③.config文件:
这是linux编译时所依赖的文件。
我们在配置内核时所做的任何修改,最终都会在这个文件中体现出来。
它是Makefile对内核进行处理的重要依据。
一般来说,内核提供了芯片公司demo板的.config文件,我们一般找一个近似的进行修改。
如S3C2410平台上可以选择s3c2410_deconfig这个文件。
三种配置方式:
①makeconfig:
基于文本对话的配置方式,比较细致,但是浪费时间。
对专业的内核开发人员比较合适。
②makexconfig:
基于图形界面的配置方式。
非常直观,但是需要特殊的软件支持,一般不推荐
③makemenuconfig:
推荐的内核配置方式,采用目录的方式,直观,容易使用。
④Makefile文件:
用于编译生成最终的内核可执行连接文件。
Linux内核源码的每个目录下都有一个Makefile,由该Makefile对源代码的编译、链接等操作进行控制。
编译完成后,每个源代码目录下都会生成一个名叫built-in.o的文件。
这个文件由源代码目录下的所有源文件编译后的目标文件链接而成;而不同的built-in.o又被上层目录中的Makefile链接成更大的built-in.o,直到最后链接成为一个内核vmlinux.o。
内核的移植:
①设置交叉编译环境:
修改内核的顶层Makefile,ARCH?
=armCROSS_COMPILE?
=arm-linux-
②获得.config文件:
.config是内核编译时所依赖的重要文件,与具体的硬件构架和开发板类型相关。
我们选择内核提供的s3c2410_defconfig进行修改。
cparch/arm/configs/s3c2410_defconfig.