2011年计算机软件水平考试嵌入式系统设计师辅导笔记

更新时间:2024-03-21 08:21:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

2011年计算机软件水平考试嵌入式系统设计师辅导笔记

(一)

1、嵌入式系统的定义

(1)定义:以应用为中心,以计算机技术为基础,软硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。 (2)嵌入式系统发展的4 个阶段:无操作系统阶段、简单操作系统阶段、实时操作系统阶段、面向Internet 阶段。

(3)知识产权核(IP 核):具有知识产权的、功能具体、接口规范、可在多个集成电路设计中重复使用的功能模块,是实现系统芯片(SOC)的基本构件。

(4)IP 核模块有行为、结构和物理3 级不同程度的设计,对应描述功能行为的不同可以分为三类:软核、固核、硬核。

2、嵌入式系统的组成:硬件层、中间层、系统软件层和应用软件层 (1)硬件层:嵌入式微处理器、存储器、通用设备接口和I/O 接口。 嵌入式核心模块=微处理器+电源电路+时钟电路+存储器

Cache:位于主存和嵌入式微处理器内核之间,存放的是最近一段时间微处理器使用最多的程序代码和数据。它的主要目标是减小存储器给微处理器内核造成的存储器访问瓶颈,使处理速度更快。

(2)中间层(也称为硬件抽象层HAL 或者板级支持包BSP):它将系统上层软件和底层硬件分离开来,使系统上层软件开发人员无需关系底层硬件的具体情况,根据BSP 层提供的接口开发即可。

BSP 有两个特点:硬件相关性和操作系统相关性。 设计一个完整的BSP 需要完成两部分工作: A、嵌入式系统的硬件初始化和BSP 功能。 片级初始化:纯硬件的初始化过程,把嵌入式微处理器从上电的默认状态逐步设置成系统所要求的工作状态。 板级初始化:包含软硬件两部分在内的初始化过程,为随后的系统初始化和应用程序建立硬件和软件的运行环境。

系统级初始化:以软件为主的初始化过程,进行操作系统的初始化。 B、设计硬件相关的设备驱动。

(3)系统软件层:由RTOS、文件系统、GUI、网络系统及通用组件模块组成。 RTOS 是嵌入式应用软件的基础和开发平台。

(4)应用软件:由基于实时系统开发的应用程序组成。 3、实时系统

(1)定义:能在指定或确定的时间内完成系统功能和对外部或内部、同步或异步时间做出响应的系统。 (2)区别:通用系统一般追求的是系统的平均响应时间和用户的使用方便;而实时系统主要考虑的是在最坏情况下的系统行为。

(3)特点:时间约束性、可预测性、可靠性、与外部环境的交互性。

(4)硬实时(强实时):指应用的时间需求应能够得到完全满足,否则就造成重大安全事故,甚至造成重大的生命财产损失和生态破坏,如:航天、军事。

(5)软实时(弱实时):指某些应用虽然提出了时间的要求,但实时任务偶尔违反这种需求对系统运行及环境不会造成严重影响,如:监控系统、实时信息采集系统。 (6)任务的约束包括:时间约束、资源约束、执行顺序约束和性能约束。

- 1 -

4、实时系统的调度

(1)调度:给定一组实时任务和系统资源,确定每个任务何时何地执行的整个过程。

(2)抢占式调度:通常是优先级驱动的调度,如uCOS。优点是实时性好、反应快,调度算法相对简单,可以保证高优先级任务的时间约束;缺点是上下文切换多。

(3)非抢占式调度:通常是按时间片分配的调度,不允许任务在执行期间被中断,任务一旦占用处理器就必须执行完毕或自愿放弃,如WinCE。优点是上下文切换少;缺点是处理器有效资源利用率低,可调度性不好。

(4)静态表驱动策略:系统在运行前根据各任务的时间约束及关联关系,采用某种搜索策略生成一张运行时刻表,指明各任务的起始运行时刻及运行时间。 (5)优先级驱动策略:按照任务优先级的高低确定任务的执行顺序。 (6)实时任务分类:周期任务、偶发任务、非周期任务。

(7)实时系统的通用结构模型:数据采集任务实现传感器数据的采集,数据处理任务处理采集的数据、并将加工后的数据送到执行机构管理任务控制机构执行。 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 位微处理器的虚拟地址空间位232,即4GB。

D、小端字节顺序:低字节在内存低地址处,高字节在内存高地址处。 E、大端字节顺序:高字节在内存低地址处,低字节在内存高地址处。 F、网络设备的存储顺序问题取决于OSI 模型底层中的数据链路层。 6、逻辑电路基础

(1)根据电路是否具有存储功能,将逻辑电路划分为:组合逻辑电路和时序逻辑电路。 (2)组合逻辑电路:电路在任一时刻的输出,仅取决于该时刻的输入信号,而与输入信号作用前电路的状态无关。常用的逻辑电路有译码器和多路选择器等。

(3)时序逻辑电路:电路任一时刻的输出不仅与该时刻的输入有关,而且还与该时刻电路的

- 2 -

状态有关。因此,时序电路中必须包含记忆元件。触发器是构成时序逻辑电路的基础。常用的时序逻辑电路有寄存器和计数器等。

