第一篇:基于ATMEL AT91RM9200的嵌入式Linux移植笔记
初学嵌入式Linux,感觉需要学习的东西太多了。把学习过程中的收获和问题记录在这里,算是一份经验吧。
2006-08-10 前面利用开发板带的现成的东西step by step让Linux 2.4.19在开发板上跑起来了,对于开发的流程也有了一定的认识。现在想对每一步进行详细深入的探讨,好好学习一下,把笔记记录下来,省得忘记了。有些内容是从看过的书中摘要过来的,大部分是自己实践后的心得。我想记得详细点,也好为后面总结打好基础。
先谈一下对于嵌入式开发流程和嵌入式开发环境拓扑结构的认识。
刚开始比较盲目,看得书也不多,现在才算是大体上有了些了解。从开发产品的角度简单的描述如下:
一、嵌入式开发流程简介
假设我们现在进行一项嵌入式开产品的开发,比如说智能电力系统终端,那么我想首先应该对完整的开发流程有一个大致的了解,才不致于在以后的工作中被动。下面对嵌入式linux开发简单的介绍一下。
1、系统的需求分析
2、硬件平台的选择和设计
3、软件开发
(3-1)建立开发环境。(3-2)引导装载程序。(3-3)内核裁减与编译。(3-4)建立文件系统。(3-5)应用程序开发。
图1 因为我想要做的是软件开发,所以对前两步就不作深入探索了。只想要对软件开发的每一步熟悉起来,让我定制的系统跑得稳定,开发的程序能很好的完成其功能。这是个很艰巨的任务,万里长征刚刚走了第一步:)
二、嵌入式开发环境拓扑结构简介
嵌入式开发环境一般由:宿主机(Linux Server)、工作站、嵌入式目标系统(target board)和将它们连在一起的网络环境。
1、linux server:嵌入式linux内核编译、应用程序编译的公共平台,有单独的一台pc机充当,安装标准的linux操作系统,比如redhat,debian等等。
2、工作站:为普通局域网计算机,以支持小组项目开发。工作站一般安装windows,需要linux服务器时,可以从工作站远程登陆到linux server。
3、target board:这是需要开发的最终产品,可以根据需要与工作站连接(通常通过串口或者usb接口),或连至局域网。
4、工作站需要安装ftp客户端(cuteftp、flashfxp等)和telnet客户端程序(secureCRT等),linux服务器应该开通ftp和telnet服务,还有ssh。综述过程:开发人员在一台工作站进行操作,通过远程登陆的方式操作linux server,并且使用ftp在linux server和工作站进行文件传输,同时target board需要与网络连接,其串口与工作站的RS232接口连接。使用工作站上的超级终端作为嵌入式目标系统输入/输出端。
对于开发流程有了一定的了解后就有了目标,这样才能够不是太郁闷。我的开发环境:Windows XP SP2+VMWARE+RedHat 9.0
首先规划一下,我先建立了一个用户armlinux,我的全部工作都是在这个用户根目录下完成。$pwd /home/armlinux $mkdir bootloader debug images software source kernel rootfiles sysapps tmp tools program $ls bootloader images program software sysapps tools debug kernel rootfiles source tmp 然后建立环境变量,直接在.bash_profile中改就可以了。
#.bash_profile
# Get the aliases and functions if [-f ~/.bashrc ];then.~/.bashrc fi # User specific environment and startup programs export TARGET=arm-linux export PRJROOT=/home/armlinux export PREFIX=${PRJROOT}/tools export TARGET_PREFIX=${PREFIX}/${TARGET} export PATH=$PATH:$HOME/bin:$PREFIX/bin:/sbin:/usr/sbin:/usr/local/sbin
unset USERNAME
这样在下一次进入此用户时,环境变量就生效了。如果想立刻生效,那么可以用下面的命令:$source.bash_profile。这种方法可以使这些环境变量在进入用户armlinux后就会成效,比较方便。
三、建立交叉编译环境
这一步工作我已经很顺利的完成了。刚开始时,手动建立交叉编译工具链,很困难,出现了很多问题,幸亏网上有不少的资料可以参考。关于手动建立交叉编译工具链的过程我已经做了总结,放到blog上了。现在可以获得已经编译好的工具链,这样比较方便些,毕竟几个小时的手动建立过程太繁琐,太容易出错了。3.1 获取交叉编译工具链
网站:http://www.xiexiebang.com.uk 在linux server上以ftp方式登陆: #ftp ftp.arm.linux.org.uk
这是系统提示输入用户名和密码,不要随便输,那样可能会连接失败。该ftp站点是允许匿名访问的,所以你可以用下面的用户名:anonymous登陆,密码无,直接回车就可以了。进入后执行:
ftp>cd pub/armlinux/toolchain/ ftp>bin ftp>get cross-2.95.3.tar.bz2 ftp>get cross-3.0.tar.bz2 ftp>get cross-3.2.tar.bz2 ftp>get README ftp>bye Linux 2.4.xx及其以下的内核源码用2.95.3的交叉编译器来编译就可以了;而2.6.xx的内核源码一般要用到cross-3.x以上的版本来编译。所以我全都下载下来了,备用。要想用更新的版本,则可以到网站ftp://ftp.handhelds.org/projects/toolchain下载,这里可以下在到cross-3.3.2和cross-3.4.1,默认路径是/usr/local/arm/<版本号>。
从手动编译就可以知道,根据环境变量PREFIX指定了安装目标文件夹,那么上面提供的编译好的工具链也必须安装到指定的文件夹才可以使用。可以在README中知道安装方法:
This works for both gcc-2.95.3 and gcc-3.0.How to install: cd /usr/local mkdir arm cd arm tar Ixvf cross-
#.bash_profile # Get the aliases and functions if [-f ~/.bashrc ];then.~/.bashrc fi # User specific environment and startup programs export TARGET=arm-linux export PRJROOT=/home/armlinux export PREFIX=${PRJROOT}/tools export TARGET_PREFIX=${PREFIX}/${TARGET} export PATH=$PATH:$HOME/bin:$PREFIX/bin:/usr/local/arm/2.95.3/bin:/sbin:/usr/sbin:/usr/local/sbin unset USERNAME
看见红色的行就是修改好的。只需要把你的路径添加到后面就可以了。这样可以验证一下了。
验证: $cd $cd program $vi hello.c------------#include
$arm-linux-gcc hello.c-o hello-arm $file hello-arm hello-arm: ELF 32-bit LSB executable, ARM, version 1(ARM), for GNU/Linux 2.0.0, dynamically linked(uses shared libs), not stripped 这就说明生成的hello-arm是可以工作在ARM平台上的,也证明了你的交叉编译工具链是有效并且可用的。
在下载的2.95.3的工具链中没有包含调试工具gdb和目标板的gdbserver。在这里一起搭建好。
首先从ftp://ftp.gnu.org/gnu/gdb中获得gdb套件。解压缩关于路径就不多说了。$cd $cd debug $mkdir build-gdb build-gdbserver $cd $cd software $tar xvzf../source/gdb-5.2.1/configure--target=$TARGET--prefix=$PREFIX $make $make install 这样就可以顺利的完成gdb-5.2.1的安装了。
要想对目标板进行交叉编译,gdb显得太大了些,所以需要gdbserver。下面建立gdbserver。$cd $cd debug/build-gdbserver $chmod +x../../software/gdb-5.2.1/gdb/gdbserver/configure $CC=arm-linux-gcc../../software/gdb-5.2.1/gdb/gdbserver/configure--host=$TARGET--prefix=$TARGET_PREFIX $make $make install n=`echo gdbserver | sed 's,x,x,'`;if [ x$n = x ];then n=gdbserver;else true;fi;/usr/bin/install-c gdbserver /home/armlinux/tools/arm-linux/bin/$n;/usr/bin/install-c-m 644../../software/gdb-5.2.1/gdb/gdbserver/gdbserver.1 /home/armlinux/tools/arm-linux/man/man1/$n.1 /usr/bin/install: 无法创建一般文件‘/home/armlinux/tools/arm-linux/bin/gdbserver’: 没有那个文件或目录 /usr/bin/install: 无法创建一般文件‘/home/armlinux/tools/arm-linux/man/man1/gdbserver.1’: 没有那个文件或目录
make: *** [install-only] Error 1 此处错误不难理解,主要是因为交叉编译工具放到/usr/local/arm里面了。前面的安装目录tools里面缺少几个文件夹,只需要建立就可以了。$cd $PRJROOT/tools $mkdir arm-linux $cd arm-linux $mkdir bin man $cd man $mkdir man1 $cd $PRJROOT/debug/build-gdbserver $make install 这样就没有问题了,当然也可以修改makefile,但是自己还没有学好shell语言,所以采取上述方法解决了。这样首先用strip处理一下,目的是gdbserver不需要附带上调试的信息,把它们都剥离去就是了。$arm-linux-strip $TARGET_PREFIX/bin/gdbserver $ls-l $TARGET_PREFIX/bin/ 总用量 24-rwxr-xr-x 1 armlinux armlinux 23132 8月 10 11:33 gdbserver 也就是说,gdbserver经过strip处理之后还剩下23KB多一点,已经挺小了,适合目标板了。附:
在CU论坛上看到tree工具可以查看目录树,觉得不错。也想要安装一个。$cd $cd source $ftp mama.indstate.edu Connected to mama.indstate.edu(139.102.70.201).220 ProFTPD 1.3.0 Server(ProFTPD Default Installation)[139.102.70.201] Name(mama.indstate.edu:armlinux): anonymous 331 Anonymous login ok, send your complete email address as your password.Password: 230 Anonymous access granted, restrictions apply.Remote system type is UNIX.Using binary mode to transfer files.ftp> cd linux/tree 250 CWD command successful ftp> ls 227 Entering Passive Mode(139,102,70,201,149,53).150 Opening ASCII mode data connection for file list drwxr-xr-x 2 root root 4096 Jun 4 2001 binary drwxr-xr-x 2 root root 4096 May 19 1999 slack-rw-r--r--1 root root 406 Oct 11 1996 tree-1.1.lsm-rw-r--r--1 root root 13135 Oct 11 1996 tree-1.1.tgz-rw-r--r--1 root root 405 Jan 6 1997 tree-1.2.lsm-rw-r--r--1 root root 16362 Jan 6 1997 tree-1.2.tgz-rw-r--r--1 root root 436 Feb 21 2002 tree-1.3.lsm-rw-r--r--1 root root 25060 Feb 21 2002 tree-1.3.tgz-rw-r--r--1 root root 432 Feb 21 2002 tree-1.4b1.lsm-rw-r--r--1 root root 27536 Feb 21 2002 tree-1.4b1.tgz-rw-r--r--1 root root 27891 Mar 25 2002 tree-1.4b2.tgz-rw-r--r--1 root root 432 Jun 18 2003 tree-1.4b3.lsm-rw-r--r--1 root root 29366 Feb 6 2003 tree-1.4b3.tgz-rw-r--r--1 root root 466 Aug 20 2004 tree-1.5.0.lsm-rw-r--r--1 root root 26543 Aug 16 2004 tree-1.5.0.tgz 226 Transfer complete.ftp> get tree-1.5.0.tgz ftp> bye 221 Goodbye.$mv tree-1.5.0.tgz tree-1.5.0.tar.gz $cd../software $tar xvzf../source/tree-1.5.0.tar.gz $make $make install 然后就可以了,安装路径查看makefile文件知道在/usr/local/bin,也可以用which查看。现在可以用tree命令来查看一下自己的目录结构了。示例: $cd $tree-L 1 //显示一级目录,当然也可以显示二级目录了。.|--bootloader |--debug |--images |--kernel |--program |--rootfiles |--software |--source |--sysapps |--tmp `--tools
这样对自己的组织比较好。等用tree熟悉了,在补充它的用法。
四、引导装载程序bootloader 因为u-boot的功能比较强大,所以选择了u-boot。这几天想先研究研究它的代码,好好分析一下启动过程。原来做过一次,不过是利用原来开发板做好的,熟悉过程是可以,但是不明白原理仍然不行。这次要学习掌握原理部分。待续。。2006-08-14
一、了解一下存储器的基本分类情况。
存储器的物理实质是一组或多组具备数据输入输出和数据存储功能的集成电路,用于充当设备缓存或保存固定的程序及数据。存储器按存储信息的功能可分为只读存储器ROM(Read Only Memory)和随机存储器RAM(Random Access Memory)。
图1 常见存储器分类
1、ROM ROM 中的信息一次写入后只能被读出,而不能被操作者修改或删除,一般由芯片制造商进行掩膜写入信息,价格便宜,适合于大量的应用。一般用于存放固定的程序,如监控程序、汇编程序等,以及存放各种表格。EPROM(Erasable Programmable ROM)和一般的ROM不同点在于它可以用特殊的装置擦除和重写它的内容,一般用于软件的开发过程。特别介绍:闪存(Flash Memory)
闪速存储器(Flash Memory)又称PEROM(Programmable and Erasable Read Only Memory),是Intel 公司在80 年代末90 年代初推出的,由于它的众多优点而深受用户的青睐。Flash Memory 的两个主要特点是可以按整体/扇区擦除和按字节编程。它是完全非易失的,可以在线写入,并且可以按页连续字节写入,读出速度高。Flash 芯片划分成很多扇区,把一位从0 重置为1 不能通过对该位单独操作来实现,而必须擦除整个扇区。Flash芯片的寿命就用擦除周期来衡量。通常的寿命为每个扇区可擦除100,000 次。为了避免任意一个扇区在其他扇区之前达到这个极限,大多数Flash 芯片用户会尽量保证擦除次数在各扇区之间均匀分布,这一过程称为“磨损均衡”(wear leveling)
2、RAM RAM 就是我们平常所说的内存,主要用来存放各种现场的输入、输出数据,中间计算结果,以及与外部存储器交换信息和作堆栈用。它的存储单元根据具体需要可以读出,也可以写入或改写。RAM 只能用于暂时存放程序和数据,一旦关闭电源或发生断电,其中的数据就会丢失。现在的RAM 多为MOS 型半导体电路,它分为静态和动态两种。静态RAM 是靠双稳态触发器来记忆信息的;动态RAM 是靠MOS 电路中的栅极电容来记忆信息的。由于电容上的电荷会泄漏,需要定时给与补充,所以动态RAM 需要设置刷新电路。但动态RAM 比静态RAM 集成度高、功耗低,从而成本也低,适于作大容量存储器。所以主内存通常采用动态RAM,而高速缓冲存储器(Cache)则使用静态RAM。动态RAM 按制造工艺的不同,又可分为动态随机存储器(Dynamic RAM)、扩展数据输出随机存储器(Extended Data Out RAM)和同步动态随机存储器(Synchromized DynamicRAM)。DRAM 需要恒电流以保存信息,一旦断电,信息即丢失。它的刷新频率每秒钟可达几百次,但由于DRAM 使用同一电路来存取数据,所以DRAM 的存取时间有一定的时间间隔,这导致了它的存取速度并不是很快。另外,在DRAM 中,由于存储地址空间是按页排列的,所以当访问某一页面时,切换到另一页面会占用CPU 额外的时钟周期。EDO-RAM同DRAM 相似,但在把数据发送给CPU 的同时可以去访问下一个页面,故而速度要比普通DRAM 快15~30%。SDRAM 同DRAM 有很大区别,它使用同一个CPU 时钟周期即可完成数据的访问和刷新,即以同一个周期、相同的速度、同步的工作,因而可以同系统总线以同频率工作,可大大提高数据传输率,其速度要比DRAM 和EDO-RAM 快很多(比EDO-RAM提高近50%)。
二、AT91RM9200开发板的存储器情况
第一级地址译码由存储控制器执行,即由具有附加功能的高级系统总线(ASB)执行。译码将4G的地址空间分为16 个256M字节的区域。区域1 ~ 8 对应EBI,和外部片选NC0 ~NCS7相联系。区域0为内部存储器地址,第二级译码提供1M字节内部存储空间。区域15为外设地址,且提供对高级外设总线(APB)的访问。其它区域未使用,使用它们进行访问时将向发出访问请求的机发出异常中断。注意,地址的转换都是按照字节为单位的。
1、内部存储器映射 内部ROM:AT91RM9200集成了一个128-K字节的内部ROM。任何时候,ROM均被映射到地址0x10 0000。若复位时BMS 为高,则在复位后到重新映射命令执行前,可访问地址0x0。ROM容量为128KB,即对应0x20000。所以范围为0x100000-0x120000。
内部RAM:AT91RM9200集成了高速,16-K 字节的内部SRAM。复位后到重新映射命令执行前,只可访问SRAM 中0x20 0000的地址空间。重新映射后,SRAM 在地址0x0 同样有效。SRAM容量为16KB,即对应0x4000,所以范围为0x200000-0x204000。
USB 主机端口:AT91RM9200集成了一个USB主机端口开放主机控制器接口(OHCI)。ASB可直接访问该接口寄存器,且同标准内部存储器一样映射到地址0x30 0000。
图2 内部存储器映射
2、外部存储器映射
图3 外部存储器映射
嵌入式存储设备通常主要是RAM 和作为永久存储媒质的Flash。
现在所用的AT91RM9200开发板所用的SDRAM是HY57V281620HCT-H,其容量为4banks×2Mbits×16,即128Mbits=16Mbytes。SDRAM共有两片HY57V281620HCT-H,所以SDRAM容量为32MB。现在所用的Flash芯片为Intel的28F640J3,容量为8MB,地址映射从0x10000000到0x10800000。现在将Flash分为64个扇区,每个扇区为128KB=0x20000,每个扇区分为两个擦除块,为64KB=0x10000。
-----Chip Select 0――Flash(0x1000 0000-0x1FFF FFFF)0x1000 0000(第0扇区)
boot.bin
Flash 0x1001 0000(第0扇区)
u-boot.bin.gz Flash 0x1002 0000(第1扇区)
uImage Flash...0x1012 0000(第9扇区)
ramdisk
Flash...0x107E 0000(第63扇区)
u-boot环境变量 Flash-----Chip Select 1――SDRAM(0x2000 0000-0x2200 0000)0x2000 0000
SDRAM..0x2100 0000
uImage SDRAM 0x2110 0000
ramdisk SDRAM..-----2006-08-17 u-boot移植
1首先,了解一下bootloader。bootloader是系统加电后运行的第一段代码。它要完成的工作就是初始化硬件设备,建立内存空间的映射图,这样为最终调用操作系统内核做好准备。2 bootloader的操作模式
(1)启动加载模式(bootloading)(2)下载模式(downloading)
开发时要用(2),target board上的bootloader将通过串口或者网络等通信手段从host上下载内核映象和根文件系统映象等到ram中。3 bootloader的启动方式:网络启动、磁盘启动、flash启动。4 bootloader的种类
区分一下“bootloader”和“monitor”的概念。bootloader只是引导设备并且执行主程序的固件;而monitor还提供了更多的命令行接口,可以进行调试、读写内存、烧写flash、配置环境变量等。monitor在嵌入式系统开发过程中还可以提供很好的调试功能,开发完成后,就完全配置成了一个bootloader。所以,习惯上把它们统称为bootloader。我现在要使用的u-boot就是典型的monitor。5 bootloader的启动流程
搜集了一些资料,写的比较精彩,放在这里。。资料一:
系统上电,检测BMS,选择系统的启动方式,如果BMS为高电平,则系统从片内ROM启动。AT91RM9200的ROM上电后被映射到了0x0和0x100000处,在这两个地址处都可以访问到ROM。由于9200的ROM中固化了一个BOOTLOAER程序。所以PC从0X0处开始执行这个BOOTLOAER(准确的说应该是一级BOOTLOADER)。这个BOOTLOER依次完成以下步骤: 1. PLL SETUP 设置PLLB产生48M时钟频率提供给USB DEVICE。同时DEBUG USART也被初始化为48M的时钟频率。
2. 相应模式下的堆栈设置
3. 检测主时钟源(Main oscillator)4. 中断控制器(AIC)的设置 5. C 变量的初始化 6. 跳到主函数
完成以上步骤后,我们可以认为BOOT过程结束,接下来的就是LOADER的过程,或者也可以认为是装载二级BOOTLOER。AT91RM9200按照DATAFLASH、EEPROM、连接在外部总线上的8位并行FLASH的顺序依次来找合法的BOOT程序。所谓合法的指的是在这些存储设备的开始地址处连续的存放的32个字节,也就是8条指令必须是跳转指令或者装载PC的指令,其实这样规定就是把这8条指令当作是异常向量表来处理。必须注意的是第6条指令要包含将要装载的映像的大小。关于如何计算和写这条指令可以参考用户手册。一旦合法的映像找到之后,则BOOT程序会把找到的映像搬到SRAM中去,所以映像的大小是非常有限的,不能超过16K的大小。当BOOT程序完成了把合法的映像搬到SRAM的任务以后,接下来就进行存储器的REMAP,经过REMAP之后,SRAM从映设前的0X200000地址处被映设到了0X0地址并且程序从0X0处开始执行。而ROM这时只能在0X100000这个地址处看到了。至此9200就算完成了一种形式的启动过程。如果BOOT程序在以上所列的几种存储设备中找到合法的映像,则自动初始化DEBUG USART口和USB DEVICE口以准备从外部载入映像。对DEBUG口的初始化包括设置参数115200 8 N 1以及运行XMODEM协议。对USB DEVICE进行初始化以及运行DFU协议。现在用户可以从外部(假定为PC平台)载入你的映像了。在PC平台下,以WIN2000为例,你可以用超级终端来完成这个功能,但是还是要注意你的映像的大小不能超过13K。一旦正确从外部装载了映像,接下来的过程就是和前面一样重映设然后执行映像了。我们上面讲了BMS为高电平,AT91RM9200选择从片内的ROM启动的一个过程。如果BMS为低电平,则AT91RM9200会从片外的FLASH启动,这时片外的FLASH的起始地址就是0X0了,接下来的过程和片内启动的过程是一样的,只不过这时就需要自己写启动代码了,至于怎么写,大致的内容和ROM的BOOT差不多,不同的硬件设计可能有不一样的地方,但基本的都是一样的。由于片外FLASH可以设计的大,所以这里编写的BOOTLOADER可以一步到位,也就是说不用像片内启动可能需要BOOT好几级了,目前AT91RM9200上使用较多的bootloer是u-boot,这是一个开放源代码的软件,用户可以自由下载并根据自己的应用配置。资料2
loader.bin, boot.bin, u-boot.bin代码执行流分析.以上三个文件时at91rm9200启动所需要的三个bin,他们的实现代码并不难。如果是你是采用at91rm9200的评估版,应该能得到其源码。
loader.bin 执行流程,这个文件主要在片内启动从串口下载代码时会用到 loader/entry.S init cpu b main---> crt0.S--> copydata--> clearbss--> b boot main.c--> boot--> /*Get internel rom service address*/ /* Init of ROM services structure */ pAT91 = AT91C_ROM_BOOT_ADDRESS;
/* Xmodem Initialization */--> pAT91->OpenSBuffer--> pAT91->OpenSvcXmodem /* System Timer initialization */---> AT91F_AIC_ConfigureIt /* Enable ST interrupt */ AT91F_AIC_EnableIt AT91F_DBGU_Printk(“XMODEM: Download U-BOOT ”);
Jump.S // Jump to Uboot BaseAddr exec Jump((unsigned int)AT91C_UBOOT_BASE_ADDRESS)
boot.bin执行流程 该文件会在从片内启动时被下载到板子上,以后还会被烧写到片外Flash中,以便在片外启动时
用它来引导并解压u-boot.bin.gz,并跳转到u-boot来执行。boot/entry.S b main--> crt0.S--> copydata--> clearbss--> b boot
AT91F_DBGU_Printk(“ ”);AT91F_DBGU_Printk(“************************************** ”);AT91F_DBGU_Printk(“** Welcome to at91rm9200 ** ”);AT91F_DBGU_Printk(“************************************** ”);boot/misc.s /* unzip uboot.bin.gz */----> decompress_image(SRC,DST,LEN)--> gunzip
//jump to ubootBaseAddr exec 这里跳转到解压u-boot.bin.gz的地址处直接开始执行u-boot asm(“mov pc,%0” : : “r”(DST));
u-boot.bin执行流程
u-boot/cpu/at91rm9200/start.S start--->reset---> copyex---> cpu_init_crit---> /* set up the stack */--> start_armboot u-boot/lib_arm/board.c
init_fnc_t *init_sequence[] = { cpu_init, /* basic cpu dependent setup */ board_init, /* basic board dependent setup */ interrupt_init, /* set up exceptions */ env_init, /* initialize environment */ init_baudrate, /* initialze baudrate settings */ serial_init, /* serial communications setup */ console_init_f, /* stage 1 init of console */ display_banner, /* say that we are here */ dram_init, /* configure available RAM banks */ display_dram_config, checkboard, NULL, };
---> start_armboot---> call init_sequence---> flash_init--> display_flash_config---> nand_init---> AT91F_DataflashInit---> dataflash_print_info--> env_relocate---> drv_vfd_init--> devices_init--> jumptable_init---> console_init_r--> misc_init_r--> enable_interrupts---> cs8900_get_enetaddr--> board_post_init-->
u-boot/common/main.c for(;;){ /* shell parser */ main_loop()--> u_boot_hush_start--> readline--> abortboot-->printf(“Hit any key to stop autoboot: %2d ”, bootdelay);}
以上是at91rm9200启动并进入u-boot的执行流分析。后面u-boot还会将uImage解压到特定的位置并开始执行内核代码。6 u-boot-1.1.1的移植
自己先用u-boot-1.1.1,主要步骤如下:(1)下载u-boot-1.1.1 http://sourceforge.net/projects/u-boot(2)解压
用户:armlinux $mkdir bootloader $cd bootloader $tar jxvf../source/u-boot-1.1.1.tar.bz2 $cd u-boot-1.1.1(3)修改
首先看一下结构 $ tree-L 1-d.|--board
平台依赖,存放电路板相关的目录文件 |--common
通用多功能函数的实现
|--cpu
平台依赖,存放cpu相关的目录文件 |--disk
通用。硬盘接口程序 |--doc
文档
|--drivers
通用的设备驱动程序,如以太网接口驱动 |--dtt |--examples
应用例子
|--fs
通用存放文件系统的程序
|--include
头文件和开发板配置文件,所有开发板配置文件放在其configs里
|--lib_arm
平台依赖,存放arm架构通用文件 |--lib_generic
通用的库函数
|--lib_i386
平台依赖,存放x86架构通用文件 |--lib_m68k
平台依赖
|--lib_microblaze
平台依赖 |--lib_mips
平台依赖 |--lib_nios
平台依赖
|--lib_ppc平台依赖,存放ppc架构通用文件 |--net
存放网络的程序 |--post
存放上电自检程序 |--rtc rtc的驱动程序 `--tools
工具 然后具体步骤为:
(一)在board文件夹下面建立自己的开发板的文件夹。一般的,要选取与自己的开发板硬件设置最为接近的型号。在u-boot-1.1.1中,已经支持at91rm9200,所以可以选取at91rm9200dk作为模板进行修改。设置你的开发板的名字,随意即可,我的设置为:myboard。[armlinux@lqm u-boot-1.1.1]$ cd board [armlinux@lqm board]$ cp-R at91rm9200dk/ myboard/ [armlinux@lqm board]$ cd myboard [armlinux@lqm myboard]$ ls at91rm9200dk.c config.mk flash.c Makefile u-boot.lds
(二)可以看到,这里共有5个文件。首先,要修改主文件的名字,即要把at91rm9200dk.c更改为myboard.c。其次,要更改config.mk中TEXT_BASE的数值,与loader等一级bootloader的要一致。接下来,因为在at91rm9200dk用的是AMD的flash,而我的开发板上用的是Intel的28F640J3,那么需要另外找Intel的flash.C,以减少工作量。在这里,推荐用source insight这个查看代码的工具。我是在win下面使用的,它可以很方便的读代码,并且查找调用函数等等的工作。在strong ARM构架里有xm250,它的flash是Intel的,修改的东西并不是很多。需要注意的是,xm250的flash位宽是32,而我的位宽是16,要根据这个进行相应的修改。最后,修改Makefile,主要是修改生成文件的名字。具体操作如下:
[armlinux@lqm myboard]$ mv at91rm9200dk.c myboard.c [armlinux@lqm myboard]$ cat config.mk TEXT_BASE = 0x21f80000 [armlinux@lqm myboard]$ vi config.mk 修改成:TEXT_BASE = 0x21f00000,然后保存退出。[armlinux@lqm myboard]$ vi Makefile include $(TOPDIR)/config.mk LIB = lib$(BOARD).a OBJS := myboard.o flash.o SOBJS := $(LIB): $(OBJS)$(SOBJS)$(AR)crv $@ $(OBJS)$(SOBJS)clean: rm-f $(SOBJS)$(OBJS)[armlinux@lqm myboard]$ rm flash.c [armlinux@lqm myboard]$ cp../xm250/flash.c./ [armlinux@lqm myboard]$ ls config.mk flash.c Makefile myboard.c u-boot.lds [armlinux@lqm myboard]$ vi flash.c
#undef FLASH_PORT_WIDTH32 /*不定义位宽32*/
#define FLASH_PORT_WIDTH16 /*定义位宽16*/
216 switch(value){ 217 218 case(FPW)INTEL_ID_28F128J3A: 219 info->flash_id += FLASH_28F128J3A;220 info->sector_count = 128;2
21info->size = 0x01000000;
222 break;
/* => 16 MB */ 223 224 case(FPW)INTEL_ID_28F640J3A:
/*就是这个芯片*/
225 info->flash_id += FLASH_28F640J3A;226 info->sector_count = 64;227
info->size = 0x00800000;
228 break;
/* => 8 MB */
[armlinux@lqm myboard]$ cd../..[armlinux@lqm u-boot-1.1.1]$ vi Makefile
### ## AT91RM9200 Systems
### at91rm9200dk_config : unconfig @./mkconfig $(@:_config=)arm at91rm9200 at91rm9200dk myboard_config : unconfig @./mkconfig $(@:_config=)arm at91rm9200 myboard
### 在这里,可以在命令模式下输入“/at91rm9200”快速查找at91rm9200dk,仿照它的例子,写出自己板子的配置。注意的是,第二行开头要用TAB键,不是空格,否则报错。选项arm表示目标板架构,at91rm9200表是片上系统,myboard是你自己的开发板名字。
[armlinux@lqm u-boot-1.1.1]$ vi MAKEALL LIST_ARM9=“ at91rm9200dk integratorcp integratorap omap1510inn omap1610h2 omap1610inn smdk2400 smdk2410 trab VCMA9 versatile
myboard ”
(三)修改主要的配置文件。配置选项比较多,主要是配置cpu,波特率,flash和sdram的类型大小,环境变量的偏移量等等,容易出错。应该首先了解硬件情况,仔细对应芯片资料进行修改。
[armlinux@lqm u-boot-1.1.1]$ cd include/configs [armlinux@lqm configs]$ cp at91rm9200dk.h myboard.h [armlinux@lqm configs]$ vi myboard.h 41 #define CONFIG_MYBOARD 1
目标板
#define CONFIG_BOOTDELAY
5u-boot延时等待时间 110 #define CONFIG_NR_DRAM_BANKS 1 sdram banks,我的是一个 111 #define PHYS_SDRAM 0x20000000
sdram起始地址 112 #define PHYS_SDRAM_SIZE 0x2000000
sdram容量32MB 121 #undef CONFIG_HAS_DATAFLASH
未用dataflash 128 #define PHYS_FLASH_1 0x10000000 129 #define PHYS_FLASH_2 0x00000000
定义,flash.c用到,但实际并未起作用
#define PHYS_FLASH_SIZE 0x800000 flash容量8MB
#define CFG_FLASH_BASE
PHYS_FLASH_1 flash起始地址别名 132 #define CFG_MAX_FLASH_BANKS 1
flash最大banks数 133 #define CFG_MAX_FLASH_SECT 64 扇区总数
#define PHYS_FLASH_SECT_SIZE(128*1024)
每个扇区128KB
#define CFG_FLASH_ERASE_TOUT(2*CFG_HZ)/* Timeout for Flash Erase */ 136 #define CFG_FLASH_WRITE_TOUT(2*CFG_HZ)/* Timeout for Flash Write */ 137 #define CFG_FLASH_UNLOCK_TOUT(2*CFG_HZ)138 139 #undef CFG_ENV_IS_IN_DATAFLASH 140 141 #ifdef CFG_ENV_IS_IN_DATAFLASH 142 #define CFG_ENV_OFFSET 0x20000 143 #define CFG_ENV_ADDR(CFG_DATAFLASH_LOGIC_ADDR_CS0 + CFG_ENV_OFFSET)144 #define CFG_ENV_SIZE 0x2000 /* 0x8000 */ 145 #else 146 #define CFG_ENV_IS_IN_FLASH 1 147 #define CFG_ENV_ADDR(PHYS_FLASH_1 + 0x7e0000)/* 0x107E0000 */ 148 #define CFG_ENV_SIZE 0x20000
环境变量占了一个扇区,共128KB 149 #endif 150 151 #define CFG_SOFT_RESET 1
定义软复位,flash.c用到
152 #define CFG_LOAD_ADDR 0x21000000 /* default load address */ 160 #define CFG_PROMPT “U-boot> ” 提示符名字,可任意改
[armlinux@lqm configs]$ cd../..[armlinux@lqm u-boot-1.1.1]$ make myboard_config Configuring for myboard board...[armlinux@lqm u-boot-1.1.1]$ make CROSS_COMPILE=arm-linux-然后把生成的u-boot.bin保存,并且压缩一下得到u-boot.bin.gz。将这两个文件通过ftp传至windows上,通过SecureCRT来进行传输。
这里注意,知道CROSS_COMPILE路径,前面设置环境变量时说到过。压缩命令为gzip
CCCCCCCCCCCC 正在开始 xmodem 传输。按 Ctrl+C 取消。正在传输 loader.bin...100% 6 KB-I-AT91F_LowLevelInit(): Debug channel initialized 6 KB/s 00:00:01 0 错误
loader 1.0(Aug 8 200314:07:56)U-Boot code: 21F00000-> 21F156CC BSS:-> 21F198D0 RAM Configuration: Bank #0: 20000000 32 MB Flash: 8 MB *** Warning14:07:56)U-boot> printenv bootdelay=5 baudrate=115200 stdin=serial stdout=serial stderr=serial Environment tes------------------------设定环境变量,当然这些也可以在include/configs/
## done Bytes transferred = 43791(ab0f hex)U-boot> cp.b 20000000 10010000 ab0f Copy to Flash...done 断电重启,从片外启动。
这时遇到了一个问题,就是从flash启动时,总是提示:*** Warning16:50:31)U-Boot code: 21F00000-> 21F157F4 BSS:-> 21F199F4 RAM Configuration: Bank #0: 20000000 32 MB Flash: 8 MB In: serial Out: serial Err: serial U-Boot> 经验证,这是u-boot-1.1.1已经能够正常启动了。
---------------------------
同样的方法,u-boot-1.1.2也正常启动了。另外,u-boot-1.1.2有几个小的补丁,等明天再做一下总结。同时看看如何制作补丁,如何打补丁。具体的调试过程没有写得很仔细,要想做好一项工作,只会写程序远远不够,更为重要的是会调试。我需要加强此方面的工作。明天把JEDI probe调试环境的建立也总结一下。
2006-08-18 今天学习了一下Linux下面patch的制作和使用,做了总结,放到blog上面。u-boot-1.1.2有几个diff补丁文件,具体没有分析,先附在这里。我的使用倒是还没有发现这几个问题,也许没有测试,不管它,以后如果出现问题在来仔细考虑吧。
开发板由王老师用,我先学习内核裁减吧。关于移植版本,不一定非得越高越好。关于内核版本标号问题,详细参考《Building Embedded Linux Systems》。现在还不开发产品,那么先多试用几个,总结总结经验。初步打算先移植一个2.4.x版本,然后移植一个2.6.x版本。
----------------------------- Bug1:
RCS file: /home/cvs/u-boot/tools/env/fw_env.c,v retrieving revision 1.2 diff-u-r1.2 fw_env.c---fw_env.c 21 Jul 2004 03:28:43-0000 1.2 +++ fw_env.c 23 Jul 2004 05:00:25-0000 @@-612,8 +612,8 @@ if(!crc1_ok){ fprintf(stderr, “Warning: Bad CRC, using default environmentn”);free(addr1);+ memset(environment.data, 0, ENV_SIZE);+ memcpy(environment.data, default_environment, sizeof(default_environment));} } else { flag1 = environment.flags;Bug2:
saveenv bad checksum when saving environment after changing stdin, stdout,...the checksum is not consistent.Adding an env_crc_update()before saving environment could solve this.i.e in common/cmd_nvedit.c in function do_saveenv(): int do_saveenv(cmd_tbl_t *cmdtp, int flag, int argc,char *argv[]){ extern char * env_name_spec;printf(“Saving Environment to %s...n”, env_name_spec);env_crc_update();---------------------------------------- 2006-08-22 Linux内核移植
版本:Linux-2.4.27-vsr1 Target Board:ARM U-boot:1.1.2 toolchain:cross-2.95.3
1、准备
kernel下载到网站www.xiexiebang.com,可以通过ftp方式:$ftp ftp.kernel.org,采用匿名的方式输入anonymous即可进入下载。
patch准备:到官方网站www.xiexiebang.com.uk,这里提供ftp方式$ftp ftp.arm.linux.org.uk
2、打好补丁,执行make mrproper清理一下代码树。
3、修改根目录的Makefile文件,只需修改ARCH和CROSS_COMPILE即可。ARCH :=arm CROSS_COMPILE=arm-linux-在这里,我已经将2.95.3放到PATH中,所以不需要写全路径。如果采用其他版本的toolchain,可以指明路径,如:CROSS_COMPILE=/usr/local/arm/3.3.2/bin/arm-linux-
4、$make at91rm9200dk_config 该步的作用是把根目录下面的.config重命名为.config.old,然后把arch/arm/defconfig/里的at91rm9200dk开发板的默认配置文件复制到根目录下,命名为.config。简单的说,就是要利用提供的开发板的配置文件,然后在此基础上进行修改。下一步如果执行make oldconfig,那么就完全按照.config来配置。而现在需要根据实际应用需要重新配置,所以不执行make oldconfig。而要执行make menuconfig。这两个命令都是首先寻找默认的.config文件并且执行,但不同的是,make oldconfig只出现.config没有的新配置选项供选择。而make menuconfig则提供所有选项,图形界面默认的是.config的配置。
在这里,还是推荐在提供的开发板配置文件的基础之上进行修改,否则后面很容易出现意想不到的问题。我就是因为开始没有使用默认配置,后面的错误一个接一个,折腾了一个上午。
5、make menuconfig 在这里可以重新配置,根据你所需要的功能进行裁减。
6、make clean dep 建立依赖关系。
7、make Image 或者 make zImage。这要看你后面使用什么方式的内核映象。如果是make Image,则生成vmlinux,需要arm-linux-obgcopy进行处理,生成uImage影响文件。如果是make zImage,则生成zImage,vmlinux,system.map。zImage和uImage对应的u-boot处理的方式也不相同,分别对应着go和bootm。
8、[armlinux@lqm linux-2.4.27]$ cp arch/arm/boot/zImage /home/armlinux/images/zImage-2.4.27-vsr1 [armlinux@lqm linux-2.4.27]$ cp vmlinux $PRJROOT/images/vmlinux-2.4.27-vsr1 [armlinux@lqm linux-2.4.27]$ cp System.map $PRJROOT/images/System.map-2.4.27-vsr1 [armlinux@lqm linux-2.4.27]$ cp.config $PRJROOT/images/2.4.27-vsr1.config
9、生成uImage [armlinux@lqm linux-2.4.27]$ arm-linux-objcopy-O binary-S vmlinux linux.bin [armlinux@lqm linux-2.4.27]$ gzip-v9 linux.bin linux.bin: 55.7%--replaced with linux.bin.gz [armlinux@lqm linux-2.4.27]$../../bootloader/u-boot-1.1.2/tools/mkimage-n 'RAM disk'-A arm-O linux-T ramdisk-C gzip-a 0x20008000-e 0x20008000-d linux.bin.gz uImage Image Name: RAM disk Created: Wed Aug 23 09:09:27 2006 Image Type: ARM Linux RAMDisk Image(gzip compressed)Data Size: 617981 Bytes = 603.50 kB = 0.59 MB Load Address: 0x20008000 Entry Point: 0x20008000
10、准备好uImage,先通过超级终端下载到ram里面,检测,然后烧写到flash里面。
可以发现已经成功。
第二篇:嵌入式linu学习心得
嵌入式Linux学习心得
1、Linux命令
ls:查看目录-l以列表方式查看;ls –l 与ll的功能一样 pwd: 查看当前的目录
cd:改变当前操作目录cd /直接跳到根目录 cd..回到上一级目录 cat: 打印显示当前文件的内容信息
mkdir:创建目录
fdisk: 查看硬盘分区信息,-l以列表方式查看
->代表是链接文件,类似window下的快捷方式。
cp: 复制命令,例子cp 文件名 /home/dir/
mv: 移动或改名,如mv sonf.confsonf.txt(改名)移动:mv sonf.conf / rm:删除命令,如rm –f test.c;如删除目录rm –fr d
man:查看某个命令的帮助,man 命令
2、各系统目录的功能
drw—r—w--:d代表是目录,drw代表当前用户的权限,r代表组用户的权限,w代表其它用户的权限。x代表有执行权限。
/boot/gruff.conf: 启动引导程序
/dev:brw—rw--:b代表是块设备。Linux设备有三种,块设备(b开头)、字符设备(c开头)、网络设备。had代表第一个硬盘,hdb代表第二个硬盘。Hdb2代表第二块硬盘的第二个分区。3,67代表主设备为3,从设备为67./etc:存放的是系统的配置文件。Inittab文件存放不同启动方式下必须启动的进程。Inittab文件中有6个启动level,wait中对应着6个level的目录,respawn代表当一个进程被意外终止了,但会自动启动的进程,如守护进程。rc.d目录中存放了一个rc.sysinit文件,里面存放系统初始化配置信息。/etc还有一个vsftpd里面存放tcp、ftp的配置。
/home : 用户目录,存放用户的文件,/lib:存放库文件,后缀为so的文件代表动态链接库。
/lost+found:系统意外终止,存放一些可以找回的文件。
/mnt:挂载外部设备,如挂载光驱:mount –t /dev/cdrom/mnt/cdrom,如
果在双系统中,要查看windows中D盘的文件,首先应该将D盘的文件映射过来,mount –t /dev/hda2/mnt/windows/d
/opt:用户安装的应用程序
/proc:是系统运行的映射,比较重要。里面的文件数字代表进程号。每个进程号目录下包含进程的基本信息。还有其他信息,如cpuinfo等,内核支持的文件系统filesystem等。系统支持的中断interrupts,iomen代表内存分配情况。ioport存放IO端口号。还有分区信息,modole信息,状态信息,版本信息
对于Linux的设备驱动程序,有两种加载模式,一种是直接加载进linux内核,一种是以模块的方式加载到内核。
/sbin: 系统管理的一些工具。如poweroff关机工具。
/usr: 安装系统时很多文件放在此目录下面,包含一些更新等,include包含的头文件,lib 是Linux的库文件,src包含Linux2.4的内核源码
/var:存放是临时变量
3、
第三篇:嵌入式系统移植+心得
嵌入式系统作为近年来新兴的且发展很快的学科,它的应用越来越受到广大技术人员的重视。尤其起可移植性,显著的区别了通用操作系统。一款嵌入式操作系统通常运行在不同体系结构的处理器和开发板上,极大的方便了开发者开发与应用,节约了成本。嵌入式操作系统作为移植支持嵌入式系统应用的操作系统软件,被广泛的运用于不同应用领域。纵观嵌入式系统40多年的历史,从无操作系统的嵌入式算法阶段到简单监控式的实时操作系统,一步又一步的到现在的以Internet为标志的嵌入式系统,一批又一批的先辈为其努力而奋斗。科技的革新,带动着社会的发展,人类的进步。大数据的时代必定属于我IT人。以下我们聊一聊嵌入式系统及其移植性。嵌入式操作系统大体分为商用型和免费型。商用型主要是WindowsCE。Psos.os-9.qnx等其价格较为昂贵,开发成本高,广泛运用于通信。军事。航天等高端技术领域
免费型主要为Linux等主要运用于没有存储器管理单元的处理器而设置。嵌入式基本操作共四步
主机和目标机的连接方式;
UARA最经典90%的板子上,都支持的方式叫异部串行接口,也就是我们所说的串口。USB串行接口 TCP/IP网络接口 Debug Jtag调试接口
补充说明
1.对于串口,通常用的有串口调试助手,putty工具等,工具很多,功能都差不多,会用一两款就可以;
2.对于USB线,当然必须要有USB的驱动才可以,一般芯片公司会提供,比如对于三星的芯片,USB下载主要由DNW软件来完成;
3.对于网线,则必须要有网络协议支持才可以
安装交叉编译器
方法一:分步编译和安装交叉编译工具链所需要的库和源代码,最终生成交叉编译工具链。该方法相对比较困难,适合想深入学习构建交叉工具链的读者。如果只是想使用交叉工具链,建议使用下列的方法二构建交叉工具链。
方法二:通过Crosstool-ng脚本工具来实现一次编译,生成交叉编译工具链,该方法相对于方法一要简单许多,并且出错的机会也非常少,建议大多数情况下使用该方法构建交叉编译工具链。
方法三:直接通过网上下载已经制作好的交叉编译工具链。该方法的优点不用多说,当然是简单省事,但与此同时该方法有一定的弊端就是局限性太大,因为毕竟是别人构建好的,也就是固定的,没有灵活性,所以构建所用的库以及编译器的版本也许并不适合你要编译的程序,同时也许会在使用时出现许多莫名其妙的错误
搭建主机 一般情况下在嵌入式中我们用的比较多的服务就两个 在Linux下一个叫TFTP一个叫NFS,TFTP顾名思义就是FTP的一个简版,它是基于UDP传输的,相当于它的协议比较简单。NFS它的全名叫做网络文件系统,这个网络文件系统主要是Linux和Linux之间做挂载用的。
烧写测试
以上为嵌入式基本操作的四个步骤
嵌入式Linux系统移植主要由四大部分组成:
一、搭建交叉开发环境
综上所述
二、Boot loader的选择和移植
boot loader基本概念:就是在操作系统内核运行之前运行的一段小程序。
通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境,他就是所谓的引导加载程序(Boot Loader)。
三、kernel的配置、编译、和移植
1将下载好的linux-2.6.35.tar.bz2拷贝到主目录下解压
2修改顶层目录下的Makefile,主要修改平台的体系架构和交叉编译器 3拷贝标准版配置文件,目的是得到跟我们开发板相关的配置信息 4配置内核 5编译内核
6通过tftp网络服务下载测试内核
四、根文件系统的制作
flash芯片的驱动程序是由系统来提供,所以它的存取特点完全是flash自身的特点,这时最好有更加适合flash的文件系统——Jffs、Yaffs、Cramfs和Romfs。这些文件系统都是嵌入式Linux系统中常用的文件系统,可以根据特点来选择使用它们,特点如下:
共同点
基于MTD驱动 Jffs
A.针对NOR Flash的实现
B.基于哈希表的日志型文件系统
C.采取损耗平衡技术,每次写入时都会尽量使写入的位置均匀分布
D.可读写,支持数据压缩
E.崩溃/掉电安全保护
F.当文件系统已满或接近满时,因为垃圾收集的关系,运行速度大大放慢 Yaffs
A.针对Nand Flash的实现
B.日志型文件系统
C.采取损耗平衡技术,每次写入时都会尽量使写入的位置均匀分布
D.可读写,不支持数据压缩
E.挂载时间短,占用内存小
F.自带Nandflash驱动,可以不使用VFS和MTD Cramfs
A.单页压缩,支持随机访问,压缩比高达2:1
B.速度快,效率高
C.只读,有利于保护文件系统免受破坏,提高了系统的可靠性,但是无法对其内容进行扩充
Romfs
A.简单的、紧凑的、只读的文件系统
B.顺序存放数据,因而支持应用程序以XIP(execute In Place,片内运行)方式运行,在系统运行时,节省RAM空间
特有的文件系统类型:Ramdisk文件系统 在Linux系统中,内存经常用于存储文件系统,这种叫做Ramdisk,Ramdisk有两种,一种是完全把内存看成物理存储介质,利用内存模拟磁盘,运用磁盘的文件系统类型;另一种只是在内存中存储了文件系统逻辑结构,运用tmpfs&ramfs文件系统类型:
tmpfs&ramfs
1.概述
用物理内存模拟磁盘分区,挂载这种分区后,就可以跟读写磁盘文件一样读写这里面的文件,但是操作速度要比磁盘文件快得多;所以一般应用在下面几个方面:
1)读写速度要求快的文件应该放在这种文件系统中
2)磁盘分区为flash的情况下,把需要经常读写的文件放在这种文件系统中,然后定期写回flash
3)系统中的临时文件,如/tmp、/var目录下的文件应该放在这种文件系统中
4)/dev设备文件(因为设备文件随驱动和设备的加载和卸载而变化),应该放在这种文件系统中
2.特点
1)由于数据都存放在物理内存中,所以系统重启后,这个文件系统中的数据会全部丢失
2)ramfs在没有指定最大的大小值情况下,会自动增长,直到用掉系统中所有的物理内存为止,这时会导致系统的崩溃,建议挂载时最好限定其最大的大小值
3)tmpfs如果指定了大小值,自动增长至大小值后,系统会限定它的大小;这个文件系统占用的物理内存页可以背置换到swap分区,但是ramfs不行
由于嵌入式技术发展飞速,新技术不断涌现。大数据时代的IT人更该更加努力。发愤图强。嵌入式兼顾硬件和软件更加考验我们的能力,需要更多的基础知识。天下英豪出我辈,一入IT岁月催。加油了!
第四篇:软考嵌入式系统设计师笔记归纳总结
软考嵌入式系统设计师笔记
1.嵌入式系统的组成:硬件层、中间层、系统软件层和应用软件层
(1)硬件层:嵌入式微处理器、存储器、通用设备接口和I/O 接口。
嵌入式核心模块=微处理器+电源电路+时钟电路+存储器
Cache:位于主存和嵌入式微处理器内核之间,存放的是最近一段时间微处理器使用最多的程序代码和数据。它的主要目标是减小存储器给微处理器内核造成的存储器访问瓶颈,使处理速度更快。
(2)中间层(也称为硬件抽象层HAL 或者板级支持包BSP):它将系统上层软件和底层硬件分离开来,使系统上层软件开发人员无需关系底层硬件的具体情况,根据BSP 层提供的接口开发即可。
BSP 有两个特点:硬件相关性和操作系统相关性。
设计一个完整的BSP 需要完成两部分工作:
A、嵌入式系统的硬件初始化和BSP 功能。
片级初始化:纯硬件的初始化过程,把嵌入式微处理器从上电的默认状态逐步设置成系统所要求的工作状态。
板级初始化:包含软硬件两部分在内的初始化过程,为随后的系统初始化和应用程序建立硬件和软件的运行环境。
系统级初始化:以软件为主的初始化过程,进行操作系统的初始化。
B、设计硬件相关的设备驱动。
(3)系统软件层:由RTOS、文件系统、GUI、网络系统及通用组件模块组成。
RTOS 是嵌入式应用软件的基础和开发平台。
(4)应用软件:由基于实时系统开发的应用程序组成。2.嵌入式系统的定义
(1)定义:以应用为中心,以计算机技术为基础,软硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。
(2)嵌入式系统发展的4 个阶段:无操作系统阶段、简单操作系统阶段、实时操作系统阶段、面向Internet 阶段。
(3)知识产权核(IP 核):具有知识产权的、功能具体、接口规范、可在多个集成电路设计中重复使用的功能模块,是实现系统芯片(SOC)的基本构件。
(4)IP 核模块有行为、结构和物理3 级不同程度的设计,对应描述功能行为的不同可以分为三类:软核、固核、硬核。3.实时系统的调度
(1)调度:给定一组实时任务和系统资源,确定每个任务何时何地执行的整个过程。
(2)抢占式调度:通常是优先级驱动的调度,如uCOS。优点是实时性好、反应快,调度算法相对简单,可以保证高优先级任务的时间约束;缺点是上下文切换多。
(3)非抢占式调度:通常是按时间片分配的调度,不允许任务在执行期间被中断,任务一旦占用处理器就必须执行完毕或自愿放弃,如WinCE。优点是上下文切换少;缺点是处理器有效资源利用率低,可调度性不好。
(4)静态表驱动策略:系统在运行前根据各任务的时间约束及关联关系,采用某种搜索策略生成一张运行时刻表,指明各任务的起始运行时刻及运行时间。
(5)优先级驱动策略:按照任务优先级的高低确定任务的执行顺序。
(6)实时任务分类:周期任务、偶发任务、非周期任务。
(7)实时系统的通用结构模型:数据采集任务实现传感器数据的采集,数据处理任务处理采集的数据、并将加工后的数据送到执行机构管理任务控制机构执行。4.实时系统
(1)定义:能在指定或确定的时间内完成系统功能和对外部或内部、同步或异步时间做出响应的系统。
(2)区别:通用系统一般追求的是系统的平均响应时间和用户的使用方便;而实时系统主要考虑的是在最坏情况下的系统行为。
(3)特点:时间约束性、可预测性、可靠性、与外部环境的交互性。
(4)硬实时(强实时):指应用的时间需求应能够得到完全满足,否则就造成重大安全事故,甚至造成重大的生命财产损失和生态破坏,如:航天、军事。
(5)软实时(弱实时):指某些应用虽然提出了时间的要求,但实时任务偶尔违反这种需求对系统运行及环境不会造成严重影响,如:监控系统、实时信息采集系统。
(6)任务的约束包括:时间约束、资源约束、执行顺序约束和性能约束。5.嵌入式微处理器体系结构
(1)冯诺依曼结构:程序和数据共用一个存储空间,程序指令存储地址和数据存储地址指向同一个存储器的不同物理位置,采用单一的地址及数据总线,程序和数据的宽度相同。例如:8086、ARM7、MIPS„
(2)哈佛结构:程序和数据是两个相互独立的存储器,每个存储器独立编址、独立访问,是一种将程序存储和数据存储分开的存储器结构。例如:AVR、ARM9、ARM10„
(3)CISC 与RISC 的特点比较(参照教程22 页)。
计算机执行程序所需要的时间P 可以用下面公式计算:
P=I×CPI×T
I:高级语言程序编译后在机器上运行的指令数。
CPI:为执行每条指令所需要的平均周期数。
T:每个机器周期的时间。
(4)流水线的思想:在CPU 中把一条指令的串行执行过程变为若干指令的子过程在CPU 中重叠执行。
(5)流水线的指标:
吞吐率:单位时间里流水线处理机流出的结果数。如果流水线的子过程所用时间不一样长,则吞吐率应为最长子过程的倒数。
建立时间:流水线开始工作到达最大吞吐率的时间。若m 个子过程所用时间一样,均为t,则建立时间T=mt。
(6)信息存储的字节顺序
A、存储器单位:字节(8 位)
B、字长决定了微处理器的寻址能力,即虚拟地址空间的大小。
C、32 位微处理器的虚拟地址空间位2^32,即4GB。
D、小端字节顺序:低字节在内存低地址处,高字节在内存高地址处。
E、大端字节顺序:高字节在内存低地址处,低字节在内存高地址处。
F、网络设备的存储顺序问题取决于OSI 模型底层中的数据链路层。6.逻辑电路基础
(1)根据电路是否具有存储功能,将逻辑电路划分为:组合逻辑电路和时序逻辑电路。
(2)组合逻辑电路:电路在任一时刻的输出,仅取决于该时刻的输入信号,而与输入信号作用前电路的状态无关。常用的逻辑电路有译码器和多路选择器等。
(3)时序逻辑电路:电路任一时刻的输出不仅与该时刻的输入有关,而且还与该时刻电路的状态有关。因此,时序电路中必须包含记忆元件。触发器是构成时序逻辑电路的基础。常用的时序逻辑电路有寄存器计数器等。
(4)真值表、布尔代数、摩根定律、门电路的概念。(教程28、29 页)
(5)NOR(或非)和NAND(与非)的门电路称为全能门电路,可以实现任何一种逻辑函数。
(6)译码器:多输入多输出的组合逻辑网络。
每输入一个n 位的二进制代码,在m 个输出端中最多有一个有效。
当m=2n 是,为全译码;当m<2n 时,为部分译码。
(7)由于集成电路的高电平输出电流小,而低电平输出电流相对比较大,采用集成门电路直接驱动LED时,较多采用低电平驱动方式。液晶七段字符显示器LCD 利用液晶有外加电场和无外加电场时不同的光学特性来显示字符。
(8)时钟信号是时序逻辑的基础,它用于决定逻辑单元中的状态合适更新。同步是时钟控制系统中的主要制约条件。
(9)在选用触发器的时候,触发方式是必须考虑的因素。触发方式有两种:
电平触发方式:具有结构简单的特点,常用来组成暂存器。
边沿触发方式:具有很强的抗数据端干扰能力,常用来组成寄存器、计数器等。7.总线电路及信号驱动
(1)总线是各种信号线的集合,是嵌入式系统中各部件之间传送数据、地址和控制信息的公共通路。在同一时刻,每条通路线路上能够传输一位二进制信号。按照总线所传送的信息类型,可以分为:数据总线(DB)、地址总线(AB)和控制总线(CB)。
(2)总线的主要参数:
总线带宽:一定时间内总线上可以传送的数据量,一般用MByte/s 表示。
总线宽度:总线能同时传送的数据位数(bit),即人们常说的32 位、64 位等总线宽度的概念,也叫总线位宽。总线的位宽越宽,总线每秒数据传输率越大,也就是总线带宽越宽。
总线频率:工作时钟频率以MHz 为单位,工作频率越高,则总线工作速度越快,也即总线带宽越宽。
总线带宽= 总线位宽×总线频率/8,单位是MBps。
常用总线:ISA 总线、PCI 总线、IIC 总线、SPI 总线、PC104 总线和CAN 总线等。
(3)只有具有三态输出的设备才能够连接到数据总线上,常用的三态门为输出缓冲器。
(4)当总线上所接的负载超过总线的负载能力时,必须在总线和负载之间加接缓冲器或驱动器,最常用的是三态缓冲器,其作用是驱动和隔离。
(5)采用总线复用技术可以实现数据总线和地址总线的共用。但会带来两个问题:
A、需要增加外部电路对总线信号进行复用解耦,例如:地址锁存器。
B、总线速度相对非复用总线系统低。
(6)两类总线通信协议:同步方式、异步方式。
(7)对总线仲裁问题的解决是以优先级(优先权)的概念为基础。8.电平转换电路
(1)数字集成电路可以分为两大类:双极型集成电路(TTL)、金属氧化物半导体(MOS)。
(2)CMOS 电路由于其静态功耗极低,工作速度较高,抗干扰能力较强,被广泛使用。
(3)解决TTL 与CMOS 电路接口困难的办法是在TTL 电路输出端与电源之间接一上拉电阻R,上拉电阻R 的取值由TTL 的高电平输出漏电流IOH 来决定,不同系列的TTL 应选用不同的R 值。9.差错控制编码
(1)根据码组的功能,可以分为检错码和纠错码两类。检错码是指能自动发现差错的码,例如奇偶检验码;纠错码是指不仅能发现差错而且能自动纠正差错的码,例如循环冗余校验码。
(2)奇偶检验码、海明码、循环冗余校验码(CRC)。(教程70 到77 页)10.嵌入式系统的度量项目
(1)性能指标:分为部件性能指标和综合性能指标,主要包括:吞吐率、实时性和各种利用率。
(2)可靠性与安全性
可靠性是嵌入式系统最重要、最突出的基本要求,是一个嵌入式系统能正常工作的保证,一般用平均故障间隔时间MTBF 来度量。
(3)可维护性:一般用平均修复时间MTTR 表示。
(4)可用性
(5)功耗
(6)环境适应性
(7)通用性
(8)安全性
(9)保密性
(10)可扩展性
性价比中的价格,除了直接购买嵌入式系统的价格外,还应包含安装费用、若干年的运行维修费用和软件租用费。
11.嵌入式系统中信息表示与运算基础
(1)进位计数制与转换:这样比较简单,也应该掌握怎么样进行换算,有出题的可能。
(2)计算机中数的表示:源码、反码与补码。
正数的反码与源码相同,负数的反码为该数的源码除符号位外按位取反。
正数的补码与源码相同,负数的补码为该数的反码加一。
例如-98 的源码:11100010B
反码:10011101B
补码:10011110B
(3)定点表示法:数的小数点的位置人为约定固定不变。
浮点表示法:数的小数点位置是浮动的,它由尾数部分和阶数部分组成。
任意一个二进制N 总可以写成:N=2P×S。S 为尾数,P 为阶数。(4)汉字表示法(教程67、68 页),搞清楚GB2318-80 中国标码和机内码的变换。
(5)语音编码中波形量化参数(可能会出简单的计算题目哦)
采样频率:一秒内采样的次数,反映了采样点之间的间隔大小。
人耳的听觉上限是20kHz,因此40kHz 以上的采样频率足以使人满意。
CD 唱片采用的采样频率是44.1kHz。
测量精度:样本的量化等级,目前标准采样量级有8 位和16 位两种。
声道数:单声道和立体声双道。立体声需要两倍的存储空间。12.嵌入式系统的评价方法:测量法和模型法
(1)测量法是最直接最基本的方法,需要解决两个问题:
A、根据研究的目的,确定要测量的系统参数。
B、选择测量的工具和方式。
(2)测量的方式有两种:采样方式和事件跟踪方式。
(3)模型法分为分析模型法和模拟模型法。分析模型法是用一些数学方程去刻画系统的模型,而模拟模型法是用模拟程序的运行去动态表达嵌入式系统的状态,而进行系统统计分析,得出性能指标。
(4)分析模型法中使用最多的是排队模型,它包括三个部分:输入流、排队规则和服务机构。
(5)使用模型对系统进行评价需要解决3 个问题:设计模型、解模型、校准和证实模型。13.1.嵌入式微处理器的基本结构
(1)嵌入式硬件系统一般由嵌入式微处理器、存储器和输入/输出部分组成。
(2)嵌入式微处理器是嵌入式硬件系统的核心,通常由控制单元、算术逻辑单元和寄存器3大部分组成:
A、控制单元:主要负责取指、译码和取数等基本操作并发送主要的控制指令。
B、算术逻辑单元:主要处理数值型数据和进行逻辑运算工作。
C、寄存器:用于暂存临时性的数据。
2.嵌入式微处理器的分类(根据用途)
(1)嵌入式微控制器(MCU):又称为单片机,片上外设资源一般比较丰富,适合于控制。最大的特点是单片化,体积小,功耗和成本低,可靠性高。目前约占70%的市场份额。
(2)嵌入式微处理器(EMPU):又称为单板机,由通用计算机中的CPU 发展而来,它的特征是具有32位以上的处理器,具有较高的性能。通常嵌入式微处理器把CPU、ROM、RAM 及I/O 等模块做到同一个芯片上。
(3)嵌入式DSP 处理器(DSP):专门用于信号处理方面的处理器,其在系统结构和指令算法方面进行了特殊设计,使其处理速度比最快的CPU 还快10~50倍,在数字滤波、FFT、频谱分析等方面获得了大量的应用。
(4)嵌入式片上系统(SOC):追求产品系统最大包容的集成器件,其最大的特点是成功实现了软硬件的无缝结合,直接在微处理器片内嵌入操作系统的代码模块。
3.典型8位微处理器(具有8位数据总线)的结构和特点
该部分参考《教程》86~94页,以8051为重点,彻底搞清楚8位单片机的工作原理,外设控制、存储分布、寻址方式以及典型应用。2007年11月下午的第一道题目就考查了8051的定时器使用、外部时钟连接、实际应用的流程设计以及典型的寻址方式。这些考点几乎可以在《教程》上找到,例如外部时钟连接那个问题的答案就是《教程》89页上面的原图。4.典型16位微处理器的结构和特点
该部分参考《教程》94~97页。典型的微处理器可以参考MSP430,找一本这方面的书看看关于MSP430的结构原理以及典型应用。
5.典型32位微处理器的结构和特点
该部分参考《教程》97~112页。32位处理器采用32位的地址和数据总线,其地址空间达到了2^32=4GB。
目前主流的32位嵌入式处理器系统主要有ARM 系列、MIPS 系列、PoewrPC 系列等。ARM 微处理器体系结构目前被公认为是嵌入式应用领域领先的32位嵌入式RISC 处理器结构。按照目前的发展形式,ARM 几乎成了嵌入式应用的代名词。按照我个人的意见,作为嵌入式系统设计师考试,逐渐增加考查ARM 体系结构与编程方面的题目是大势所趋。2006年没有一道关于ARM 的题目,2007年出了少量题目,可能在2008年会继续增加。在下午题方面,2006年考查了X86方面的应用、2007年考查了8051方面的应用,这个可能是一个过度过程,以目前ARM 在嵌入式领域的广泛应用和普及程度,下午题目考查ARM 应用方面或者32位其他的微处理器方面的应用题目可能在不就将来的考试中就会出现。14.单片机系统的基本概念
(1)单片机组成:中央处理器、存储器、I/O 设备。
(2)存储器:物理实质是一组或多组具备数据输入/输出和数据存储功能的集成电路,用于充当设备缓存或保存固定的程序及数据。
A、ROM(只读存储器):一般用于存放固定的程序或数据表格等,数据在掉电后仍然会保留下来。
B、RAM(随机存储器):用于暂存程序和数据、中间计算结果,或用作堆栈用等,数据在掉电后就会丢失。
(3)I/O端口:单片机与外界联系的通道,它可以对各类外部信号(开关量、模拟量、频率信号)进行检测、判断、处理,并可控制各类外部设备。现在的单片机I/O 口已经集成了更多的特性和功能,对I/O端口的功能进行了拓展和复用,例如外部中断、ADC 检测以及PWM 输出等等。
(4)输出电平:高电平电压(输出“1”时)和低电平电压(输出“0”时)
A、TTL 电平:正逻辑,5V 为逻辑正,0V 为逻辑负,例如单片机的输出。
B、RS232电平:负逻辑,-12V 为逻辑正,+12V 为逻辑负,例如PC 的输出。
注:因此在单片机和PC 进行通讯的时候需要一个MAX232芯片进行电平转换。
(5)堆栈:它是一种线性的数据结构,是一个只有一个进出口的一维空间。
A、堆栈特性:后进先出(LIFO)
B、堆栈指针:用于指示栈顶的位置(地址),当发生压栈或者出栈操作时,导致栈顶位置变化时,堆栈指针会随之变化。
C、堆栈操作:压栈操作(PUSH)和出栈操作(POP)。
D、堆栈类型:“向上生长”型堆栈,每次压栈时堆栈指针加1;“向下生长”型堆栈,每次压栈堆栈时指针减1。
E、堆栈应用:调用子程序、响应中断时,堆栈用于保护现场;还可以用作临时数据缓冲区来使用。
F、使用注意:堆栈溢出问题,压栈和出栈的匹配问题。
(6)定时/计数器:实质都是计数器。用作定时器时是对单片机内部的时钟脉冲进行计数,而在用作计数器时是对单片机外部的输入脉冲进行计数,其作用如下:
A、计时、定时或延时控制;
B、脉冲技术;
C、测量脉冲宽度或频率(捕获功能)
(7)中断:优先级更高的事件发生,打断优先级低的时间进程。引起中断的事件称为中断源。一个单片机可能支持多个中断源,这些中断源可以分为可屏蔽中断和非可屏蔽中断,而这些中断源并不都是系统工作所需的,我们可以根据系统需求屏蔽那些不需要的中断源。
A、中断嵌套:当一个低级中断尚未执行完毕,又发生了一个高级优先级的中断,系统转而执行高级中断服务程序,待处理完高级中断后再回过头来执行低级中断服务程序。
B、中断响应时间是指从发出中断请求到进入中断处理所用的时间;中断处理时间是指中断处理开始到中断处理结束的时间。
C、中断响应过程:
a、保护现场:将当前地址、累加器ACC、状态寄存器保存到堆栈中。
b、切换PC 指针:根据不同的中断源所产生的中断,切换到相应的入口地址。
c、执行中断服务处理程序。
d、恢复现场:将保存在堆栈中的主程序地址、累加器ACC、状态寄存器恢复。
e、中断返回:从中断处返回到主程序,继续执行。
D、中断入口地址:单片机为每个中断源分配了不同的中断入口地址,也称为中断向量。
(8)复位:通过外部电路给单片机的复位引进一个复位信号,让系统重新开始运行。
A、复位发生时的动作:
a、PC 指针从起始位置开始执行(大多数单片机都时从0x0000处开始执行)。
b、I/O 端口设置成缺省状态(高阻态、或者输出低电平)。
c、部分专用控制寄存器SFR 恢复到缺省状态。
d、普通RAM 不变(如果时上电复位,则是随即数)。
B、两种不同的复位启动方式:
a、冷启动:也叫上电复位,指在断电状态下给系统加电,让系统开始正常运行。
b、热启动:在不断电的状态下,给单片机复位引进一个复位信号,让系统重新开始。
C、两种类型的复位电路:高电平复位和低电平复位。
D 注意事项:
a、注意复位信号的电平状态及持续时间必须满足系统要求。
b、注意避免复位信号抖动。
(9)时钟电路:单片机是一种时序电路,必须提供脉冲电路才能正常工作。时钟电路相当于单片机的心脏,它的每一次跳动(振动节拍)都控制着单片机的工作节奏。振荡得慢时,系统工作速度就慢,振荡得快时,系统工作速度就快(功耗也增大)。
A、振荡周期:振荡源的振荡节拍。
B、机器周期:单片机完成一个基本操作需要的振荡周期(节拍)。
C、指令周期:执行一条指令需要几个机器周期。不同的指令需要的机器周期数不同。15.地址映射
地址映射也叫地址重定位。
逻辑地址和物理地址是完全不同的,不能用逻辑地址来直接访问内存单元。
为了保证CPU 在执行指令的时候,可以正确地访问内存单元,需要将用户程序中的逻辑地址转换为运行时由机器直接寻址的物理地址。这个过程称为:地址映射。
地址映射由存储管理单元MMU 来完成。
地址映射主要有两种方式:静态地址映射和动态地址映射。
静态地址映射:当用户程序被装入内存时,直接对指令代码进行修改,一次性地实现逻辑地址到物理地址的转换。
动态地址映射:当用户程序被装入内存时,不对指令代码做任何修改,而是在程序的运行过程中,当它需要访问内存单元的时候,再来进行地址转换。
在具体实现时,这项转换工作一般是由硬件的地址映射机制来完成的。通常设置一个基地址寄存器,或者叫重定位寄存器。当一个任务被调度运行时,就把它所在分区的起始地址装入到整个寄存器中。然后,在程序运行的过程中,当需要访问某个内存单元时,硬件就会自动地将其中的逻辑地址加上基地址寄存器中的内容,从而得到实际的物理地址,并且按照这个物理地址区执行。
这个基地址寄存器位于MMU 的内部,整个地址映射过程是自动运行的。从理论上说,每访问一次内存都要进行一次地址映射。16.ARM体系结构的基本概念
(1)ARM:Advanced RISC Machine。
(2)ARM体系结构中支持两种指令集:ARM 指令集和Thumb 指令集。
(3)ARM内核有T、D、M、I四个功能模块:
A、T 模块:表示16位Thumb,可以在兼顾性能的同时减少代码尺寸。
B、D 模块:表示Debug,内核中放置了用于调试的结构,通常为一个边界扫描链JTAG。
C、M 模块:表示8位乘法器。
D、I 模块:表示EmbeddedICE Logic,用于实时断点观测及变量观测的逻辑电路部分。
(4)ARM处理器有7种运行模式:
A、用户模式(User):正常程序执行模式,用于应用程序。
D、快速中断模式(FIQ):快速中断处理,用于高速数据传输和通道处理。
C、外部中断模式(IRQ):用于通用的中断处理。
D、管理模式(SVE):供操作系统使用的一种保护模式。
E、数据访问中止模式(Abort):用于虚拟存储及存储保护。
F、未定义指令中止模式(Undefined):当未定义指令执行时进入该模式。
G、系统模式(System):用于运行特权级的操作系统任务。
除了用户模式之外的其他6种处理器模式称为特权模式,在这些模式下,程序可以访问所有的系统资源,也可以任意地进行处理器模式切换,其中,除了系统模式外,其他的5种特权模式又称为异常模式。
处理器模式可以通过软件控制进行切换,也可以通过外部中断或异常处理过程进行切换。大多数的用户程序运行在用户模式下,这时,应用程序不能访问一些受操作系统保护的系统资源,应用程序也不能直接进行处理器模式切换。当需要进行处理器模式切换时,应用程序可以产生异常处理,在异常处理中进行处理器模式的切换。这种体系结构可以使操作系统控制整个系统的资源。
当应用程序发生异常中断时,处理器进入相应的异常模式。在每一种异常模式种都有一组寄存器,供相应的异常处理程序使用,这样就可以保证进入异常模式时,用户模式下的寄存器不被破坏。系统模式并不是通过异常过程进入的,它和用户模式具有完全一样的寄存器,但是系统模式属于特权模式,可以访问所有的系统资源,也可以直接进行处理器模式切换,它主要供操作系统任务使用。17.嵌入式操作系统概述
(1)内核
内核是指操作系统中的一个组件,它包含了OS 的主要功能,即OS 的各种特性及其相
互之间的依赖关系,这些功能主要包括:
A、任务管理:对系统中运行的软件进行描述和管理,并完成处理器资源分配和调度。
B、存储管理:提高内存的利用率,方便用户使用,提供足够的存储空间。
C、设备管理:方便设备的使用,提高CPU 和I/O 设备的利用率。
D、文件管理:解决文件资源存储、共享、保密和保护等问题。
注:不同嵌入式操作系统的内核设计各不相同,取决于系统设计和实际需求。
(2)嵌入式操作系统分类:
A、按系统类型:商业系统、专用系统、开源系统。
B、按响应时间:硬实时系统、软实时系统。
C、按软件结构:单体结构(uCOS)、分层结构(MS-DOS)、微内核结构(Vxworks)。18.嵌入式软件基础
(1)嵌入式软件的特点:
A、规模较小。
B、开发难度大。
C、实时性和可靠性要求高。
D、要求固化存储。
(2)嵌入式软件分类:
A、系统软件:控制和管理嵌入式系统资源,如嵌入式操作系统、驱动程序、中间件等。
B、应用软件:定义嵌入式设备的主要功能和用途,负载与用户进行交互。
C、支撑软件:辅助软件开发的工具软件。
(3)无操作系统的嵌入式软件的两种实现方式:
A、循环轮转
优点:简单、直观、开销小、可预测。
缺点:过于简单,所有代码顺序执行,无法处理异步事件,缺乏并行处理能力。
B、前后台系统(在循环轮转的基础上增加了中断处理功能)
前台(事件处理级):中断服务程序,负载处理异步事件。
后台(任务级):一个无限循环,负载资源分配、任务管理和系统调度。
(4)有操作系统的三大优点:
A、提高系统的可靠性。
B、提高了系统的开发效率,降低了开发成本,缩短了开发周期。
C、有利于系统的扩展与移植。
(5)设备驱动层(也叫板级支持包BSP:包含了嵌入式系统中所有与硬件相关的代码)
大多数的嵌入式硬件设备都需要某种类型软件的初始化和管理。这部分工作由设备驱动层来完成的,它负责直接与硬件大交道,对硬件进行管理和控制,为上层软件提供所需的驱动支持,类似PC 系统中的BIOS 和驱动程序。19.设备管理
(1)设备管理基础
一个I/O 单元通常由两个部分组成:
A、机械部分:I/O 设备本身。
B、电子部分:设备控制器或设备适配器。
硬件寄存器的编址方式有三种:
A、I/O独立编址:对于各种设备控制器中的每一个寄存器,分配一个唯一的I/O端口编号,也叫I/O 端口地址,然后用专门的I/O 指令对这些端口进行操作。这些端口地址构成的地址空间是完全独立的,与内存地址空间没有任何关系。
B、内存映象编址:把各种设备控制器当中的每一个寄存器都映射为一个内存单元,这内存单元专门用于I/O 操作。端口地址空间与内存地址空间是统一编址的,端口地址空间是内存地址空间的一部分。
C、混合编址:对于设备控制器当中的寄存器采用独立编址的方法,每个寄存器有一个独立的I/O 端口地址;而对于设备的数据缓冲区,则采用内存映象编址的方法,把他们统一到内存地址空间当中。
(2)I/O控制方式:
A、程序循环检测:要一直占用CPU,浪费CPU 的时间。
B、中断驱动方式:前后台系统。
C、直接内存访问:DMA 控制,减少了中断的次数。20.任务管理
(1)嵌入式操作系统的任务管理可以分为:
A、单道程序技术:操作系统中,任何时候只能有一个程序在运行。
B、多道程序技术:操作系统中,允许多个程序同时存在并运行。
(2)进程
进程,简单的说,是一个正在运行的程序。
进程与程序既有联系又有区别,主要表现为下面结构方面:
A、程序由数据和代码两部分内容组成,它是一个静态的概念。而进程是正在执行的程序,它也由两部分组成:程序和该程序的运行上下文。它是一个动态的概念。
B、程序和进程之间并不是一一对应的。一个进程在运行的时候可以启动一个或多个程序。反之,同一个程序也可能由多进程同时执行。
C、程序可以作为一种软件资源长期保存,以文件的形式存放在光盘或硬盘上,而进程则是一次执行的过程,它是暂时的,是动态的产生和终止。
一个进程至少应包括三个方面:相应的程序、CPU上下文、一组系统资源。
进程有三个特性:
A、动态性:进程是正在运行的程序,而程序的运行状态是不断变化的。
B、独立性:进程是系统资源的使用单位,每个进行有自己的运行上下文和内部状态。
C、并发性:宏观来看,系统中同时有多个进程存在,它们相互独立地运行。
注:对于并发的理解。
在单CPU 的情况下,所谓的并发性指的是宏观上的并发运行,而微观上还是顺序进行,各个进程轮流去使用CPU 资源。在单核CPU 中,真正的、物理上的PC 寄存器只有一个,进程在轮流执行的时候,物理PC 的取值也在不断变化。而逻辑PC 其实就是一个内存变量。每个进程都有一个逻辑PC,当一个进程要运行的时候,就把它的逻辑PC 装载到物理PC 中去;反之,当一个进程暂不运行的时候,就把物理PC中的值保存在它的逻辑PC 当中。
(3)线程
线程就是进程当中的一条执行流程。
进程其实包含两个部分:资源平台和执行流程(线程)。
在一个进程当中,或者说在一个资源平台上,可以同时存在多个线程;可以用线程作为CPU 的基本调度单位,使得各个线程之间可以并发执行;对于同一个进程当中的各个线程来说,他们可以共享该进程的大部分资源。每个线程都有自己独立的CPU运行上下文和栈,这是不能共享的。21.文件系统
(1)嵌入式文件系统概述
文件系统就是操作系统中用以组织、存储、命名、使用和保护文件的一套管理机制。
常见的嵌入式文件系统有:
A、FAT:VxWorks、QNX、WindowsCE 等
B、NFS:网络文件系统,基于远程调用和扩展数据表示。
C、FFS:用于Flash 存储器的文件系统。
(2)文件和目录
A、当一个文件被创建时,必须给它指定一个名字,用户就是通过文件名来访问这个文件的。
B、文件命是一个有限长度的字符串,由两部分组成:文件名和扩展名。
C、文件的逻辑结构主要有三种:无结构、简单的记录结构和复杂结构。现代文件系统通常采用的是无结构的形式。
D、除了文件名之外,操作系统会给每个文件附加一些其他信息,称为文件的属性。
E、文件的存取方法有两种:顺序存取和随机存取。
F、目录也称为文件夹,它是一张表格,记录了在该目录下每个文件名和其他的一些管理信息。
G、在多级目录结构中,访问文件或目录主要有两种方法:绝对路径名和相对路径名。22.存储器系统的层次架构
计算机系统的存储器被组织城一个金字塔的层次结构。
自上而下为:CPU 内部寄存器、芯片内部高速缓存(cache)、芯片外部高速缓存(SRAM、SDRAM、DRAM)、主存储器(FLASH、EEPROM)、外部存储器(磁盘、光盘、CF 卡、SD 卡)和远程二级存储器(分布式文件系统、WEB 服务器),6个层次的结构。
上述设备从上而下,依次速度更慢、容量更大、访问频率更小,造价更便宜。22.高速缓存(cache)
工作原理(参照教程126页,博客画不了图):主要利用了程序的局部性特点。
地址映象是指把主存地址空间映象到cache 的地址空间。
地址变换是指当程序或数据已经装入到cache 后,在实际运行过程中,把主存地址如何编程cache 空间的地址。
常用的地址映象和地址变换的方式有:(教程127页)
直接映象和变换:速度快,造价低,但有局限性,不能充分利用cache 的好处。
组相联地址映象和变换:速度稍慢但是命中率高。
全相联地址映象和变换:可以任意映射。
常用的cache 替换算法:轮转法和随机替换算法。
高速缓存的分类:
统一cache 和独立的数据/指令cache
写通cache 和写回cache
读操作分配cache 和写操作分配cache 23.存储管理单元(MMU)
MMU 在CPU 和物理内存之间进行地址转换,将地址从逻辑空间映射到物理空间,这个过程称为内存映射。
MMU 主要完成下面的工作:
A.虚拟存储空间到物理空间的映射。
B.存储器访问权限的控制。
C.设置虚拟存储空间的缓冲特性。
嵌入式系统中常常采用页式存储管理。为了管理这些页引入了页表的概念。
页表是位于内存中的表,它的每一行对应虚拟存储空间的一个页,该行包含了该虚拟内存页对应的物理内存页的地址、该页的访问权限和该页的缓冲特性等。
从虚拟地址到物理地址的变换过程就是查询页表的过程。
由于页表存储在内存中的,整个查询过程需要付出很大的代价。根据程序局部性的特点,增加了一个小容量、高速度的存储部件来存放当前访问需要的地址变换条目,这个存储部件称为:地址转换后备缓冲器(TLB)。
当CPU 访问内存时,首先在TLB 中查找需要的地址变换条目,如果该条目不存在,CPU 再从内存中的页表中查询,并把相应的结果添加到TLB 中,更新它的内容。
嵌入式系统中虚拟存储空间到物理空间的映射以内存块为单位进行。即虚拟存储空间中一块连续的存储空间被映射到物理存储空间中同样大小的一块连续存储空间。
在页表和TLB 中,每一个地址变换条目实际上记录了一个虚拟存储空间的内存块的基地址与物理存储空间相对应的一个内存块的基地址之间的对应关系。
在MMU 中实现虚拟地址到物理地址的映射是通过两级页表来实现的。
禁止MMU 时,所有物理地址和虚拟地址相等,即使用平板存储模式。24.内存保护
操作系统通常利用MMU 来实现操作系统内核与应用程序之间的隔离,以及应用程序与应用程序之间的隔离。
内存保护包含两个方面的内容:
A.防止地址越界,每个应用程序都有自己独立的地址空间。
B.防止越权操作,每个应用程序都有自己的访问权限。25.实模式与保护模式
在嵌入式系统中,常见的存储管理方案可以分为两大类:实模式和保护模式。
实模式:内存的平面使用模式。特点有:
A.不划分“系统空间”与“用户空间”,无须进行地址映射。
B.操作系统与应用程序之间不再有物理的边界。
C.系统中的“任务”或“进程”,实际上全是内核线程。
在实模式下,内存布局可以分为5个段:
A.代码段:包含操作系统和应用程序的所有代码。
B.数据段:所有带有初始值的全局变量。
C.BSS 段:所有未带初始值的全局变量。
D.堆空间:动态分配的内存空间。
E.栈空间:保存上下文以及函数调用时的局部变量和形参。
在实模式存储管理方案下,主要的工作在于堆空间的管理,即如何来管理空闲的堆空间、如何来分配内存、如何来回收内存等等。
保护模式:处理器中必须有MMU 硬件并启用。特点有:
A.系统内核和用户程序都有各自独立的地址空间。
B.每个应用程序只能访问自己的地址空间,不能去破坏操作系统和其他应用程序的代码和数据。26.分区存储管理
为了实现多道程序系统而采用的最简单的内存管理。
基本思路:把整个内存划分为两大区域,即系统区和用户区,然后再把用户区划分为若干个分区,每个任务占有其中的一个分区。这样,在内存当中就同时保留多个任务,让他们共享整个用户区,从而实现多个任务的并发运行。
分区存储管理又可以分为两类:固定分区和可变分区。
固定分区:各个用户分区的个数、位置和大小一旦确定后,就固定不变,不能再修改。
优点:易于实现,系统开销较小。
缺点:内存利用率不高,分区总数固定。
可变分区:动态创建,在装入一个程序时,系统将根据它的需求和内存空间的使用情况来决定是否分配。
优点:动态变化,非常灵活。
缺点:可能存在外碎片。
在实现可变存储管理技术的时候,需要考虑三个方面的问题:
A.内存管理的数据结构
B.内存的分配算法
C.内存的回收算法
27.嵌入式系统的特点、分类、发展与应用,熟悉嵌入式系统的逻辑组成。
(1)特点:
专用性
隐蔽性(嵌入式系统是被包装在内部)
资源受限(要求小型化、轻型化、低功耗及低成本,因此软硬件资源受到限制)
高可靠性(任何误动作都可能会产生致命的后果)
软件固化(软件都固化在只读存储器ROM中,用户不能随意更改其程序功能)
实时性
(2)逻辑组成
硬件:1)处理器(运算器、控制器、存储器)
目前所有的处理器都是微处理器 中央处理器(CPU)和协助处理器(数字信号处理器DSP、图像处理器、通信处理器)
2)存储器(随机存储器RAM和只读存储器ROM)
RAM分为动态DRAM和静态SRAM两种。DRAM电路简单、集成度高、功耗小、成本低,但速度稍慢慢;SRAM电路较复杂、集成度低、功耗较大、成本高,但工作速度很快,适合用作指令和数据的高速缓冲存储器
RAM当关机或断电时,其中的信息都会消失,属于易失性存储器
ROM属于不易失性存储器。分为电可擦可编程只读存储器(存放
固件)和闪速存储器(Flash ROM简称内存)。内存的工作原理:在低
压下,存储的信息可读但不可写,这类似于ROM;在较高的电压下,所存储的信息可以更改和删除,这有类似于RAM。
3)I/O设备与I/O接口
4)数据总线
软件
(3)分类
按嵌入式系统的软硬件技术复杂程度进行分类:
1)低端系统 采用4位或8位单片机,在工控领域和白色家电领域占主导地位,如计算器、遥控器、充电器、空调、传真机、BP机等。
2)中端系统 采用8位/16位/32位单片机,主要用于普通手机、摄像机、录像机、电子游戏机等。
3)高端系统采用32位/64位单片机,主要用于智能手机、调制解调器、掌上计算机、路由器、数码相机等。
(4)发展
20世纪60年代初,第一个工人的现代嵌入式系统(阿波罗导航计算机)
20世纪60年代中期,嵌入式计算机批量生产
20世纪70年代,微处理器出现
20世纪80年代中期,外围电路的元器件被集成到处理器芯片中,昂贵的模拟电路元件能被数字电路替代
20世纪90年代中期SOC出现,集成电路进入超深亚微米乃至纳米加工时代。28.嵌入式系统的组成与微电子技术(集成电路、EDA、SoC、IP核等技术的作用和发展)
(1)集成电路IC 集成电路的制造大约需要几百道工序,工艺复杂。集成电路是在硅衬底上制作而成的。硅衬底是将单晶硅锭经切割、研磨和抛光后制成的像镜面一样光滑的圆形薄片,它的厚度不足1mm,其直径可以是6、8、12英寸甚至更大这种硅片称为硅抛光片,用于集成电路的制造。制造集成电路的工艺技术称为硅平面工艺,包括氧化、光刻、掺杂等多项工序。把这些工序反复交叉使用,最终在硅片上制成包含多层电路及电子元件的集成电路。集成电路的特点:体积小、重量轻、可靠性高。其工作速度主要取决于逻辑门电路的晶体管的尺寸。尺寸越小,工作频率就越高,门电路的开关速度就越快。(2)EDA(电子信号自动化)(3)SoC芯片(片上系统)
既包含数字电路,也可以包含模拟电路,还可以包含数模混合电路和射频电路。SoC芯片可以是一个CPU,单核SoC,也可以由多个CPU和/或DSP,即多核SoC。开发流程:
(1)总体设计
可以采用系统设计语言System C(或称IEEE 1666,它是C++的扩充)或System Vetilog语言对SoC芯片的软硬件作统一的描述,按照系统需求说明书确定SoC的性能能参数,并据此进行系统全局的设计。
(2)逻辑设计
将总体设计的结果用RTL(寄存器传输级描述语言)语言进行描述(源文件)后,在使用逻辑综合将源文件进行综合生成,生成最简的布尔表达式核心好的连接关系(以类型为EDF的EDA工业标准文件表示)(3)综合和仿真
(4)芯片制造
借助EDA中的布局布线工具(4)IP核
IC设计文件:逻辑门级,包括各种基本的门电路;寄存器传输级,如寄存器、译码器、数据转换器;行为级,如CPU、DSP、存储器、总线与接口电路等。核库中的设计文件均属于知识产权IP保护的范畴,所以称为“知识产权核”或“IP核”。IP核是开发SoC的重要保证。按IC设计文件的类型,IP通常分为:软核、固核、硬核。IP核的复用可以减少研发成本,缩短研发时间,是实现SoC的快速设计,尽早投放市场的有效途径。
目前主要的CPU内核有ARM、MIPS、PowerPC、Coldfile、x86、8051等。ARM内核占所有32位嵌入式RISC处理器的90%以上。
29.嵌入式系统与数字媒体(文本、图像和音频/视频等数字媒体的表示与处理)(1)文本
含义:在计算机中的文字信息,最常用的一种数字媒体。字符集及其编码
1)西方字符的编码
ASCII字符集和ASCII编码,基本的ASCII字符集共128个字符,每个字符使用7个二进位(最高位为奇偶校验位,预留位)制进行编码。2)汉字的编码
汉子国家编码标准有GB2312和GB18030。每个汉字用2个字节表示。GB2312只有6763个汉字,经常不够用。GB18030字符集与UCS/Unicode字符集基本兼容,采用不等长的编码方法,单字节编码表示ASCII字符,与ASCII码兼容;双字节表示汉字,与GB2312保持向下兼容(即GB2312中有的GB18030字符集都有)3)UCS/Unicode编码 文本类型 1)简单文本
只能顺序阅读。2)丰富格式文本
有插图、对文字颜色等定义,调整页面,文本布局,插入声音视频等。3)超文本
通过超链接实现跳转、导航、回溯等操作(2)图像
图像获取过程的核心是模拟信号的数字化,处理步骤为:
1)扫描
将画面网格化,每个网格为一个取样点 2)分色
将每个取样点的颜色分解成三原色
3)取样
测量每个取样点的每个分量(基色)亮度值
4)量化
把模拟量使用数字量来表示,A/D转换
数字图像的主要参数:图像大小(水平分辨率*竖直分辨率)、位平面数目、像素深 度、颜色模型
一幅图像的数据量计算公式:
图像数据量=图像大小*像素深度/8(3)音频/视频
音频/视频信息的数字化,处理步骤为: 1)取样
2)量化
3)编码
数字音频的主要参数:取样频率、量化位数、声道数目、使用的压缩编码方法、比特率(每秒钟的数据量)
压缩前
波形声音的码率(比特率)= 取样频率 * 量化为数 * 声道数(单位b/s)压缩后
码率 = 压缩前码率 / 压缩倍数(压缩比)
30.嵌入式系统与网络通信技术(数字通信与计算机网络,TCP/IP协议,互联网接入技术等)(1)数字通信(2)计算机网络(3)音频/ TCP/IP协议(4)互联网接入技术
31.ARM处理器内核的体系结构(工作状态,工作模式,寄存器组织,异常,数据类型与存储格式等)(1)工作状态
一是ARM状态,二是Thumb指令状态及Thumb-2状态,三是调试状态。ARM处理器复位后开始执行代码时总是只处于ARM状态,如果需要,可通过下面的方法切换到Thumb状态或Thumb-2状态
ARM状态切换到Thumb指令状态:通过BX指令,将操作数寄存器的最低位设置为1即可。如果R0[0]=1,则执行BX R0指令将进入Thumb状态
Thumb状态切换到ARM状态:通过BX指令,将操作数寄存器的最低位设置为0即可。如果R0[0]=0,则执行BX R0指令将进入ARM状态。(2)七种工作模式
(3)寄存器组织
ARM处理器共有37种寄存器,包括31个通用寄存器(含PC)和6个状态寄存器。无论何种模式,R15均作为PC使用;CPSR为当前程序状态寄存器;R7-R0为公用的通用寄存器。所有通用寄存器均为32位结构。程序状态寄存器的格式: 31 30 29 28 27
26„„8
0
条件码标志含义如下:
N为符号标志位,N=1为负数,N=0为正数。Z为全0标志位,运算结果为0,则Z=1,否则Z=0; C为进借位标志,有进/借位时C=1,否则C=0.V为溢出标志,加减法运算结果溢出时V=1,否则V=0.Q为增强的DSP运算指令溢出标志,溢出时Q=1,否则Q=0.控制位含义如下:
I为中断禁止控制位,I=1禁止IRQ中断,I=0,允许中断。
F为禁止快速中断FIQ的控制位,F=1禁止FIQ中断,F=0允许。
T为ARM和Thumb指令切换,T=1时执行Thumb指令,否则执行ARM指令。
M4-M0为模式选择位(4)存储格式
大端模式:32位数据字的高字节存储在低地址,而数据字的低字节则存放在高地址中。
小端模式:32位数据字的高字节存储在高地址,而数据字的低字节则存放在低地址中。系统复位时,自动默认为小端模式。
例如:一个32位数据字0x12345678,存放在起始地址为0x30001000,则大端模式下0x30001000单元存放0x12,0x30001001单元存放0x34,0x30001002单元存放0x56,0x30001003单元存放0x78;而小端模式下0x30001000单元存放0x78,0x30001001单元存放0x56,0x30001002单元存放0x34,0x30001003单元存放0x12。(5)数据类型
8位、16位、32位三种数据类型(6)ARM处理器中MMU和MPU
MMU存储器管理单元(memory management unit)功能:
1)虚拟地址到物理地址映射
2)存储器访问权限受限
3)虚拟存储空间的缓冲特性设置
MPU存储器保护单元(memory protect unit)(7)异常(7种)
32.嵌入式处理器的结构、特点与分类(不同类型的典型嵌入式处理器及其特点,嵌入式处理器分类等)
(1)不同内核嵌入式微控制器性能比较
(2)冯–诺依曼结构和哈佛结构的区别
两者连接CPU程序存储器和数据存储器的方式不同 冯–诺依曼结构
CPU 程序/数据存储器
哈佛结构
程序存储器 CPU 数据存储器程序总线
数据总线(3)分类
按指令集分为:复杂指令集结构CISC和精简指令集结构RISC 按存储机制分为:冯–诺依曼结构和哈佛结构 按字长分为:8位、16位、32位、64位结构
按不同内核系列可以分为:
51、AVR、PIC、MSP430、PowerPC、Coldfile、ARM(4)不同典型内核简介
32.ARM处理器指令系统及汇编语言程序设计(指令格式,寻址方式,指令集,伪指令,语句格式与程序结构,ARM汇编语言与C的混合编程等)(1)指令格式
指令一般格:
{}{S} ,{,}
其中<>不可省
指令格式说明:
关于#imm8m的说明:#表示立即数,其后可以是十进制或十六进制数。
对于ARM指令集,#imm8m表示一个由8位立即数经循环右移任意偶数位次形成的32位操作数。
对于Thumb指令集,#imm8m表示一个由8位立即数经左移任意位次形成的32位操作数。寻址方式:
33.典型ARM处理器内核(ARM9,Cortex-A,Cortex-M,Cortex-R等的技术特点与应用领域)(1)Cortex-A系列是面向高端嵌入式应用的处理器核:具有MMU、Cache、最快频率、最高性能、合理功耗。
(2)Cortex-R系列是面向实时控制的处理器:具有MPU、Cache、实时响应、合理性能、较低功耗。(3)Cortex-M系列是面向低端微控制器的处理器,没有MMU但有MPU,极高性价比、最低成本,极低功耗。
34.嵌入式硬件组成与嵌入式处理芯片(组成,特点,类型,ARM的AMBA总线,嵌入式处理芯片的选型)
基于ARM内核的典型嵌入式应用系统硬件组成
典型嵌入式系统硬件由嵌入式最小硬件系统(电源电路、时钟(晶振)电路、复位电路、JTAG测试接口)、前向通道(输入接口)、后向通道(输出接口)、人机交互通道(键盘,触摸屏以及LED或LCD显示输出接口)以及相互互联通信通道(CAN通信接口、以太网通信接口、USB通信接口)等组成。
电源电路为整个嵌入式系统提供能量,是整个系统工作的基础,具有极其重要的位置。一般来说,如果电源电路处理得好,整个系统的故障往往能显著减少。选择设计电源电路是主要考虑以下因素:输出电压电流、输入电压电流(交流还是直流)、安全因素、体积限制、功耗限制、成本限制。
常用的电源模块是交流变直流(AC-DC)模块、直流变直流模块(DC-DC)、低压稳压器(LDO)。稳压器包括普通稳压器和低压差稳压器LDO。78XX系列属于普通稳压器,LM2576/2596为开关稳压芯片,CAT6219/AS2815/1117/2908等属于低压稳压器。稳压器的最大特点就是低噪声、低成本、纹波小、精度高、电路简单。35.基于ARM内核的典型嵌入式芯片的硬件组成1)存储器及控制器
片内程序存储器通常是用Flash ROM,一般配有几KB到几MB不等。片内数据存储器通常使用SRAM,一般几KB到几百KB。2)中断控制器
一般采用向量中断(VIC)或嵌套向量中断(NVIC)。Cortex-M支持嵌套的向量中断。3)DMA控制器(直接存储器访问控制器)
使用DMA控制器,可将数据块从外设传输至内存、从内存传输至外设或从内存传输至内存。
4)电源管理与时钟控制器
5)GPIO接端口(General Purpose Input Output通用输入/输出端口)
作为输入时具有缓冲功能,而作为输出是具有锁存功能,GPIO也可以作为双向I/O使用。在ARM处理芯片中,GPIO引脚通常是多功能的,以减少引脚数,减少功耗。6)定时计数组件
主要包括看门狗定时器(WDT)监视着程序的运行状态 Timer通用定时器
用于一般的定时
RTC可直接提供年月日时分秒,使应用系统具有独立的日期和时间
脉冲宽度调制解调器(PWM)用于脉冲宽度的调制,比如电机控制、用于变频调整等。7)模拟通道组件
8)互联通信组件
36.嵌入式处理芯片的选型 1)性价比原则
性能高,价格低 2)参数选择原则
ARM内核(指令流水线、支持Thumb/Thumb-2指令集、最高时钟频率的限制、最低功耗要求以及低成本要求)系统时钟频率(频率越高,处理速度越快;通常ARM芯片的速度主要取决于ARM内核)芯片内部存储器的容量
片内外围电路(GPIO外部引脚条数、定时计数器、LCD液晶显示控制器、多核处理器、ADC、通信接口)
37.常用ARM嵌入式处理芯片
1)NXP的典型ARM芯片
2)TI的典型ARM芯片
3)Samsung的典型ARM芯片
4)Atmel的典型ARM芯片
5)ST的典型ARM芯片
6)Freescale的典型ARM芯片
7)Nuvoton的典型ARM芯片
8)Intel的典型ARM芯片
9)其他ARM芯片厂家 38.页式存储管理(重点)
基本思路:把物理内存划分为许多固定大小的内存块,称为物理页面;把逻辑地址空间也划分为大小相同的块,称为逻辑页面。当一个用户程序被装入内存时,不是以整个程序为单位,把它存放在一整块连续的区域,而是以页面为单位来进行分配的。对于一个大小为N 的页面程序,需要有N 个空闲的物理页面来把它装载。这些物理页面不一定是要连续的。
在页式存储管理中需要解决三个问题:数据结构、内存分配与回收、地址映射。
数据结构有两个:页表和物理页面表。
A.页表:给出了任务逻辑页面号和内存中物理页面号之间的对应关系。
B.物理页面表:描述内存空间中,各个物理页面的使用情况。
具体的例子请参考《教程》317页(博客中画不了图,有兴趣自己看)。
内存的分配过程:
A.对于一个新来的任务,计算它所需要的页面数N,然后查看位示图,看是否还有N 个空闲的物理页面。
B.如果有足够的空闲物理页面,就去申请一个页表,其长度为N,并把页表的起始地址填入到该任务的控制块中。
C.分配N 个空闲的物理页面,把他们的变换填到页表中,建立逻辑页面与物理页面直接的对应关系。
D.修改位示图,对刚刚被占用的那些物理页面进行标记。地址映射的基本思路:
A.逻辑地址分析:对逻辑地址,找到它所在的逻辑页面,以及它在页面内的偏移地址。
B.页表查找:根据逻辑页面号,从页表中找出它对应的物理页面号。
C.物理地址合成:根据物理页面号和页内偏移地址,最终确定物理地址。
逻辑地址分析:
页面的大小都是2的整数次幂。对于给定的一个逻辑地址,可以直接把它的高位部分作为逻辑页面号,把它的低位部分作为页内偏移地址。例如,假设页面的大小是4KB,即2的12次幂,逻辑地址为32为,那么在一个逻辑地址当中,最低12位为页内偏移地址,而剩下的20位就是逻辑页面号。
计算方法:
逻辑页面号=逻辑地址/页面大小
页内偏移量=逻辑地址%页面大小
页表查找:
页表作为操作系统的一个数据结构,通常保存在内核的地址空间中。
页表基地址寄存器用来指向页表的起始地址;页表长度寄存器用来指示页表的大小,即对于当前任务,它总共包含有多少个页面。
物理地址合成:
假设物理页面号为f,页内偏移地址为offset,每个页面大小为2n,那么相应的物理地址为:f×2n+offset。39.虚拟存储管理
程序局部性原理:时间局限性和空间局限性。
虚拟页式存储管理:在页式管理的基础上,增加了请求调页和页面置换的功能。
基本思路:当一个用户程序需要调入内存去运行时,不是将这个程序的所有页面都装入内存,而是只装载部分的页面,就可以启动这个程序运行。在运行过程中,如果发现要执行的指令或者访问的数据不在内存当中,就向系统发出缺页中断请求,然后系统在处理这个中断请求时,就会将保存在外存中的相应页面调入内存,从而使该程序能继续运行。
在虚拟页式存储管理中,页表包含:逻辑页面号、物理页面号、驻留位、保护位、修改位和访问位。
常用的页面置换算法:
A.最优页面置换算法:理想化算法。
B.最近最久未使用算法:链表法和栈方法。寻找长时间没有被访问的页面。
C.最不常用算法:每个页面设置一个访问计数器。
D.先进先出算法:性能比较差。
E.时钟页面置换算法:把页面组成环形链表,类似时钟面。
一般来说,当一个任务刚刚启动的时候,它会不断去访问一些新的页面,然后逐步建立一个比较稳定的工作集。工作集是指当前任务正在使用的逻辑页面的集合。如果分配给一个任务的物理页面数太少,不能包含整个的工作集,任务将会造成很多缺页中断,需要频繁地进行页面置换,这种现象称为“抖动”。40.Flash存储器
(1)Flash 存储器是一种非易失性存储器,根据结构的不同可以将其分为NOR Flash 和NAND Flash 两种。
(2)Flash存储器的特点:
A、区块结构:在物理上分成若干个区块,区块之间相互独立。
B、先擦后写:Flash 的写操作只能将数据位从1写成0,不能从0写成1,所以在对存储器进行写入之前必须先执行擦除操作,将预写入的数据位初始化为1。擦除操作的最小单位是一个区块,而不是单个字节。
C、操作指令:执行写操作,它必须输入一串特殊指令(NOR Flash)或者完成一段时序(NAND Flash)才能将数据写入。
D、位反转:由于Flash 的固有特性,在读写过程中偶尔会产生一位或几位的数据错误。位反转无法避免,只能通过其他手段对结果进行事后处理。
E、坏块:区块一旦损坏,将无法进行修复。对已损坏的区块操作其结果不可预测。
(3)NOR Flash的特点:
应用程序可以直接在闪存内运行,不需要再把代码读到系统RAM 中运行。NOR Flash 的传输效率很高,在1MB~4MB 的小容量时具有很高的成本效益,但是很低的写入和擦除速度大大影响了它的性能。
(4)NAND Flash的特点
能够提高极高的密度单元,可以达到高存储密度,并且写入和擦除的速度也很快,这也是为何所有的U盘都使用NAND Flash 作为存储介质的原因。应用NAND Flash 的困难在于闪存需要特殊的系统接口。41.RAM存储器
(1)SRAM 的特点:
SRAM 表示静态随机存取存储器,只要供电它就会保持一个值,它没有刷新周期,由触发器构成基本单元,集成度低,每个SRAM 存储单元由6个晶体管组成,因此其成本较高。它具有较高速率,常用于高速缓冲存储器。
通常SRAM 有4种引脚:
CE:片选信号,低电平有效。
R/W:读写控制信号。
ADDRESS:一组地址线。
DATA:用于数据传输的一组双向信号线。
(2)DRAM 的特点:
DRAM 表示动态随机存取存储器。这是一种以电荷形式进行存储的半导体存储器。它的每个存储单元由一个晶体管和一个电容器组成,数据存储在电容器中。电容器会由于漏电而导致电荷丢失,因而DRAM器件是不稳定的。它必须有规律地进行刷新,从而将数据保存在存储器中。
DRAM 的接口比较复杂,通常有一下引脚:
CE:片选信号,低电平有效。
R/W:读写控制信号。
RAS:行地址选通信号,通常接地址的高位部分。
CAS:列地址选通信号,通常接地址的低位部分。
ADDRESS:一组地址线。
DATA:用于数据传输的一组双向信号线。
(3)SDRAM 的特点:
SDRAM 表示同步动态随机存取存储器。同步是指内存工作需要同步时钟,内部的命令发送与数据的传输都以它为基准;动态是指存储器阵列需要不断的刷新来保证数据不丢失。它通常只能工作在133MHz的主频。
(4)DDRAM 的特点
DDRAM 表示双倍速率同步动态随机存取存储器,也称DDR。DDRAM 是基于SDRAM 技术的,SDRAM 在一个时钟周期内只传输一次数据,它是在时钟的上升期进行数据传输;而DDR 内存则是一个时钟周期内传输两次次数据,它能够在时钟的上升期和下降期各传输一次数据。在133MHz 的主频下,DDR内存带宽可以达到133×64b/8×2=2.1GB/s。42.存储器系统的层次架构
计算机系统的存储器被组织成一个金字塔的层次结构。
自上而下为:CPU内部寄存器、芯片内部高速缓存(cache)、芯片外部高速缓存(SRAM、SDRAM、DRAM)、主存储器(FLASH、EEPROM)、外部存储器(磁盘、光盘、CF卡、SD卡)和远程二级存储器(分布式文件系统、WEB服务器),6个层次的结构。
上述设备从上而下,依次速度更慢、容量更大、访问频率更小,造价更便宜。
2、高速缓存(cache)
工作原理(参照教程126页,博客画不了图):主要利用了程序的局部性特点。
地址映象是指把主存地址空间映象到cache的地址空间。
地址变换是指当程序或数据已经装入到cache后,在实际运行过程中,把主存地址如何编程cache空间的地址。
常用的地址映象和地址变换的方式有:(教程127页)
直接映象和变换:速度快,造价低,但有局限性,不能充分利用cache的好处。
组相联地址映象和变换:速度稍慢但是命中率高。
全相联地址映象和变换:可以任意映射。
常用的cache替换算法:轮转法和随机替换算法。
高速缓存的分类:
统一cache和独立的数据/指令cache
写通cache和写回cache
读操作分配cache和写操作分配cache 43.I/O接口、I/O设备以及外部通信接口(GPIO、IC、SPI、UART、USB、HDMI等;键盘、LED、LCD、触摸屏、传感器等;RS-232/RS-485、CAN、以太网和常用无线通信接口)(1)GPIO(通用输入输出接口)
在嵌入式处理器内部,输入具备缓冲功能,输出具有锁存功能。GPIO一般有三态:0态、1态、高阻状态。
(2)集成电路互连总线接口IIC 集成电路互连总线用于连接嵌入式处理器及外围器件,采用串行半双工传输的总线标准。IIC总线具有的接口线少,控制方式简单,器件封装紧凑,通信速率较高(100kb/s,400kb/s,高速模式可达3.4Mb/s)等优点。IIC总线的操作时序
IIC总线只有两条信号线,一条是数据线SDA,另一条是时钟线SCL,所有的操作均通过这两条信号线完成。数据线SDA上的数据必须在时钟的高电平周期保持稳定,它的高/低电平状态只有在SCL时钟信号线是低电平时才能改变。1)启动和停止条件
总线上的所有器件都不使用总线时,SCL线和SDA线各自的上拉电阻把电平拉高,使它们均处于高电平。主控制器启动总线操作的条件是当SCL线保持高电平时SDA线有高电平转为低电平,此时主控制器在SCL产生时钟信号,SDA线开始传输数据。若SCL线为高电平时SDA由低转为高,则总线工作停止,恢复空闲状态 2)数据传送格式 3)应答(ACK)信号传送 4)读/写操作 5)总线仲裁 6)异常中断条件(3)串行外设接口SPI
(4)串行异步通信接口UART(5)高清多媒体接口HDMI
(6)常用简单输入设备(键盘、触摸屏、传感器)(7)常用简单输出设备(LED、数码管、LCD、)
(8)基于UART的RS—232/RS—485 CAN总线接口
以太网通信接口常用无线通信接口(GPS模块、GPRS模块、WiFi模块、蓝牙模块、射频无线收发模块)43.存储管理单元(MMU)memory management unit MMU在CPU和物理内存之间进行地址转换,将地址从逻辑空间映射到物理空间,这个过程称为内存映射。
MMU主要完成下面的工作:
A.虚拟存储空间到物理空间的映射。
B.存储器访问权限的控制。
C.设置虚拟存储空间的缓冲特性。
嵌入式系统中常常采用页式存储管理。为了管理这些页引入了页表的概念。
页表是位于内存中的表,它的每一行对应虚拟存储空间的一个页,该行包含了该虚拟内存页对应的物理内存页的地址、该页的访问权限和该页的缓冲特性等。
从虚拟地址到物理地址的变换过程就是查询页表的过程。
由于页表存储在内存中的,整个查询过程需要付出很大的代价。根据程序局部性的特点,增加了一个小容量、高速度的存储部件来存放当前访问需要的地址变换条目,这个存储部件称为:地址转换后备缓冲器(TLB)。
当CPU访问内存时,首先在TLB中查找需要的地址变换条目,如果该条目不存在,CPU再从内存中的页表中查询,并把相应的结果添加到TLB中,更新它的内容。
嵌入式系统中虚拟存储空间到物理空间的映射以内存块为单位进行。即虚拟存储空间中一块连续的存储空间被映射到物理存储空间中同样大小的一块连续存储空间。
在页表和TLB中,每一个地址变换条目实际上记录了一个虚拟存储空间的内存块的基地址与物理存储空间相对应的一个内存块的基地址之间的对应关系。
在MMU中实现虚拟地址到物理地址的映射是通过两级页表来实现的。
禁止MMU时,所有物理地址和虚拟地址相等,即使用平板存储模式。内存保护
操作系统通常利用MMU来实现操作系统内核与应用程序之间的隔离,以及应用程序与应用程序之间的隔离。
内存保护包含两个方面的内容:
A.防止地址越界,每个应用程序都有自己独立的地址空间。
B.防止越权操作,每个应用程序都有自己的访问权限。44.实模式与保护模式
在嵌入式系统中,常见的存储管理方案可以分为两大类:实模式和保护模式。
实模式:内存的平面使用模式。特点有:
A.不划分“系统空间”与“用户空间”,无须进行地址映射。
B.操作系统与应用程序之间不再有物理的边界。
C.系统中的“任务”或“进程”,实际上全是内核线程。
在实模式下,内存布局可以分为5个段:
A.代码段:包含操作系统和应用程序的所有代码。
B.数据段:所有带有初始值的全局变量。
C.BSS段:所有未带初始值的全局变量。
D.堆空间:动态分配的内存空间。
E.栈空间:保存上下文以及函数调用时的局部变量和形参。
在实模式存储管理方案下,主要的工作在于堆空间的管理,即如何来管理空闲的堆空间、如何来分配内存、如何来回收内存等等。
保护模式:处理器中必须有MMU硬件并启用。特点有:
A.系统内核和用户程序都有各自独立的地址空间。
B.每个应用程序只能访问自己的地址空间,不能去破坏操作系统和其他应用程序的代码和数据。45.分区存储管理
为了实现多道程序系统而采用的内存管理。
基本思路:把整个内存划分为两大区域,即系统区和用户区,然后再把用户区划分为若干个分区,每个任务占有其中的一个分区。这样,在内存当中就同时保留多个任务,让他们共享整个用户区,从而实现多个任务的并发运行。
分区存储管理又可以分为两类:固定分区和可变分区。
固定分区:各个用户分区的个数、位置和大小一旦确定后,就固定不变,不能再修改。
优点:易于实现,系统开销较小。
缺点:内存利用率不高,分区总数固定。
可变分区:动态创建,在装入一个程序时,系统将根据它的需求和内存空间的使用情况来决定是否分配。
优点:动态变化,非常灵活。
缺点:可能存在外碎片。
在实现可变存储管理技术的时候,需要考虑三个方面的问题:
A.内存管理的数据结构
B.内存的分配算法
C.内存的回收算法 46.地址映射
地址映射也叫地址重定位。
逻辑地址和物理地址是完全不同的,不能用逻辑地址来直接访问内存单元。
为了保证CPU在执行指令的时候,可以正确地访问内存单元,需要将用户程序中的逻辑地址转换为运行时由机器直接寻址的物理地址。这个过程称为:地址映射。
地址映射由存储管理单元MMU来完成。
地址映射主要有两种方式:静态地址映射和动态地址映射。
静态地址映射:当用户程序被装入内存时,直接对指令代码进行修改,一次性地实现逻辑地址到物理地址的转换。
动态地址映射:当用户程序被装入内存时,不对指令代码做任何修改,而是在程序的运行过程中,当它需要访问内存单元的时候,再来进行地址转换。
在具体实现时,这项转换工作一般是由硬件的地址映射机制来完成的。通常设置一个基地址寄存器,或者叫重定位寄存器。当一个任务被调度运行时,就把它所在分区的起始地址装入到整个寄存器中。然后,在程序运行的过程中,当需要访问某个内存单元时,硬件就会自动地将其中的逻辑地址加上基地址寄存器中的内容,从而得到实际的物理地址,并且按照这个物理地址区执行。
这个基地址寄存器位于MMU的内部,整个地址映射过程是自动运行的。从理论上说,每访问一次内存都要进行一次地址映射。47.页式存储管理(重点)
基本思路:把物理内存划分为许多固定大小的内存块,称为物理页面;把逻辑地址空间也划分为大小相同的块,称为逻辑页面。当一个用户程序被装入内存时,不是以整个程序为单位,把它存放在一整块连续的区域,而是以页面为单位来进行分配的。对于一个大小为N的页面程序,需要有N个空闲的物理页面来把它装载。这些物理页面不一定是要连续的。
在页式存储管理中需要解决三个问题:数据结构、内存分配与回收、地址映射。
数据结构有两个:页表和物理页面表。
A.页表:给出了任务逻辑页面号和内存中物理页面号之间的对应关系。
B.物理页面表:描述内存空间中,各个物理页面的使用情况。
具体的例子请参考《教程》317页(博客中画不了图,有兴趣自己看)。
内存的分配过程:
A.对于一个新来的任务,计算它所需要的页面数N,然后查看位示图,看是否还有N个空闲的物理页面。
B.如果有足够的空闲物理页面,就去申请一个页表,其长度为N,并把页表的起始地址填入到该任务的控制块中。
C.分配N个空闲的物理页面,把他们的变换填到页表中,建立逻辑页面与物理页面直接的对应关系。
D.修改位示图,对刚刚被占用的那些物理页面进行标记。
地址映射的基本思路:
A.逻辑地址分析:对逻辑地址,找到它所在的逻辑页面,以及它在页面内的偏移地址。
B.页表查找:根据逻辑页面号,从页表中找出它对应的物理页面号。
C.物理地址合成:根据物理页面号和页内偏移地址,最终确定物理地址。
逻辑地址分析:
页面的大小都是2的整数次幂。对于给定的一个逻辑地址,可以直接把它的高位部分作为逻辑页面号,把它的低位部分作为页内偏移地址。例如,假设页面的大小是4KB,即2的12次幂,逻辑地址为32为,那么在一个逻辑地址当中,最低12位为页内偏移地址,而剩下的20位就是逻辑页面号。
计算方法:
逻辑页面号=逻辑地址/页面大小
页内偏移量=逻辑地址%页面大小
页表查找:
页表作为操作系统的一个数据结构,通常保存在内核的地址空间中。
页表基地址寄存器用来指向页表的起始地址;页表长度寄存器用来指示页表的大小,即对于当前任务,它总共包含有多少个页面。
物理地址合成:
假设物理页面号为f,页内偏移地址为offset,每个页面大小为2n,那么相应的物理地址为:f×2n+offset。48.虚拟存储管理
程序局部性原理:时间局限性和空间局限性。
虚拟页式存储管理:在页式管理的基础上,增加了请求调页和页面置换的功能。
基本思路:当一个用户程序需要调入内存去运行时,不是将这个程序的所有页面都装入内存,而是只装载部分的页面,就可以启动这个程序运行。在运行过程中,如果发现要执行的指令或者访问的数据不在内存当中,就向系统发出缺页中断请求,然后系统在处理这个中断请求时,就会将保存在外存中的相应页面调入内存,从而使该程序能继续运行。
在虚拟页式存储管理中,页表包含:逻辑页面号、物理页面号、驻留位、保护位、修改位和访问位。
常用的页面置换算法:
A.最优页面置换算法:理想化算法。
B.最近最久未使用算法:链表法和栈方法。寻找长时间没有被访问的页面。
C.最不常用算法:每个页面设置一个访问计数器。
D.先进先出算法:性能比较差。
E.时钟页面置换算法:把页面组成环形链表,类似时钟面。
一般来说,当一个任务刚刚启动的时候,它会不断去访问一些新的页面,然后逐步建立一个比较稳定的工作集。工作集是指当前任务正在使用的逻辑页面的集合。如果分配给一个任务的物理页面数太少,不能包含整个的工作集,任务将会造成很多缺页中断,需要频繁地进行页面置换,这种现象称为“抖动”。49.嵌入式系统软件 .嵌入式系统的软件组成与实时操作系统(嵌入式系统软件组成,嵌入式操作系统的发展,实时系统与实时操作系统,微内核与宏内核,嵌入式操作系统的仿真平台等).板级支持软件包(BSP)和引导加载程序Bootloader(硬件抽象层HAL,BSP 的功能和移植,Bootloader 的执行过程,U-boot 及其移植等).嵌入式Linux 操作系统(嵌入式Linux 的发展和自由软件,嵌入式Linux 内核的结构、系统调用接口,常见嵌入式Linux 等).嵌入式操作系统μC/OS-II(基本特点、代码结构、任务管理与调度、任务通信、中断处理、移植等)50.嵌入式系统的开发
1.嵌入式系统的开发过程和工具(开发步骤,交叉开发平台和工具,系统的调试工具等)
2.系统开发工具软件(ADS、RVDS的特点与使用,GCC的常用命令与参数)
3.以S3C2410/S3C2440为背景的应用系统开发(硬件接口及部件的综合使用;无操作系统环境下的系统开发;μC/OS-II环境下的系统开发)51.嵌入式系统的定义
(1)定义:以应用为中心,以计算机技术为基础,软硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。
(2)嵌入式系统发展的4 个阶段:无操作系统阶段、简单操作系统阶段、实时操作系统阶段、面向Internet 阶段。
(3)知识产权核(IP 核):具有知识产权的、功能具体、接口规范、可在多个集成电路设计中重复使用的功能模块,是实现系统芯片(SOC)的基本构件。
(4)IP 核模块有行为、结构和物理3 级不同程度的设计,对应描述功能行为的不同可以分为三类:软核、固核、硬核。
52.嵌入式系统的组成:硬件层、中间层、系统软件层和应用软件层
(1)硬件层:嵌入式微处理器、存储器、通用设备接口和I/O 接口。
嵌入式核心模块=微处理器+电源电路+时钟电路+存储器
Cache:位于主存和嵌入式微处理器内核之间,存放的是最近一段时间微处理器使用最多的程序代码和数据。它的主要目标是减小存储器给微处理器内核造成的存储器访问瓶颈,使处理速度更快。
(2)中间层(也称为硬件抽象层HAL 或者板级支持包BSP):它将系统上层软件和底层硬件分离开来,使系统上层软件开发人员无需关系底层硬件的具体情况,根据BSP 层提供的接口开发即可。
BSP 有两个特点:硬件相关性和操作系统相关性。
设计一个完整的BSP 需要完成两部分工作:
A、嵌入式系统的硬件初始化和BSP 功能。
片级初始化:纯硬件的初始化过程,把嵌入式微处理器从上电的默认状态逐步设置成系统所要求的工作状态。
板级初始化:包含软硬件两部分在内的初始化过程,为随后的系统初始化和应用程序建立硬件和软件的运行环境。
系统级初始化:以软件为主的初始化过程,进行操作系统的初始化。
B、设计硬件相关的设备驱动。
(3)系统软件层:由RTOS、文件系统、GUI、网络系统及通用组件模块组成。
RTOS 是嵌入式应用软件的基础和开发平台。
(4)应用软件:由基于实时系统开发的应用程序组成。53.实时系统
(1)定义:能在指定或确定的时间内完成系统功能和对外部或内部、同步或异步时间做出响应的系统。
(2)区别:通用系统一般追求的是系统的平均响应时间和用户的使用方便;而实时系统主要考虑的是在最坏情况下的系统行为。
(3)特点:时间约束性、可预测性、可靠性、与外部环境的交互性。
(4)硬实时(强实时):指应用的时间需求应能够得到完全满足,否则就造成重大安全事故,甚至造成重大的生命财产损失和生态破坏,如:航天、军事。
(5)软实时(弱实时):指某些应用虽然提出了时间的要求,但实时任务偶尔违反这种需求对系统运行及环境不会造成严重影响,如:监控系统、实时信息采集系统。
第五篇:学习嵌入式Linux系统的笔记和体会
学习嵌入式Linux系统的笔记和体会
一个典型的桌面Linux系统包括3个主要的软件层---linux内核、C库和应用程序代码。
内核是唯一可以完全控制硬件的层,内核驱动程序代表应用程序与硬件之间进行会话。内核之上是C库,负责把POSIX API转换为内核可以识别的形式,然后调用内核,从应用程序向内核传递参数。应用程序依靠驱动内核来完成特定的任务。
在设计嵌入式应用的时候,可以不按照这种层次,应用程序越过C库直接和内核会话,或者把应用和内核捆绑在一起,甚至可以把应用写为内核的一个线程,在内核中运行,虽然这样在移植上带来了困难,但考虑嵌入式系统对尺寸要求小的特点,是完全可行的。不过我们使用三层软件结构的模式来学习嵌入式linux将会是我们认识更清晰,简单可行并使应用具有弹性。
快速入门
最简单的建立嵌入式Linux应用的方法就是从我们使用的桌面Linux入手,安装一个喜爱的版本,把我们的某个应用作为初始化的一部分,框架就算完成了。
当然,嵌入式linux应用远比我们的桌面版本功能简单专一,它也许就是一个用于足彩的终端机,或是一个数码音频播放器,这些系统除了使用嵌入式CPU外,仅仅再需要一个串口,网口等少量的输入输出接口就可以完成它们特定的应用了。
在软件上,它可以按照三层的概念由内核装载器,定制的内核和较少的为特定任务设计的静态连接的应用程序组成。之所以使用静态连接的应用程序,是因为少量的静态连接程序所要的存储空间,比同样数量的动态连接的程序所占的空间小,这个平衡点需要我们在实际开发中去获取。也许你正在设计的是个PDA,它的应用程序较多,那么你很可能就要使用动态连接程序来减少存储空间。在你的/bin或者/sbin目录下,用厂列表看看bash,ifconfig,vi...,也许只用几十K,当你运行 ldd /bin/bash 时,你会看到它们都和好几个库文件相连。好了,这样看来,我们得把PC想像成一个嵌入式硬件平台,再重新制作一个特定功能的嵌入式linux。
基础知识
再进行实际操作之前,先来搞清楚几个基础知识。
内核装载器Loader,它的作用是把内核从外部存储器,移动到内存中。它只作这个事情,一旦完成了调入内核的工作,Loader就跳转到内核位置开始执行。不同架构有不同的 Loader,在x86结构的PC上,通常使用的loader有LILO,GRUB,syslinux,syslinux在嵌入式linux中也同样工作。其他非x86架构的应用中,你必须使用专门的loader,或者自己编写loader来装入内核。也有不使用loader的情况,系统加电以后,内核直接从烧录有映象的Flash上开始执行。
内核,一旦内核开始执行,它将通过驱动程序初始化所有硬件,这可以从我们的pc机监视器的输出看出来,每个驱动程序都打印一些有关它的信息。初始化完成后,计算机就准备运行嵌入式应用。也许一个,也许是多个应用程序组成了嵌入式应用,但通常首先调用的是init(通过loader 向核心传入init=/program 可以定制首先运行的程序)。桌面linux中,init会读取/etc/inittab文件,来决定执行级别和哪些脚本和命令。嵌入式应用中,可以根据实际的情况决定是否使用标准的init执行方式,也许这个init是个静态程序,它能够完成我们的嵌入应用的特定任务,那完全不用考虑inittab了。
initrd文件系统,initrd以一种把内核从存储介质装入到内存的相同的机制来装入一个小型文件系统。这个文件系统最好是以压缩的方式存储在介质上的,解压缩到RAM盘上。通过使用initrd,包含有核心驱动和启动脚本的小文件系统,就可以直接从介质上和内核一起启动起来,内核届压缩这个文件系统,并执行这个文件系统上叫做/linuxrc的脚本文件,这个脚本通常会把启动过程中所需要的驱动程序装入。脚本退出以后,initrd文件系统也卸下了,启动过程进入真正初始化过程。对于嵌入式来讲,可以将需要的应用软件都运行在这个initrd文件系统上,只要/linxrc文件不结束,内核启动过程的其他部分就不会继续。
做个试验:
cp /boot/initrd-2.4.20.img /tmp
cd /tmp
mv initrd-2.4.2-.img initrd.img.gz
gunzip initrd.img.gz
mount-o loop initrd.img /mnt
cd /mnt
ls
cat linuxrc 可以看到里面执行了加载了两个模块的操作,你在启动linxu的时候会看见屏幕打印信息。
入门试验,制作一个简单的应用
我们使用一张软盘启动一台假象的只有一个串口,键盘输入,显示输出的x86架构的linux系统,执行的特定应用就是运行minicom,通过串口拨号。需要软件: minicom-xx.src.tar.gz 和 syslinux-xx.tar.gz,xx代表版本号,开始之前,在主目录建立一个目录,来释放这两个软件包:
cd
mkdir-p project/minilinux
cd project/minilinux
tar zxvf minicom-xx.src.tar.gz
tar zxvf syslinux-xx.tar.gz1、裁减linux内核(需要系统安装内核文件包)
配置内核的时候,我们需要选择这些:摸块编入内核,386处理器、物理内存off、支持ELF、标准PC软盘、支持RAM盘(4096)、支持 initial RAM disk(initrd)、虚你终端、虚拟终端控制台、标准串口、ext2文件系统、控制台驱动,VGA text console、DOS FAT、MSDOS文件系统,其他的都可以不要,这样内核编出来较小。
步骤:
cd /usr/src/linux
make mrproper
make xconfig
make dep && make bzImage
得到 /usr/src/linux/arch/i386/boot/目录的内核文件bzIamge。
2、编译一个静态的minicom,把它作为将来的linuxrc
cd minicom-xx/src
vi Makefile
修改下面这行
minicom: $(minicom_OBJECTS)$(minicom_DEPENDENCIES)
rm-f minicom 下面的行加上-static,连接为静态程序
(LINK)-static $(minicom_LDFLAGS)$(minicom_OBJECTS)$(minicom_LDADD)$(LIBS)
vi minicom.c
找到 if(real_uid==0 && dosetup==0)删除这个判断条件语句,主要是用于权限判断的,因为这个嵌入应用不关注权限问题,否则会出错。
make
得到可执行程序,用ldd 检查一下是不是静态程序。
3、准备initrd压缩文件image.gz
dd if=/dev/zero of=image bs=1k count=4096
losetup /dev/loop0 image
mke2fs-m 0 /dev/loop0
mounmt-t ext2 /dev/loop0 /mnt/
mkdir-p /mnt/dev
mkdir-p /mnt/usr/share/terminfo/l/
cd /dev
cp-a consle null tty tty0 zero mem /mnt/dev
cp-P /usr/share/terminfo/l/linux /mnt/usr/share/terminfo/l/linux
cp ~/project/minilinux/mincom/src/minicom /mnt/linuxrc
umount /mnt
losetup-d /dev/loop0
sync
gzip-9 image4、制作软盘引导,并拷贝文件 bzimage image.gz 到软盘
A.使用grub
fdformat /dev/fd0
mke2fs /dev/fd0
mount /mnt/fd0 /mnt/floppy
mkdir-p /mnt/floppy/boot/grub
cp /boot/grub/stage1 /boot/grub/stage2 /mnt/floppy/boot/grub
执行 grub,在软盘上创建引导
grub > root(fd0)
grub > setup(fd0)
grub > quit
cp /usr/src/linux/arch/i386/boot/bzImge /mnt/floppy
cp ~/porject/minilinux/image.gz /mnt/floppy
编辑 /mnt/floppy/boot/grub/grub.conf
default =0
timeout-=10
title minilinux
root(fd0)
kernel /bzImage
initrd /image.gz
卸下软盘
umount /mnt/floppy
B.使用syslinux
fdformat /dev/fd0
mkfs.msdos /dev/fd0
mount-t msdos /dev/fd0 /mnt/floppy
cp /usr/src/linux/arch/i386/boot/bzImge /mnt/floppy
cp ~/porject/minilinux/image.gz /mnt/floppy
cp syslinux-xx/ldlinxu.sys /mnt/floppy
cat > /mnt/floppy/syslinux.cfg
LABEL linux
KERNEL bzimage
APPEND initrd=image.gz
umont /mnt/floppy
syslinux-xx/syslinux /dev/fd0
sync5、用软盘启动计算机,如果幸运,minicom的运行画面出现在屏幕上。
到此,我们的单应用嵌入式linux做好了,但它还很简陋,没有什么实际用途,但通过这个实验,可以了解嵌入式系统的大致结构和开发过程。在进行实际的嵌入式开发时,通常要在PC机上借助嵌入式linux开发工具包,如:uclinux,bluecat等,对相应的硬件平台(目标机)进行软件编写编译,调试成功后,将内核及应用程序写入到目标机的存储器中,从而完成整个应用。