(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、可编程逻辑器件基础(具体参见教程51 到61 页) 10、嵌入式系统中信息表示与运算基础

(1)进位计数制与转换:这样比较简单,也应该掌握怎么样进行换算,有出题的可能。

- 3 -

(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 位两种。 声道数:单声道和立体声双道。立体声需要两倍的存储空间。 11、差错控制编码

(1)根据码组的功能,可以分为检错码和纠错码两类。检错码是指能自动发现差错的码,例如奇偶检验码;纠错码是指不仅能发现差错而且能自动纠正差错的码,例如循环冗余校验码。 (2)奇偶检验码、海明码、循环冗余校验码(CRC)。(教程70 到77 页) 12、嵌入式系统的度量项目

(1)性能指标:分为部件性能指标和综合性能指标,主要包括:吞吐率、实时性和各种利用率。

(2)可靠性与安全性

可靠性是嵌入式系统最重要、最突出的基本要求,是一个嵌入式系统能正常工作的保证,一般用平均故障间隔时间MTBF 来度量。

(3)可维护性:一般用平均修复时间MTTR 表示。 (4)可用性 (5)功耗

(6)环境适应性 (7)通用性 (8)安全性 (9)保密性 (10)可扩展性

性价比中的价格,除了直接购买嵌入式系统的价格外,还应包含安装费用、若干年的运行维修费用和软件租用费。

13、嵌入式系统的评价方法:测量法和模型法

(1)测量法是最直接最基本的方法,需要解决两个问题: A、根据研究的目的,确定要测量的系统参数。 B、选择测量的工具和方式。

(2)测量的方式有两种:采样方式和事件跟踪方式。 (3)模型法分为分析模型法和模拟模型法。分析模型法是用一些数学方程去刻画系统的模型,而模拟模型法是用模拟程序的运行去动态表达嵌入式系统的状态,而进行系统统计分析,得出性能指标。

- 4 -

(4)分析模型法中使用最多的是排队模型,它包括三个部分:输入流、排队规则和服务机构。 (5)使用模型对系统进行评价需要解决3 个问题:设计模型、解模型、校准和证实模型。

(二)

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位微处理器的结构和特点

该部分参考《教程》86~94页,以8051为重点,彻底搞清楚8位单片机的工作原理,外设控制、存储分布、寻址方式以及典型应用。2007年11月下午的第一道题目就考查了8051的定时器使用、外部时钟连接、实际应用的流程设计以及典型的寻址方式。这些考点几乎可以在《教程》上找到,例如外部时钟连接那个问题的答案就是《教程》89页上面的原图。 4.典型16位微处理器的结构和特点

该部分参考《教程》94~97页。典型的微处理器可以参考MSP430,找一本这方面的书看看关于MSP430的结构原理以及典型应用。 5.典型32位微处理器的结构和特点

该部分参考《教程》97~112页。32位处理器采用32位的地址和数据总线,其地址空间达到了232=4GB。

目前主流的32位嵌入式处理器系统主要有ARM 系列、MIPS 系列、PoewrPC 系列等。ARM 微处理器体系结构目前被公认为是嵌入式应用领域领先的32位嵌入式RISC 处理器结构。按照目前的发展形式,ARM 几乎成了嵌入式应用的代名词。按照我个人的意见,作为嵌入式系统设计师考试,逐渐增加考查ARM 体系结构与编程方面的题目是大势所趋。2006年没有一道关于ARM 的题目,2007年出了少量题目,可能在2008年会继续增加。在下午题方面,2006年考查了X86方面的应用、2007年考查了8051方面的应用,这个可能是一个过度过程,以目前ARM 在嵌入式领域的广泛应用和普及程度,下午题目考查ARM 应用方面或者32位其他的微处理器方面的应用题目可能在不就将来的考试中就会出现。 6、单片机系统的基本概念

(1)单片机组成:中央处理器、存储器、I/O 设备。 (2)存储器:物理实质是一组或多组具备数据输入/输出和数据存储功能的集成电路,用于充当设备缓存或保存固定的程序及数据。

- 5 -

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、复位发生时的动作:

- 6 -

a、PC 指针从起始位置开始执行(大多数单片机都时从0x0000处开始执行)。 b、I/O 端口设置成缺省状态(高阻态、或者输出低电平)。 c、部分专用控制寄存器SFR 恢复到缺省状态。 d、普通RAM 不变(如果时上电复位,则是随即数)。 B、两种不同的复位启动方式:

a、冷启动:也叫上电复位,指在断电状态下给系统加电,让系统开始正常运行。 b、热启动:在不断电的状态下,给单片机复位引进一个复位信号,让系统重新开始。 C、两种类型的复位电路:高电平复位和低电平复位。 D 注意事项:

a、注意复位信号的电平状态及持续时间必须满足系统要求。 b、注意避免复位信号抖动。

(9)时钟电路:单片机是一种时序电路,必须提供脉冲电路才能正常工作。时钟电路相当于单片机的心脏,它的每一次跳动(振动节拍)都控制着单片机的工作节奏。振荡得慢时,系统工作速度就慢,振荡得快时,系统工作速度就快(功耗也增大)。 A、振荡周期:振荡源的振荡节拍。

B、机器周期:单片机完成一个基本操作需要的振荡周期(节拍)。

C、指令周期:执行一条指令需要几个机器周期。不同的指令需要的机器周期数不同。 7、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种特权模式又称为异常模式。

处理器模式可以通过软件控制进行切换,也可以通过外部中断或异常处理过程进行切换。大多数的用户程序运行在用户模式下,这时,应用程序不能访问一些受操作系统保护的系统资源,应用程序也不能直接进行处理器模式切换。当需要进行处理器模式切换时,应用程序可以产生异常处理,在异常处理中进行处理器模式的切换。这种体系结构可以使操作系统控制整个系统的资源。

当应用程序发生异常中断时,处理器进入相应的异常模式。在每一种异常模式种都有一组寄存器,供相应的异常处理程序使用,这样就可以保证进入异常模式时,用户模式下的寄存器不被破坏。系统模式并不是通过异常过程进入的,它和用户模式具有完全一样的寄存器,但

- 7 -

是系统模式属于特权模式,可以访问所有的系统资源,也可以直接进行处理器模式切换,它主要供操作系统任务使用。

(5)ARM处理器共有37个寄存器:31个通用寄存器和6个状态寄存器 A、通用寄存器包括R0~R15,可以分为3类:

a、未备份寄存器R0~R7:在所有的处理器模式下,未备份寄存器都是指向同一个物理寄存器。

b、备份寄存器R8~R14:

对于R8~R12来说,每个寄存器对于2个不同的物理寄存器,它们每次所访问的物理寄存器都与当前的处理器运行模式有关。

对于R13、R14来说,每个寄存器对于6个不同的物理寄存器,其中一个是用户模式和系统模式共用。

R13在ARM 指令种常用作堆栈指针。由于处理器的每种运行模式都有自己独立的物理寄存器R13,所有在用户应用程序的初始化部分,一般要初始化每种模式下的R13,使其指向该运行模式的栈空间。

R14又称为连接寄存器(LR),在ARM 体系种具有下面两种特殊作用:在通过BL 或BLX 指令调用子程序时,存放当前子程序的返回地址;在异常中断发生时,存放异常模式将要返回的地址。

c、程序计数器R15(PC)。

由于ARM 采用了流水线机制,在三级流水线中,当正确读取了PC 的值时,该值为当前指令地址值加8个字节。也就是说,PC 指向当前指令的下两条指令的地址。在ARM 指令状态下,PC 的0和1位是0,在Thumb 指令状态下,PC 的0位是0。 B、程序状态寄存器 a、ARM 体系结构包含1个当前程序状态寄存器(CPSR)和5个备份的程序状态寄存器(SPSR),使用MSR 和MRS 指令来设置和读取这些寄存器。

b、当前程序状态寄存器CPSR:保存当前处理器状态的信息,可以在任何处理器模式下被访问。

c、备份程序状态寄存器SPSR:每一种异常处理器模式下都有一个专用的物理状态寄存器。当特定的异常中断发生时,这个寄存器用于存放当前程序状态寄存器的内容,在异常中断程序退出时,可以用SPSR 中保存的值来恢复CPSR。

d、由于用户模式和系统模式不属于异常模式,它们没有SPSR,当在这两种模式下访问SPSR 时,结果是未知的。 (6)ARM指令的寻址方式

所谓寻址方式就是处理器根据指令中给出的地址信息来寻找物理地址的方式。 A、立即寻址:操作数本身就在指令中给出,只要取出指令也就取到了操作数。 ADD R0, R0, #1 ;R0",R0+1

B、寄存器寻址:利用寄存器中的数值作为操作数。 ADD R0, R1, R2 ;R0",R1+R2

C、寄存器间接寻址:以寄存器中的值作为操作数地址,而操作数本身存放在存储器中。 ADD R0, R1, [R2] ;R0",R1+[R2] LDR R0, [R1] ;R0",[R1] STR R0, [R1] ;[R1]",R0

D、基址变址寻址:将寄存器(该寄存器一般称作基址寄存器)的内容与指令中给出的地址偏移量相加,从而得到一个操作数的有效地址。 LDR R0, [R1, #4] ;R0",[R1+4]

- 8 -

LDR R0, [R1, #4]! ;R0",[R1+4] R1",R1+4 LDR R0, [R1], #4 ;R0",[R1] R1",R1+4 LDR R0, [R1, R2]! ;R0",[R1+R2]

E、多寄存器寻址:一条指令可以完成多个寄存器值的传送。 LDMIA R0, {R1, R2, R3} ;R1",[R0] R2",[R0+4] R3",[R0+8]

F、相对寻址:以程序计数器PC 的当前值作为基地址,指令中的地址标号作为偏移量,两者相加之后得到操作数的有效地址。 BL NEXT ;跳转到子程序NEXT 处执行 ?? NEXT ??

MOV PC, LR ;从子程序返回

G、堆栈寻址:支持4种类型的堆栈工作方式:

a、满递增堆栈:堆栈指针指向最后压入的数据,且由低地址向高地址生长。 b、满递减堆栈:堆栈指针指向最后压入的数据,且由高地址向低地址生长。

c、空递增堆栈:堆栈指针指向下一个将要放入数据的空位置,且由低地址向高地址生长。 d、空递减堆栈:堆栈指针指向下一个将要放入数据的空位置,且由高地址向低地址生长。 (7)ARM的存储方法

A、大端模式:数据的高字节存储在低地址中,低字节存储在高地址中。 B、小端模式:数据的低字节存储在低地址中,高字节存储在高地址中。 (8)ARM中断与异常

A、ARM 内核支持7种中断,不同的中断处于不同的处理模式,具有不同的优先级,而且每个中断都有固定的中断地址入口。当一个中断发生是,相应的R14(LR)存储中断返回地址,SPSR 存储当前程序状态寄存器CPSR 的值。

B、由于ARM 内核支持流水线工作,LR 寄存器存储的地址可能是发生中断后面指令的地址,所以不同的中断处理完成后,必须将LR 寄存器值经过处理后再写入P15(PC)寄存器。 C、ARM 异常的具体含义:

a、复位:当处理器的复位电平有效时,产生复位异常,程序跳转到异常复位异常处理程序处执行。 b、未定义的指令:当ARM 处理器或协处理器遇到不能处理的指令时,产生未定义指令异常。可以使用该异常机制进行软件仿真。

c、软件中断:该异常由执行SWI 指令产生,可用于用户模式下的程序调用特权操作指令。可使用该异常机制实现操作系统调用功能。

d、指令预取中止:如果处理器预取指令的地址不存在或该地址不允许当前指令访问,存储器向处理器发出中止信号,但当预取的指令被执行时,才会产生指令预取中止异常。

e、数据访问中止:如果处理器数据访问指令的目标地址不存在,或者该地址不允许当前指令访问,处理器产生数据访问中止异常。 f、外部中断请求:当ARM 外部中断请求管脚有效,而且CPSR 中的I 位为0时,产生IRQ 异常。系统的外设可以通过该异常请求中断服务。

g、快速中断请求:当ARM 快速中断请求管脚有效,而且CPSR 的F 位为0时,产生FIQ 异常。

D、ARM 处理器对异常中断的响应过程

a、将下一条指令的地址存入相应的连接寄存器LR 中。 b、将CPSR 复制到相应的SPSR 中。

- 9 -

c、根据异常的类型,强制设置CPSR 的运行模式位。

d、强制PC 从相关的异常向量地址取下一条指令执行,从而跳转到相应的异常处理程序处。 E、ARM 处理器从异常中断处理程序中返回

a、恢复中断的程序的处理器状态,将SPSR 复制到CPSR 中。 b、若在进入异常处理时设置了中断禁止位,要在此清除。 c、将连接寄存器LR 的值减去相应的偏移量后送到PC。

F、复位异常中断处理程序不需要返回。在复位异常中断程序开始整个用户程序的执行。

(三)

1、嵌入式软件基础 (1)嵌入式软件的特点: A、规模较小。 B、开发难度大。

C、实时性和可靠性要求高。 D、要求固化存储。 (2)嵌入式软件分类:

A、系统软件:控制和管理嵌入式系统资源,如嵌入式操作系统、驱动程序、中间件等。 B、应用软件:定义嵌入式设备的主要功能和用途,负载与用户进行交互。 C、支撑软件:辅助软件开发的工具软件。 (3)无操作系统的嵌入式软件的两种实现方式: A、循环轮转

优点:简单、直观、开销小、可预测。

缺点:过于简单,所有代码顺序执行,无法处理异步事件,缺乏并行处理能力。 B、前后台系统(在循环轮转的基础上增加了中断处理功能) 前台(事件处理级):中断服务程序,负载处理异步事件。

后台(任务级):一个无限循环,负载资源分配、任务管理和系统调度。 (4)有操作系统的三大优点: A、提高系统的可靠性。

B、提高了系统的开发效率,降低了开发成本,缩短了开发周期。 C、有利于系统的扩展与移植。

(5)设备驱动层(也叫板级支持包BSP:包含了嵌入式系统中所有与硬件相关的代码) 大多数的嵌入式硬件设备都需要某种类型软件的初始化和管理。这部分工作由设备驱动层来完成的,它负责直接与硬件大交道,对硬件进行管理和控制,为上层软件提供所需的驱动支持,类似PC 系统中的BIOS 和驱动程序。 (6)板级支持包BSP 的基本思想

把嵌入式操作系统与具体的硬件平台隔离开来。在BSP 当中,把所有与硬件相关的代码都封装起来,并向上提供一个虚拟的硬件平台,而操作系统就运行在这个虚拟的硬件平台上。它使用一组定义好的编程接口来与BSP 进行交互,并通过BSP 来访问真正的硬件。 (7)一般来说。BSP 主要包括两个方面的内容: A、引导加载程序BootLoader。 B、设备驱动程序。

(8)关于引导加载程序BoorLoader

引导加载程序是嵌入式系统加电后运行的第一段软件代码,是在操作系统内核运行之前运行的一段小程序,它的实现高度依赖于具体的硬件平台,主要的基本功能如下:

A、片级初始化:纯硬件初始化过程,把微处理器从上电的默认状态设置成系统要求的工作

- 10 -

状态。

B、板级初始化:同时有软件和硬件在内的初始化过程,设置各种硬件的寄存器和设置某些软件的数据结构和参数。

C、加载内核:将操作系统和应用程序的映象从Flash 存储器复制到系统内存 当中,然后跳转到系统内核的第一条指令处继续执行。 补充:PC 系统的引导加载过程。

PC 系统的引导加载程序由两部分代码组成――BIOS 和MBR 中的引导程序。BIOS 在完成硬件检测和资源配置后,将硬盘主引导记录MBR 中的引导程序读到系统的内存当中,然后将控制权交给它,由它负责把操作系统的内核映象从硬盘读入到内存,然后跳转到内核入口去运行,即启动操作系统。 (9)设备驱动程序

在一个嵌入式系统中,操作系统可能有也可能无,但是设备驱动程序是必不可少的。

设备驱动程序,就是一组库函数,用来对硬件进行初始化和管理,并向上层软件提供良好的访问接口。大多数设备驱动程序都具备下面的基本功能:启动、关闭、停用、启用、读操作、写操作。这些功能一般用函数的形式来实现,这些函数之间的组织结构主要有两种:分层结构和混合结构。 (10)关于分层结构

A、硬件接口:直接操作和控制硬件。

B、调用接口:不直接跟硬件大交道,为上层软件提供服务和函数接口。

C、优点:把所有与硬件相关的细节都封装在硬件接口中,在硬件需要升级,需要更新设备驱动程序的时候,只需要改动硬件接口中的函数即可,而上层调用接口中的函数不用做任何修改。

D、混合结构:在设备驱动程序当中,没有明确的层次关系,上层接口和硬件接口混在一起,相互调用。

(11)嵌入式中间件

它是在操作系统内核、设备驱动程序和应用软件之外的所有系统软件,其基本思路是: 把原本属于应用软件层的一些通用的功能模块抽取出来,形成独立的一层软件,从而为运行在它上面的那些应用软件提供一个灵活、安全。移植性好、相互通信、协同工作的平台。 2、嵌入式操作系统概述 (1)内核

内核是指操作系统中的一个组件,它包含了OS 的主要功能,即OS 的各种特性及其相 互之间的依赖关系,这些功能主要包括:

A、任务管理:对系统中运行的软件进行描述和管理,并完成处理器资源分配和调度。 B、存储管理:提高内存的利用率,方便用户使用,提供足够的存储空间。 C、设备管理:方便设备的使用,提高CPU 和I/O 设备的利用率。 D、文件管理:解决文件资源存储、共享、保密和保护等问题。

注:不同嵌入式操作系统的内核设计各不相同,取决于系统设计和实际需求。 (2)嵌入式操作系统分类:

A、按系统类型:商业系统、专用系统、开源系统。 B、按响应时间:硬实时系统、软实时系统。

C、按软件结构:单体结构(uCOS)、分层结构(MS-DOS)、微内核结构(Vxworks)。 3、任务管理

(1)嵌入式操作系统的任务管理可以分为:

A、单道程序技术:操作系统中,任何时候只能有一个程序在运行。

- 11 -

B、多道程序技术:操作系统中,允许多个程序同时存在并运行。 (2)进程

进程,简单的说,是一个正在运行的程序。

进程与程序既有联系又有区别,主要表现为下面结构方面:

A、程序由数据和代码两部分内容组成,它是一个静态的概念。而进程是正在执行的程序,它也由两部分组成:程序和该程序的运行上下文。它是一个动态的概念。

B、程序和进程之间并不是一一对应的。一个进程在运行的时候可以启动一个或多个程序。反之,同一个程序也可能由多进程同时执行。

C、程序可以作为一种软件资源长期保存,以文件的形式存放在光盘或硬盘上,而进程则是一次执行的过程,它是暂时的,是动态的产生和终止。

一个进程至少应包括三个方面:相应的程序、CPU上下文、一组系统资源。 进程有三个特性:

A、动态性:进程是正在运行的程序,而程序的运行状态是不断变化的。

B、独立性:进程是系统资源的使用单位,每个进行有自己的运行上下文和内部状态。 C、并发性:宏观来看,系统中同时有多个进程存在,它们相互独立地运行。 注:对于并发的理解。

在单CPU 的情况下,所谓的并发性指的是宏观上的并发运行,而微观上还是顺序进行,各个进程轮流去使用CPU 资源。在单核CPU 中,真正的、物理上的PC 寄存器只有一个,进程在轮流执行的时候,物理PC 的取值也在不断变化。而逻辑PC 其实就是一个内存变量。每个进程都有一个逻辑PC,当一个进程要运行的时候,就把它的逻辑PC 装载到物理PC 中去;反之,当一个进程暂不运行的时候,就把物理PC中的值保存在它的逻辑PC 当中。 (3)线程

线程就是进程当中的一条执行流程。

进程其实包含两个部分:资源平台和执行流程(线程)。

在一个进程当中,或者说在一个资源平台上,可以同时存在多个线程;可以用线程作为CPU 的基本调度单位,使得各个线程之间可以并发执行;对于同一个进程当中的各个线程来说,他们可以共享该进程的大部分资源。每个线程都有自己独立的CPU运行上下文和栈,这是不能共享的。 (4)任务

在嵌入式系统中,任务其实就是线程,它是能够独立运行的一个实体。原因有二: A、任务具有独立的优先级和栈空间,CPU 上下文一般存放在栈空间中。

B、任务之间可以很方便地、直接地使用共享的内存单元,而不需要经过系统内核。

在多道程序的嵌入式系统中,同时存在着多个任务,这些任务之间的结构一般为层状结构,存在着父子关系。当嵌入式内核刚刚启动的时候,只有一个任务存在,然后由该任务派生出所有其他任务。

(5)任务的创建与中止(教程P270)

任务的创建主要发生在以下三种情形: A、系统初始化。

B、任务运行的过程中。 C、用户提出请求。

从技术的角度来说,实际上新任务只有一种创建的方法,也就是在一个已经存在的任务中,通过调用相应的系统函数来创建一个新的任务。任务的创建只要有两种可能的实现模型:fork/exec 和spawn。两种模型的差别主要在于内存的分配方式。

A、fork/exec 模型下,首先调用fork 函数为新任务创建一份与父任务完全相同的内存空

- 12 -

间,然后再调用exec 函数装入新任务的代码,并用它来覆盖原有的属于父任务的内容。嵌入式Linux操作系统是基于fork/exec模型的。

B、spawn 模式下,在创建新任务的时候,直接为它分配一个全新的地址空间,然后将新任务的代码装入并运行。uCOS操作系统是基于spawn 模型的。 任务的中止可能有多种原因,主要有下面三种情况: A、正常退出。 B、错误推出。

C、被其他任务踢出。

在有些嵌入式系统中,尤其是一些控制系统中,它的某些任务被设计为“死循环”的模式,一直循环下去,不会中止。 (6)任务的状态

任务有三中基本状态:

A、运行状态:任务占有CPU,并在CPU 上运行。

B、就绪状态:任务已经具备运行的条件,在等待CPU 空闲。

C、阻塞状态:任务因为正在等待某种事件的发生而暂时不能运行。

对于就绪状态和阻塞状态,它们的相同之处在于,任务都是处于暂停状态,没有运行。 不同之处在于,暂停的原因是不一样的,导致就绪状态的原因是外因,是操作系统的CPU正忙,而导致阻塞状态的原因是内因,是任务自身的问题。 任务状态的四种转换关系: A、运行",阻塞:任务由于等待某个时间被阻塞起来。 B、运行",就绪:调度器由于某种原因(例如优先级)选择了另一个任务去运行。 C、就绪",运行:CPU 空闲了,处于就绪状态的任务被调度器选中去运行。 D、阻塞",就绪:任务的等待事件完成,具备了继续运行的条件。 (7)任务控制块TCB

任务控制块TCB,就是在操作系统中,用来描述和管理一个任务的数据结构。系统为每一个任务都维护了一个相应的TCB,用来保存该任务的各种相关信息。它的主要内容包括下面几项:

A、任务的管理信息:任务的标识ID、状态、优先级、调度信息、各种队列指针等。 B、CPU上下文信息:CPU各种寄存器当前的值以及逻辑寄存器。

C、资源管理的信息:段表地址、页表地址、根目录、文件描述字等。

当需要创建一个任务的时候,就为它生成一个TCB,并初始化这个TCB 的内容;当需要中止一个任务的时候,只要回收它的TCB 就可以了。 (7)任务的切换

基本思想:把当前任务的运行上下文保存起来,并恢复新任务的上下文。 任务切换通常有下面的基本步骤:

A、将处理器的运行上下文保存在当前任务的TCB 中。

B、更新当前任务的状态,从运行状态变为就绪状态或阻塞状态。 C、按照一定的策略,从所有处于就绪状态的任务中选择一个去运行。 D、修改新任务的状态,从就绪状态变成运行状态。

E、根据新任务的TCB 的内容,恢复它的运行上下文环境。 在一个多任务的操作系统中,采用任务队列的方式来组织它的所有任务。由操作系统来维护一组队列,用来表示系统当中所有任务的当前状态,不同的状态用不同的队列来标志。 (8)任务的调度

调度器可以看作CPU 的资源管理者。

- 13 -

任务调度的首要问题是:何时进行调度,即调度发生的时机。一般有下面几种情形: A、一个新任务被创建时,需要决定运行新任务还是继续执行父任务。 B、一个任务运行结束时,需要从就绪队列中选择某个任务去运行。 C、一个任务运行阻塞时,需要选择另一个任务去运行。

D、一个I/O 操作完成,任务阻塞结束,立即执行新就绪任务还是继续执行被中断任务。 E、一个时钟节拍结束时,需要对就绪任务重新调度。

任务调度的第二个问题是:如何调度,即调度方式。主要有两种方式: A、不可抢占调度方式:例如时间片轮转。 B、可抢占调度方式:例如优先级调度。 实时操作系统大都采用可抢占调度方式。 任务调度的第三个问题是:调度算法。

A、先来先服务算法:按照任务到达的先后次序进行调度,是不可抢占的调度方式。

B、短作业优先算法:各个任务开始执行之前,事先预计好它的执行时间,从中选择用时较短的任务优先执行。

C、时间片轮转算法:所有的就绪任务按照先来先服务的原则排成一个队列。在每次调度的时候,把处理器分派给队列当中的第一个任务,让它去执行一小段时间。在这个时间段里任务被阻塞或由于其他原因暂停,或者任务的时间片用完了,它会被送到就绪队列的末尾,然后调度器再执行当前队列的第一个任务。这种算法的优点是各个就绪任务都平均地分配使用CPU 的时间,每个就绪任务都能一直保持着活动性。时间片轮转法有一个默认前提,即位于就绪队列中的各个任务是同等重要的。

D、优先级算法:给每个任务都设置一个优先级。然后在任务调度的时候,在所有处于就绪状态的任务中选择优先级最高的那个任务去运行。采用优先级调度算法的一个问题是可能会发生优先级反转(教程P285),出现任务“饥饿”现象。 (9)实时系统调度

对于RTOS 调度器来说,任务之间的公平性并不是最重要的,它追求的是实时性。

A、单调速率调度算法(RMS):任务的优先级与它的周期表现为单调函数的关系,任务的周期越短,优先级越高,任务的周期越长,优先级越低。RMS 假定任务是相同独立的、周期性的、任务在能够在任何位置被抢占,而实际中的系统,任务之间需要进行通信和同步,这是一种理想的调度方法,实际中并不一定存在。 B、最早期限优先法(EDF):根据任务的截止时间来确定其优先级,对于时间限期最近的任务,分配最高的优先级。当有一个新的任务处于就绪状态时,各个任务的优先级就有可能要进行调整,选择截止时间最近的任务去运行。 (10)任务互斥

A、任务之间的关系:相互独立、任务互斥、任务同步、任务通信。

B、任务间的互斥:当前已经有一个任务正在访问临界区共享数据,那么其他任务暂时不能访问。

C、提出互斥访问的四个条件:

a、在任何时候最多只能有一个任务位于它的临界区中。 b、不能事先假定CPU 的个数和系统的运行速度。

c、没有任务位于它的临界区中,它不妨碍其他任务去访问临界区资源。

d、任何一个任务进入临界区的请求必须在有限的时间内得到满足,不能无限期。 D、任务互斥的解决方案: a、关闭中断法 b、繁忙等待法

- 14 -

c、信号量处理 (11)信号量

信号量记录当前可用资源的数量。

信号量由操作系统维护,任务不能直接去修改它的值,只能通过初始化和两个标准原语(PV 原语)来对它进行访问。 注:关于原语。

原语通常由若干条语句组成,用来实现某个特点的操作,并通过一段不可分割或不可中断的程序来实现其功能。原语时操作系统内核的一个组成部分,必须在内核态下执行。原语的不可中断性是通过在其执行过程中关闭中断来实现的。关键要理解PV 原语的实现: P(semaphores S) {

--S.count; //申请一个资源

if(S.count < 0) //没有空闲资源 {

将当前任务阻塞起来,加到阻塞队列末尾,调度新的任务运行。 } }

V(semaphores S) {

++S.count; //释放一个资源

if(S.count <= 0) //有任务被阻塞 {

从阻塞队列中取出一个任务,把该任务改为就绪状态,插入就绪队列。 } }

利用操作系统提供的信号量机制,可以方便、有效地实现对临界资源的互斥访问,优 点有两个:

A、可以设置信号量的计数值,从而允许多个任务同时进入临界区。

B、当一个任务暂时无法进入临界区时,它会被阻塞起来,将CPU 让给其他任务。 (12)任务同步

任务之间的同步可以使用信号量机制,通过引入PV 操作来设定两个任务在运行时的先后顺序。例如,可以把信号量视为某个共享资源的当前个数,然后由一个任务负责生成这种资源,而另一个任务则负责消费这种资源,这样可以构成两个任务之间的先后顺序。在具体实现上,一般把信号量的初始值设为N,N 大于或等于0。然后在一个任务内使用V 原语,把信号量加1,而在另外一个任务内部使用P 原语,将信号量减1,从而实现这两个任务之间的同步关系。 (13)死锁

在一组任务中,每个任务都占用着若干资源,同时又在等待其他任务占用的资源,从而造成所有任务都无法进展下去的现象,这称为死锁现象。 除了资源的竞争之外,PV 操作使用不当也会引起死锁。 编辑推荐: (14)信号

所谓信号,是系统给任务的一个指示,表明某个异步事件已经发生了。 该事件可能来自外部,也可能来自内部。

- 15 -

信号机制也可以称为软中断机制。

信号机制与中断处理机制非常相似,相同点: A、都具有中断性。

B、都有相应的服务程序。 C、都可以屏蔽响应。 不同点:

A、中断由硬件或特定指令产生,而信号由系统调用产生。 B、中断触发后,硬件会根据中断向量找到相应的处理程序执行;而信号则通过发送信号的系统调用来触发,系统不一定马上对它进行处理。 C、中断处理程序在系统内核的上下文中运行,是全局的;而信号处理程序在相关任务的上下文中运行,是任务的一个组成部分。 (15)任务间通信

任务之间的通信可以分为两种类型:

A、低级通信:只能传递状态和整数值等控制信息,例如信号量机制。

B、高级通信:能够传输任意数量的数据,只要有三类:共享内存、消息传递和管道。 任务之间的通信方式有两种:

A、直接通信:通信双方必须明确知道与之通信的对象。例如PV 原语。

B、间接通信:通信双方不需指出消息的来源和去向,通过共享邮箱发送和接收消息。 邮箱只能存放单条消息,它提供一种低开销的消息传递机制,只有空和满两种状态。消息队列与邮箱类似,但是可以同时存放若干条消息,提供了一种任务间缓冲通信的方法。

管道由UNIX 首创,以文件系统为基础,连接两个任务之间的一个打开的共享文件,专用于任务直接的数据通信。 4、存储管理

见《嵌入式系统设计师考试复习笔记之存储管理篇》。 5、设备管理 (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 控制,减少了中断的次数。 (3)I/O软件

- 16 -

A、中断处理程序:当一个用户程序需要某种I/O 服务时,它会去调用相应的系统函数,而这个函数又会去调用相应的设备驱动程序,在驱动程序中会启动相应的I/O 操作,并且被阻塞起来,直到这个I/O 操作完成后,产生一个中断程序,并跳到相应的中断处理程序,在这里将会唤醒被阻塞的驱动程序。

B 设备驱动程序:直接同I/O 设备打交道,直接对它们进行控制的软件模块。上层的I/O软件通过抽象的函数接口与设备驱动程序打交道,这些接口是标准的、稳定不变的,而硬件设备的具体细节被封装在设备驱动程序里面。设备驱动程序的管理通过驱动程序地址表来实现。驱动程序表中存放了各个设备驱动程序的入口地址,可以通过此表来实现设备驱动的动态安装与卸载。

C、设备独立I/O软件:这部分软件在设备驱动程序的上面,是独立的I/O软件,也是系统内核的一部分,主要任务是实现所有设备都需要的一些通用I/O 功能,并向用户级的软件提供一个统一的访问接口。

D、用户空间的I/O软件:大部分的I/O软件都是包含在操作系统当中的,也有一小部分运行在系统内核之外。主要可以分为下面两种:

a、与用户程序进行链接的库函数:例如C 语言中与I/O 相关的库函数。 b、完全运行在用户空间当中的程序:例如Spooling 技术。 注:Spooling技术

Spooling 是“外围设备联机操作”的所写,spooling 技术也叫假脱机技术或虚拟设备技术,它可以把一个独占的设备转变为具有共享特征的虚拟设备。在多道系统中,对于一个独占设备,专门利用一道程序来增强该设备的I/O 功能。优点有二:能提供高速的虚拟I/O 服务;能实现对独占设备的共享。 6、文件系统

(1)嵌入式文件系统概述

文件系统就是操作系统中用以组织、存储、命名、使用和保护文件的一套管理机制。 常见的嵌入式文件系统有:

A、FAT:VxWorks、QNX、WindowsCE 等

B、NFS:网络文件系统,基于远程调用和扩展数据表示。 C、FFS:用于Flash 存储器的文件系统。 (2)文件和目录

A、当一个文件被创建时,必须给它指定一个名字,用户就是通过文件名来访问这个文件的。 B、文件命是一个有限长度的字符串,由两部分组成:文件名和扩展名。

C、文件的逻辑结构主要有三种:无结构、简单的记录结构和复杂结构。现代文件系统通常采用的是无结构的形式。

D、除了文件名之外,操作系统会给每个文件附加一些其他信息,称为文件的属性。 E、文件的存取方法有两种:顺序存取和随机存取。

F、目录也称为文件夹,它是一张表格,记录了在该目录下每个文件名和其他的一些管理信息。

G、在多级目录结构中,访问文件或目录主要有两种方法:绝对路径名和相对路径名。 (3)文件系统的实现

A、数据块:在磁盘中以扇区为单元进行读写操作。对文件系统而言,把磁盘空间划分为一个个大小相同的块,称为物理块,每个物理块包含若干个连续的扇区,同时把文件的字节流也分成大小相同的逻辑块。在文件系统内部,以块为单位来进行操作,把每一个逻辑块保存在一个物理块中。

B、文件的实现需要解决两个方面的问题:

- 17 -

a、如何描述一个文件。 b、如何存储一个文件。

C、文件控制块(FCB):它是文件的描述方法,是操作系统为了管理文件而设置的一种数据结构,里面存放了与文件有关的所有管理信息,FCB是文件存在的标志。 D、文件的物理结构:连续结构、链表结构和索引结构。 连续结构:把文件的各个逻辑块按照顺序存放在若干个连续的物理块当中。主要用于CD-ROM 等一次性写入的光学存储介质当中。 链表结构:把文件的各个逻辑块依次存放在若干个物理块当中,这些物理块既可以是连续的,也可以是不连续的,然后在各个块之间通过指针连接起来,前一个物理块指向下一个物理块,从而形成一条链表。

带有文件分配表的链表结构:在链表结构的基础上,把每一个物理块当中的链表指针抽取出来,单独组成一个表格,就是文件分配表(FAT)。如果要随机访问文件的地n 个逻辑块,可以先从FAT 表中查到相应的物理块地址,然后根据这个地址直接去访问磁盘。 索引结构:把文件当中每一个逻辑块所对应的物理块编号直接记录在这个文件的文件控制块当中,这样的文件控制块称为是I 节点,或索引节点。这样,对于系统中的每一个文件,都有一个自己的索引节点,通过这个索引节点就能够直接实现逻辑块与物理块之间的映射关系。

(4)目录的实现

A、直接法:把文件控制块的内容直接保存在目录项当中,因此每个目录项就等于某个文件名加上它的FCB。

B、间接法:目录项里面只有文件名和该文件的FCB 所在地址。

不管是那一种类型的实现方法,目录的基本功能都一样,即用户给出一个文件名,就返回相应文件的FCB。

(5)空闲空间管理方法: A、位图法。 B、链表法。 C、索引法。

(四)

1、存储器系统的层次架构

计算机系统的存储器被组织城一个金字塔的层次结构。 自上而下为:CPU 内部寄存器、芯片内部高速缓存(cache)、芯片外部高速缓存(SRAM、SDRAM、DRAM)、主存储器(FLASH、EEPROM)、外部存储器(磁盘、光盘、CF 卡、SD 卡)和远程二级存储器(分布式文件系统、WEB 服务器),6个层次的结构。

上述设备从上而下,依次速度更慢、容量更大、访问频率更小,造价更便宜。 2、高速缓存(cache)

工作原理(参照教程126页,博客画不了图):主要利用了程序的局部性特点。 地址映象是指把主存地址空间映象到cache 的地址空间。

地址变换是指当程序或数据已经装入到cache 后,在实际运行过程中,把主存地址如何编程cache 空间的地址。

常用的地址映象和地址变换的方式有:(教程127页)

直接映象和变换:速度快,造价低,但有局限性,不能充分利用cache 的好处。 组相联地址映象和变换:速度稍慢但是命中率高。 全相联地址映象和变换:可以任意映射。

常用的cache 替换算法:轮转法和随机替换算法。

- 18 -

高速缓存的分类:

统一cache 和独立的数据/指令cache 写通cache 和写回cache

读操作分配cache 和写操作分配cache 3、存储管理单元(MMU)

MMU 在CPU 和物理内存之间进行地址转换,将地址从逻辑空间映射到物理空间,这个过程称为内存映射。

MMU 主要完成下面的工作:

A. 虚拟存储空间到物理空间的映射。 B. 存储器访问权限的控制。

C. 设置虚拟存储空间的缓冲特性。

嵌入式系统中常常采用页式存储管理。为了管理这些页引入了页表的概念。 页表是位于内存中的表,它的每一行对应虚拟存储空间的一个页,该行包含了该虚拟内存页对应的物理内存页的地址、该页的访问权限和该页的缓冲特性等。 从虚拟地址到物理地址的变换过程就是查询页表的过程。

由于页表存储在内存中的,整个查询过程需要付出很大的代价。根据程序局部性的特点,增加了一个小容量、高速度的存储部件来存放当前访问需要的地址变换条目,这个存储部件称为:地址转换后备缓冲器(TLB)。

当CPU 访问内存时,首先在TLB 中查找需要的地址变换条目,如果该条目不存在,CPU 再从内存中的页表中查询,并把相应的结果添加到TLB 中,更新它的内容。 嵌入式系统中虚拟存储空间到物理空间的映射以内存块为单位进行。即虚拟存储空间中一块连续的存储空间被映射到物理存储空间中同样大小的一块连续存储空间。

在页表和TLB 中,每一个地址变换条目实际上记录了一个虚拟存储空间的内存块的基地址与物理存储空间相对应的一个内存块的基地址之间的对应关系。

在MMU 中实现虚拟地址到物理地址的映射是通过两级页表来实现的。 禁止MMU 时,所有物理地址和虚拟地址相等,即使用平板存储模式。 4、内存保护

操作系统通常利用MMU 来实现操作系统内核与应用程序之间的隔离,以及应用程序与应用程序之间的隔离。

内存保护包含两个方面的内容:

A. 防止地址越界,每个应用程序都有自己独立的地址空间。 B. 防止越权操作,每个应用程序都有自己的访问权限。 5、实模式与保护模式

在嵌入式系统中,常见的存储管理方案可以分为两大类:实模式和保护模式。 实模式:内存的平面使用模式。特点有:

A. 不划分“系统空间”与“用户空间”,无须进行地址映射。 B. 操作系统与应用程序之间不再有物理的边界。

C. 系统中的“任务”或“进程”,实际上全是内核线程。 在实模式下,内存布局可以分为5个段:

A. 代码段:包含操作系统和应用程序的所有代码。 B. 数据段:所有带有初始值的全局变量。 C. BSS 段:所有未带初始值的全局变量。 D. 堆空间:动态分配的内存空间。

E. 栈空间:保存上下文以及函数调用时的局部变量和形参。

- 19 -

在实模式存储管理方案下,主要的工作在于堆空间的管理,即如何来管理空闲的堆空间、如何来分配内存、如何来回收内存等等。

保护模式:处理器中必须有MMU 硬件并启用。特点有: A. 系统内核和用户程序都有各自独立的地址空间。

B. 每个应用程序只能访问自己的地址空间,不能去破坏操作系统和其他应用程序的代码和数据。

6、分区存储管理

为了实现多道程序系统而采用的最简单的内存管理。

基本思路:把整个内存划分为两大区域,即系统区和用户区,然后再把用户区划分为若干个分区,每个任务占有其中的一个分区。这样,在内存当中就同时保留多个任务,让他们共享整个用户区,从而实现多个任务的并发运行。

分区存储管理又可以分为两类:固定分区和可变分区。

固定分区:各个用户分区的个数、位置和大小一旦确定后,就固定不变,不能再修改。 优点:易于实现,系统开销较小。

缺点:内存利用率不高,分区总数固定。

可变分区:动态创建,在装入一个程序时,系统将根据它的需求和内存空间的使用情况来决定是否分配。

优点:动态变化,非常灵活。 缺点:可能存在外碎片。

在实现可变存储管理技术的时候,需要考虑三个方面的问题: A. 内存管理的数据结构 B. 内存的分配算法 C. 内存的回收算法 7、地址映射

地址映射也叫地址重定位。

逻辑地址和物理地址是完全不同的,不能用逻辑地址来直接访问内存单元。

为了保证CPU 在执行指令的时候,可以正确地访问内存单元,需要将用户程序中的逻辑地址转换为运行时由机器直接寻址的物理地址。这个过程称为:地址映射。 地址映射由存储管理单元MMU 来完成。

地址映射主要有两种方式:静态地址映射和动态地址映射。

静态地址映射:当用户程序被装入内存时,直接对指令代码进行修改,一次性地实现逻辑地址到物理地址的转换。

动态地址映射:当用户程序被装入内存时,不对指令代码做任何修改,而是在程序的运行过程中,当它需要访问内存单元的时候,再来进行地址转换。 在具体实现时,这项转换工作一般是由硬件的地址映射机制来完成的。通常设置一个基地址寄存器,

或者叫重定位寄存器。当一个任务被调度运行时,就把它所在分区的起始地址装入到整个寄存器中。然后,在程序运行的过程中,当需要访问某个内存单元时,硬件就会自动地将其中的逻辑地址加上基地址寄存器中的内容,从而得到实际的物理地址,并且按照这个物理地址区执行。

这个基地址寄存器位于MMU 的内部,整个地址映射过程是自动运行的。从理论上说,每访问一次内存都要进行一次地址映射。 8、页式存储管理(重点)

基本思路:把物理内存划分为许多固定大小的内存块,称为物理页面;把逻辑地址空间也划

- 20 -

分为大小相同的块,称为逻辑页面。当一个用户程序被装入内存时,不是以整个程序为单位,把它存放在一整块连续的区域,而是以页面为单位来进行分配的。对于一个大小为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。 9、虚拟存储管理

程序局部性原理:时间局限性和空间局限性。

虚拟页式存储管理:在页式管理的基础上,增加了请求调页和页面置换的功能。 基本思路:当一个用户程序需要调入内存去运行时,不是将这个程序的所有页面都装入内存,而是只装载部分的页面,就可以启动这个程序运行。在运行过程中,如果发现要执行的指令或者访问的数据不在内存当中,就向系统发出缺页中断请求,然后系统在处理这个中断请求时,就会将保存在外存中的相应页面调入内存,从而使该程序能继续运行。

在虚拟页式存储管理中,页表包含:逻辑页面号、物理页面号、驻留位、保护位、修改位和访问位。

- 21 -

常用的页面置换算法:

A. 最优页面置换算法:理想化算法。

B. 最近最久未使用算法:链表法和栈方法。寻找长时间没有被访问的页面。 C. 最不常用算法:每个页面设置一个访问计数器。 D. 先进先出算法:性能比较差。

E. 时钟页面置换算法:把页面组成环形链表,类似时钟面。

一般来说,当一个任务刚刚启动的时候,它会不断去访问一些新的页面,然后逐步建立一个比较稳定的工作集。工作集是指当前任务正在使用的逻辑页面的集合。如果分配给一个任务的物理页面数太少,不能包含整个的工作集,任务将会造成很多缺页中断,需要频繁地进行页面置换,这种现象称为“抖动”。

(五)

1. 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 的困难在于闪存需要特殊的系统接口。

(5)NOR Flash 与NAND Flash 的区别:

A、NOR Flash 的读速度比NAND Flash 稍快一些。 B、NAND Flash 的擦除和写入速度比NOR Flash 快很多

C、NAND Flash 的随机读取能力差,适合大量数据的连续读取。

D、NOR Flash 带有SRAM 接口,有足够的地址引进来寻址,可以很容易地存取其内部的每一个字节。NAND Flash 的地址、数据和命令共用8位总线(有写公司的产品使用16位),每次读写都要使用复杂的I/O 接口串行地存取数据。 E、NOR Flash 的容量一般较小,通常在1MB~8MB 之间;NAND Flash 只用在8MB 以上的产品中。

因此,NOR Flash 只要应用在代码存储介质中,NAND Flash 适用于资料存储。 F、NAND Flash 中每个块的最大擦写次数是一百万次,而NOR Flash 是十万次。 G、NOR Flash 可以像其他内存那样连接,非常直接地使用,并可以在上面直接运行代码;NAND

- 22 -

Flash需要特殊的I/O 接口,在使用的时候,必须先写入驱动程序,才能继续执行其他操作。因为设计师绝不能向坏块写入,这就意味着在NAND Flash 上自始至终必须进行虚拟映像。 H、NOR Flash 用于对数据可靠性要求较高的代码存储、通信产品、网络处理等领域,被成为代码闪存;NAND Flash 则用于对存储容量要求较高的MP3、存储卡、U 盘等领域,被成为数据闪存。 2、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。 编辑推荐:

3、硬盘、光盘、CF卡、SD卡的相关知识见《教程》145~148页。 4、GPIO原理与结构

GPIO 是I/O 的最基本形式,它是一组输入引脚或输出引脚。有些GPIO 引脚能够加以编程改变工作方向,通常有两个控制寄存器:数据寄存器和数据方向寄存器。数据方向寄存器设置端口的方向。如果将引脚设置为输出,那么数据寄存器将控制着该引脚状态。若将引脚设置为输入,则此输入引脚的状态由引脚上的逻辑电路层来实现对它的控制。 5、A/D接口

- 23 -

(1)A/D 转换器是把电模拟量转换为数字量的电路。实现A/D 转换的方法有很多,常用的方法有计数法、双积分法和逐次逼进法。 (2)计数式A/D转换法

其电路主要部件包括:比较器、计数器、D/A 转换器和标准电压源。

其工作原理简单来说就是,有一个计数器,从0开始进行加1计数,每进行一次加1,该数值作为D/A 转换器的输入,其产生一个比较电压VO 与输入模拟电压VIN 进行比较。如果VO 小于VIN 则继续进行加1计数,直到VO 大于VIN,这时计数器的累加数值就是A/D 转换器的输出值。(详细参考《教程》155页)

这种转换方式的特点是简单,但是速度比较慢,特别是模拟电压较高时,转换速度更慢。例如对于一个8位A/D 转换器,若输入模拟量为最大值,计数器要从0开始计数到255,做255次D/A 转换和电压比较的工作,才能完成转换。 (3)双积分式A/D转换法

其电路主要部件包括:积分器、比较器、计数器和标准电压源。 其工作原理是,首先电路对输入待测电压进行固定时间的积分,然后换为标准电压进行固定斜率的反向积分,反向积分进行到一定时间,便返回起始值。由于使用固定斜率,对标准电压进行反向积分的时间正比于输入模拟电压值,输入模拟电压越大,反向积分回到起始值的时间越长。只要用标准的高频时钟脉冲测定反向积分花费的时间,就可以得到相应于输入模拟电压的数字量,也就完成了A/D 转换。(详细参考《教程》156页)

其特点是,具有很强的抗工频干扰能力,转换精度高,但转换速度慢,通常转换频率小于10Hz,主要用于数字式测试仪表、温度测量等方面。 (4)逐次逼近式A/D转换法

其电路主要部件包括:比较器、D/A 转换器、逐次逼近寄存器和基准电压源。

其工作原理是,实质上就是对分搜索法,和平时天平的使用原理一样。在进行A/D 转换时,由D/A 转换器从高位到低位逐位增加转换位数,产生不同的输出电压,把输入电压与输出电压进行比较而实现。首先使最高位为1,这相当于取出基准电压的1/2与输入电压比较,如果在输入电压小于1/2的基准电压,则最高位置0,反之置1。之后,次高位置1,相当于在1/2的范围中再作对分搜索,以此类推,逐次逼近。(详细参考《教程》157页)

其特点是,速度快,转换精度高,对N 位A/D 转换器只需要M 个时钟脉冲即可完成,一般可用于测量几十到几百微秒的过渡过程的变化,是目前应用最普遍的转换方法。 (5)A/D 转换的重要指标(有可能考一些简单的计算)

A、分辨率:反映A/D 转换器对输入微小变化响应的能力,通常用数字输出最低位(LSB)所对应的模拟电压的电平值表示。n 位A/D 转换器能反映1/2n 满量程的模拟输入电平。 B、量程:所能转换的模拟输入电压范围,分为单极性和双极性两种类型。 C、转换时间:完成一次A/D 转换所需要的时间,其倒数为转换速率。

D、精度:精度与分辨率是两个不同的概念,即使分辨率很高,也可能由于温漂、线性度等原因使其精度不够高。精度有绝对精度和相对精度两种表示方法。通常用数字量的最低有效位LSB 的分数值来表示绝对精度,用其模拟电压满量程的百分比来表示相对精度。

例如,满量程10V,10位A/D 芯片,若其绝对精度为±1/2LSB,则其最小有效位LSB 的量化单位为:

10/1024=9.77mv,其绝对精度为9.77mv/2=4.88mv,相对精度为:0.048%。

2011年软考嵌入式系统设计师考试学习笔记汇总

- 24 -

入式软件开发概述

1.嵌入式应用软件开发步骤: ⑴、硬件的设计与实现;⑵、设备驱动软件的设计与实现;⑶、嵌入式操作系统的选择,移植,以及API接口函数的设计;⑷、支撑软件的设计与调试;⑸、应用程序的设计与调试;⑹、系统联调、样机交付。

2、嵌入式软件开发的特点:

⑴、需要交叉编译工具;⑵、通过仿真手段进行调试;⑶、开发板是中间目标机;⑷、可利用的资源有限;⑸、需要与硬件打交道; 3、嵌入式开发遇到的问题:

⑴、软件硬协同设计;⑵嵌入式操作系统;⑶、代码优化;⑷、有限的I/O资源;

嵌入式程序设计语言

1、程序设计语言概述 ⑴机器语言:是与计算机硬件关系最为密切的计算机语言,在计算机硬件上执行的就是一条条用机器语言来编写的指令;

汇编语言:基本思路是用符号的形式来代替二进行的指令。 低级语言:通常将机器语言和汇编语言统称为低级语言。 ⑵语言处理程序

语言处理程序:担任翻译任务的程序称为语言处理程序。包括:汇编程序、解释程序、编译程序。

源程序:用汇编语言或某程高级语言编写的程序。源程序不能直接在计算机上运行。

解释程序:也称解释器,它直接解释执行源程序、或将源程序翻译成某种中间表示形式后再执行。

编译程序:是将源程序翻译成目标语言程序,然后在计算机上运行。

区别:在编译方式下,机器上运行的是与源程序等价的目标程序,源程序和编译程序都不再参与目标程序的执行;而在解释方式下,解释程序和源程序要参与程序的运行过程中,运行控制权在解释程序。 程序设计语言的定义

⑶包括:语法、语义、语用、语境。 2、汇编语言

⑴、基本原理:为特定计算机或计算机系统设计的面向机器的符号化程序设计语言。 包括三类语句:指令语句、伪指令语句、宏指令语句。

指令语句:又称机器指令语句,将其汇编后能产生相应的机器代码,这些代码能被CPU直接识别并执行相应的操作;

伪指令语句:指示汇编程序在对源程序进行汇编时完成某些工作。区别:伪指令在汇编后不产生机器代码,而指令语句产生机器代码。常用:定义伪指令 EQU;存储定义伪指令 DCB;汇编控制伪指令 IF、ELSE、ENDIF,WHILE WEND;开始伪指令 ENTRY;结束伪指令 END。 宏指令:将多次重复使用的程序段定义为宏 ⑵、ARM汇编语言

格式:ARM语言以段为单位组织源文件。段是相对独立的、具有特定名称的、不可分割的指令或数序列。段可以分为代码段和数据段,代码段存放执行代码、数据段存放代码运行时用到的数据。一个ARM源程序至少要一个代码段。

ARM汇编语言程序经过汇编处理后生成一个可执行的映像文件,包括:一个或多处代码段,代码段通常是只读的;0个或多个包含初始值的数据段,通常可读写;0个或多处不含初始值的数据段,可读写;

- 25 -

3、面向过程的语言 定义:也叫命令式语言或强制式语言,通过一系列可执行的运算及运算的先后次序来描述计算的过程。

过程序式语言包括:数据、运算、控制、函数。 数据成分:是一种程序语言的数据类型。

数据属性:包括名称、类型、存储类别、作用域、生存周期。 运算成份:算术运算、关系运算、逻辑运算。 控制成份:顺序、选择、重复;

函数:是程序模块的主要成份,它是一段具有独立功能的程序,包括三个概念:函数定义,函数声明、函数调用。

一次函数调用的步骤:⑴、在内存的栈空间当中为其分配一个栈帧,用来存放该函数的形参变量和局部变量;⑵、把实参变量的值复制到相应的形参变量中;⑶、控制流转移到该函数的起始位置;⑷、该函数开始执行;⑸、当这个函数执行完成后,控制流和返回值返回到函数调用点。

4、面向对象的语言

面向对象=对象+分类+继承+通过消息的通信

对象:是基本运行时的实体,包括数据(属性),数据操作的行为,所以一个对象将属性和行为封装成一个整体。由对象名、属性、操作三个部分组成。 方法:在对象内的操作称为方法; 消息:对象之间进行通信的一种构造;

类:定义了一组大体上相似的对象,类是在对象之上的抽象,对象是类的具体化。 继承:父类和子类之间共享数据和方法的机制。

多态:不同的对象收到同一消息可以产生完成不同的结果,这一现象称为多态。 动态绑定:是一个把过程调用和响应调用所需要执行的代码加以结全的过程。 C++:一种面向对象的语言,支持面向对象,也支持面向过程。 5、汇编、编译、解译程序的基本原理

⑴、汇编程序:是将汇编语言源程序翻译成机器语言程序。 汇编程序一般至少需要两次扫描源程序才能完成翻译过程:第一次主要工作是定义符号的值并创建一个符号表ST;第二次是扫描的任务产生目标程序。

⑵、编译程序:功能是把某些高级语言编写的源程序翻译成与之等价的目标语言程序。 分成六个阶段:词法分板阶段、语法分板阶段、语议分析阶段、中间代码生成阶段、代码优化阶段、目标代码生成阶段。

⑶、解释程序:是另一种语言处理程序,在词法、语法、语议分析方面与编译程序,它直接执行源程序或源程序的内部形式。因此解释程序不产生源程序的目标程序,这是与编译程序的主要区别。

嵌入式软件开发环境

宿主机:是用于开发嵌入式系统的计算机,运行的工具包括:文本编辑器、交叉调试器、集成环境以及各种分析工具。

目标机一般在嵌入式应用软件的开发和调试期使用,它可以是嵌入式应用软件的实际运行环境,也可以是能够代替实际运行环境的仿真系统。

常用的调度方法:直接测试法、调试监控器法、ROM仿真器法、在线仿真器法、片上调试法及模拟法。

嵌入式软件开发

1、嵌入式平台选型

- 26 -

嵌入式设计分三个阶段:分析、设计和实现。

分析阶段:是确定要解决的问题及需要完成的目标,也称需求阶段; 设计阶段:主要是解决如何在给定的约束条件下完成用户的需求; 实现阶段:主要是解决如何在所选择的硬件和软件的基础上进行整个软硬件系统的协调和实现。

硬件的选择包括:处理器、硬件部件

软件的选择包括:操作系统、编程语言、软件开发工具、硬件调试工具和软件组件。 2、软件设计 ⑴、软件设计任务:准备一个工作计划;确定软件的结构;设计评审;维护工作计划;与硬件部门密切合作、相互协调;控制工作的结果、把工作记录存档。 ⑵、模块结构设计

模块结构设计的任务:将系统划分为模块,确定软件的结构,模块的功能和模块间的接口,以及全局数据结构设。

模块:是组成系统的基本单位,它的特点是可以组合、分解和更换。 模块的四要素:输入和输出;处理功能;内部数据;程序代码。

模块结构设计应遵守的原则:所划分的模块其内部凝聚性要强,模块之间的联系要少,即要有很强的独立性;模块之间的连接只能存在上下级之间的调用关系,不能有同级之间的横向关系;整个结构呈树状结构,不允许网状结构或交叉调用关系;所有模块必须严格地分类编码并建立归档文件。 ⑶、结构化设计的方法

结构化设计的方法是一种面向数据流的设计方法,基本思想是将系统设计成由相对独立、功能单一的模块组成的结构。

信息流的类型:变换流和事务流。

结构化设计方法的步骤:复查并精化数据流图;确定DFD的信息流类型(变换型或事务型);根据流类型分别实施变换分析或事务分析;根据系统设计的原则,对程序结构图进行优化。 3、嵌入式程序设计 ⑴、bootloader的设计

步骤;stage1和stage2两大部 Stage1步骤:硬件设备初始化;为加载bootloader的stage1准备内存空间;复制bootloader的stage1到内存;设置好堆栈;跳转到stage1的C入口点。

Stage2步骤:初始化本阶段要使用的硬件设备;检测系统内存映射;将内核映像和根文件系统映像到flash上读入到内存中;为内核设置启动参数,并调用内核。 ⑵、设备驱动程序设计 ⑶、网络应用程序设计 4、编码 四个步骤:确定源程序的标准格式、制定编程规范;准备编程环境;编写代码;进行代码审查,提高编码质量。 5、测试 ⑴、概述

软件测试:是从经济和效率的角度出发,对软件代码进行质量和正确性保证的一个过程。 系统测试的目的:是为了发现至今尚未发现的错误。

规范化的测试过程:拟定测试计划;编制测试大纲;根据测试大纲设计和生产测试用例;实施测试;生成测试报告。 ⑵、测试方法

- 27 -

分类:人工测试和机器测试

人工测试的三种方法:个人复查、抽查、会审 机器测试分成:黑盒测试和白盒测试 黑盒测试:也称功能测试,将软件看成黑盒子,在完成不考虑软件内部结构和特性的情况下,测试软件的外部特性。包括:极限情况测试;边界测试;异常测试;随机测试;性能测试。 白盒测试:也称结构测试,将软件看成透明的的盒,根据程序的内部结构和逻辑来设计测试用例。原则:程序模块中的所有独立路径至少执行一次;在所有的逻辑判断中,取“真”“假”的两种情况至少都要执行一次;每个循环都应在边界条件和一般条件下各执行一次;测试程序内部的数据结构的有效性。 ⑶、测试步骤:

①、系统平台测试:包括硬件电路测试、操作系统及底层驱动程序测试; ②、单元测试:也称模块测试。一般采用白盒测试法。主要测试模拟块接口、局部数据结构、重要的执行路径、出错处理、边界条件。

测试时需要开的模块包括:驱动模块(相当于一个程序,负责接收测试用例的数据,将这些数据送到测试模块,并输出结果)和桩模块(也称为存根模块,用来代替测试模块中所调用的子模块,其内可进行少量的数据处理,目的是为了检验入口,并输出调用和返回的信息) ③、集成测试:也称组装测,就是把各个模块按照系统设计说明书的要求组合起来进行测试。 两种方法:一种是分别测试各个模块,再把这些模块组合起来进行整体测试,即非增量式集成;另一种是把下一个要测试的模块组合到已测试好的模块中,测试完成再将下一个模块组合进来,进行测试,这样逐步把所有的模块组合在一起,并完成测试,即增量式集成。 ④、系统测试:将嵌入式软件、硬件,外设和网络等各种因素结全在一起,进行整个系统的组装测试和确认测试。一般采用黑盒测试法。

主要测试内容:恢复测试、强度测试、性能测试、可靠性测试。 ⑤、测试结果分析

对测试结果分析和比较帮助错误的定位,指导程序员修改代码。

⑷、覆盖测试:是一种白盒测试法,测试人员必须拥有程序的规格说明书和程序清单。其基本思路是以程序的内部结构为基础来设计测试用例,以覆盖尽可能多的程序内部逻辑结构,发现其中的错误和问题,一般用在单元测试阶段。

主要策略:语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖。

嵌入式软件移植

可分成有操作系统和无操作系统的移植。

uC/OS-II操作系统代码被分成三个部分:一是,与处理器无关的代码,如任务管理、存储管理、信号量等;二是,与系统配置有关,应用程序开发人员可以通过修改这些配置文件来裁剪内核,选择自已需要的系统服务;三是,与处理器相关的代码,包括OS_CPU.H、OS_CPU_A.ASM、OS_CPU_C.C三个文件。

提高嵌入式应用软件的可移植性,遵守的原则:在软件设计上,采用层次化设计和模块化设计;在软件体系结构上,可在操作系统和应用软件之间引入一个虚拟机层,或者叫操作系统抽象层,将通用的、共性的操作系统API接口函数封装起来;在功能服务的调用上,要尽量使用可移植的函数;将不可移植的部分局域化;提高代码的可重用性。

- 28 -

本文来源:https://www.bwwdw.com/article/utw8.html

Top