嵌入式系统设计大学教程 - 习题与解答

更新时间:2024-01-26 06:19:01 阅读量: 教育文库 文档下载

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

嵌入式系统设计大学教程习题与解答

第1章 嵌入式系统设计基本概念(绪论)

1、嵌入式系统的定义是什么?你是如何理解嵌入式系统的? (P3) 答:嵌入式系统一般定义为以应用为中心、以计算机技术为基础,软硬件可裁剪,应用系统对功能、可靠性、成本、体积、功耗和应用环境有特殊要求的专用计算机系统。一个嵌入式系统就是一个硬件和软件的集合体,它包括硬件和软件两部分。其中硬件包括嵌入式处理器/控制器/数字信号处理器(DSP)、存储器及外设器件、输入输出(I/O)端口、图形控制器等;软件部分包括操作系统软件(嵌入式操作系统)和应用程序(应用软件),由于应用领域不同,应用程序千差万别。

2、列出并说明嵌入式系统不同于其他计算机系统的主要特征。(P3~P4)

答:主要特征有:

? 系统内核小:由于嵌入式系统一般是应用于小型电子装置,系统资源相对有限,所以内核较传统的操作系统要小得多。 ? 专用性强:嵌入式系统通常是面向特定任务的,个性化很强,其中软件系统和硬件的结合非常紧密,一般要针对硬件进行软件系统的移植。

? 运行环境差异大:嵌入式系统使用范围极为广泛,其运行环境差异很大。

? 可靠性要求高:嵌入式系统往往要长期在无人值守的环境下运行,甚至是常年运行,因此对可靠性的要求特别高。 ? 系统精简和高实时性操作系统:

? 具有固化在非易失性存储器中的代码:为了系统的初始化,几乎所有系统都要在非易失性存储器中存放部分代码(启动代码)。为了提高执行速度和系统可靠性,大多数嵌入式系统常常把所有代码(或者其压缩代码)固化,存放在存储器芯片或处理器的内部存储器件中,而不使用外部存储介质。 ? 嵌入式系统开发工作和环境:嵌入式系统开发需要专门的开发工具和环境。

3、简述嵌入式系统的体系结构。(P5)

答:嵌入式系统自底向上包含四个部分:硬件平台、嵌入式实时操作系统(RTOS)、硬件抽象层(HAL)和嵌入式实时应用程序。硬件抽象层位于操作系统和硬件之间,包含了系统中与硬件相关的大部分功能。屏蔽了底层硬件的多样性,操作系统不再直接面对具体的硬件环境,而是面向由这个中间层次所代表的、逻辑上的硬件环境。

4、嵌入式系统是怎样分类的?(P8)

答:根据不同的分类标准,嵌入式系统有不同的分类方法。按嵌

入式微处理器的位数分类:嵌入式系统可分为4位、8位、16位、32位和64位等;按软件实时性需求分类:可分为非实时系统(如PDA)、软实时系统(如消费类产品)和硬实时系统(如工业实时控制系统)。按嵌入式系统的复杂程度分类:嵌入式系统可分为小型嵌入式系统、中型嵌入式系统和复杂嵌入式系统。

5、什么是实时操作系统,其主要功能是什么?(P8)

答:实时多任务操作系统(Real Time multi-tasking Operation System,RTOS)简称实时操作系统,主要用来完成嵌入式实时应用的任务调度和控制等核心功能。这些功能是通过内核服务函数形式交给用户调用的,也就是RTOS的系统调用,或者叫做RTOS的API。

6、在日常生活中,你接触过哪些嵌入式产品?他们都有些什么功能?(P9~P10) 答:[略]

第2章 嵌入式系统设计基本概念

1、嵌入式系统的硬件由哪几个部分组成?(P12~13)

答:嵌入式系统的硬件系统是由嵌入式处理器、存储器、I/O接口电路、通信模块以及其他外部设备组成的。其核心是嵌入式处理器。

存储器是构成嵌入式系统硬件的重要组成部分。

嵌入式处理器工作时,必须有附属电路支持,如时钟电路、复位电路、调试电路、监视定时器、中断控制电路等,这些电路并不完成数据的输入/输出功能,而是为嵌入式处理器的工作提供必要的条件。嵌入式处理器与通用处理器的最大区别在于嵌入式处理器集成了大量的不同功能的I/O模块。用户在开发嵌入式系统时,可以根据系统需求选择合适的嵌入式处理器,而无需再另外配备I/O电路。

此外,嵌入式系统通常还包括人机交互界面,用于系统与用户的交互。人机界面常常使用键盘、液晶屏、触摸屏等部件,以方便与用户的交互操作。

2、通用处理器与嵌入式处理器有哪些相同和不同的地方?(P13) 答:嵌入式微处理器一般具备四个特点:

? 对实时和多任务有很强的支持能力,能完成多任务并且有较短的中断响应时间,从而使内部的代码和实时操作系统的执行时间减少到最低限度;

? 具有功能很强的存储区保护功能,这是由于嵌入式系统的软件结构已模块化,而为了避免在软件模块之间出现错误的交叉作用,需要设计强大的存储区保护功能,同时也有利于软件诊断; ? 可扩展的处理器结构,以能迅速地扩展出满足应用的高性能的嵌入式微处理器;

? 嵌入式处理器的功耗必须很低,尤其是用于便携式的无线及移

动的计算和通信设备中靠电池供电的嵌入式系统更是如此,功耗只能为mW甚至μW级。

嵌入式处理器与通用处理器的最大区别在于嵌入式处理器集成了大量的不同功能的I/O模块。用户在开发嵌入式系统时,可以根据系统需求选择合适的嵌入式处理器,而无需再另外配备I/O电路。

3、常用的嵌入式处理器通常分成哪几大类?(P13)

答:嵌入式系统中的处理器通常分为三大类,即微处理器(Micro-Processor Unit,MPU)、微控制器(Micro-Controller Unit,MCU)和数字信号处理器(DSP)。微处理器是指功能较强大的CPU,它不是为任何特定的计算目标而设计的。因此这种芯片通常用于个人计算机与服务器。微控制器是针对嵌入式系统而设计的,它将CPU、存储器以及其他外设都集成在同一片电路板上。数字信号处理器(DSP)中的CPU是针对快速离散时间信号处理计算的。因此,DSP非常适用于音频及视频通信。现代的芯片生产工艺已经允许将重要处理器的内核和各种外围的芯片器件整合在一起,以进一步降低功耗,达到专用的需求,这时,便出现了片上系统SoC(System On Chip)。

4、什么是嵌入式外围设备?简要说明嵌入式外围设备是如何分类的。(P22~23) 答:

5、嵌入式操作系统的发展经历了哪几个阶段?(P28)

答:嵌入式操作系统伴随着嵌入式系统的发展,大致经历了四个阶段:

第一阶段:无操作系统的嵌入算法阶段,以单芯片为核心的可编程控制器形式的系统,具有与监测、伺服、指示设备相配合的功能。

第二阶段:以嵌人式CPU为基础、简单操作系统为核心的嵌入式系统。由于CPU种类繁多,因此通用性比较差;系统开销小,效率高;具有一定的兼容性和扩展性;系统主要用来控制系统负载以及监控应用程序运行。

第三阶段:通用的嵌入式实时操作系统阶段。以嵌入式操作系统为核心的嵌入式系统,能运行于各种类型的微处理器上,兼容性好;内核精小、效率高,具有高度的模块化和扩展性;具备文件和目录管理、设备支持、多任务、网络支持、图形窗口以及用户界面等功能;具有大量的应用程序接口(APl);嵌入式应用软件丰富。

第四阶段:以基于Internet为标志的嵌入式系统。这是一个正在迅速发展的阶段。嵌入式设备与Internet的结合将代表着嵌入式技术的真正未来。

6、现阶段常用的操作系统有哪些?通过调研,指出几种常用的嵌入式操作系统的特点是什么?常用在什么场合?(P28~29)

答:常用的嵌入式RTOS分三大类:商用系统、专用系统和开放系统。商品化的嵌入式实时操作系统,主要有WindRiver的Vxworks

和pSOS+,3Com的Palm OS以及Microsoft的Windows CE等。专用操作系统功能相对较弱,但针对性强,其安全可靠性大都超过普通商用系统,如应用于手机的嵌入式操作系统SymbianOS。开放系统的典型代表是嵌入式Linux和?C/OS-Ⅱ。

7、嵌入式操作系统的主要任务有哪些?(P28)

答:嵌入式操作系统通常包括与硬件相关的底层驱动软件、系统内核、设备驱动接口、通信协议、图形界面、标准化浏览器等。 嵌入式操作系统具有通用操作系统的基本特点,如能够有效管理越来越复杂的系统资源;能够把硬件虚拟化,使得开发人员从繁忙的驱动程序移植和维护中解脱出来;能够提供库函数、驱动程序、工具集以及应用程序。

8、嵌入式系统的基本设计过程包括哪几个阶段?每一个阶段的主要工作有哪些?(P33)

答:以自顶向下的角度来看,系统设计包括五个阶段,从系统需求分析开始;第二步是规格说明,在这一步,我们对需设计的系统功能进行更细致地描述,这些描述并不涉及系统的组成;第三步是系统结构设计,在这一阶段以大的构件为单位设计系统内部详细构造,明确软、硬件功能的划分;第四步是构件设计,它包括系统程序模块设计、专用硬件芯片选择及硬件电路设计;第五步是系统集成,在完成了所有构件设计的基础上进行系统集成,构造出所需的完整系统。

9、需求分析阶段细分为哪几个步骤?每个步骤完成什么工作?(P34~35)

答:需求分析阶段可细分为四个阶段:

1、需求与规格说明:通过与客户进行交流,了解用户的意图,明确客户需求,整理成正式的规格说明,这些规格说明里包含了进行系统体系结构设计所需要的足够信息。

2、确认需求:确认这一系列的需求不仅需要理解什么是用户需要的,而且需要理解他们是如何表达这些需求的。

3、简单的需求表格:将复杂而费时的工作用相对少量的格式清晰、简单的需求表格来表示,在考虑系统基本特征时可以将这个表格作为检查表。

4、需求的内部一致性:在写完需求分析以后,应该对它们的内部一致性进行检查。

10、试通过各种渠道调查目前市场上主要有哪些嵌入式系统开发平台,它们各自有什么特点。 答:[略]

第3章 ARM体系结构及基于ARM9处理器的嵌入式系统硬件平台OMAP5912

1、试比较RISC和CISC体系结构的异同,为什么ARM内核要采用RISC体系结构?(P47)

答:ARM体系结构总的设计思路是在不牺牲性能的同时尽可能简化处理器。同时从体系结构的层面上支持灵活的处理器扩展。这种简化和开放的思路使ARM处理器采用了很简单的结构——精简指令集计算机(Reduced Instruction Set Computer,RISC)体系结构来进行实现。

传统的复杂指令集计算机(Complex Instruction Set Computer,CISC)结构有其固有的缺点,即随着计算机技术的发展而不断引入新的复杂的指令集,为支持这些新增的指令,计算机的体系结构会越来越复杂,然而,在CISC指令集的各种指令中,其使用频率却相差悬殊,大约有20%的指令会被反复使用,占整个程序代码的80%。而余下的80%的指令却不经常使用,在程序设计中只占20%,显然,这种结构是不太合理的。

基于以上的不合理性,1979年美国加州大学伯克利分校提出了RISC的概念。

RISC并非只是简单地去减少指令。RISC是一种设计思想,其目标是设计出一套能在高时钟频率下单周期执行、简单而有效的指令集。RISC的设计重点在于降低由硬件执行的指令的复杂度,因为软件比硬件容易提供更大的灵活性和更高的智能。因此,RICS设计对编译

器有更高的要求;相反,传统的CISC则更侧重于硬件执行指令的功能性,使CISC指令变得更复杂。

2、简述ARM的设计思想及其与单纯的RISC定义的不同。(P48~49) 答:ARM内核并不是一个纯粹的RISC体系结构,这是为了使它能够更好地适应其主要应用领域——嵌入式系统。为了使ARM指令集能够更好地满足嵌入式应用的需要,ARM指令集和单纯的RISC定义有以下几个方面的不同:

? 一些特定的指令周期数可变——并不是所有的ARM指令都是单周期的。例如:多寄存器装载/存储的Load/Store指令的执行周期就是不确定的,必须根据被传送的寄存器个数来定。如果是访问连续的存储器地址,就可以改善性能,因为连续的内存访问通常比随机访问要快;同时,代码密度也得到了提高,因为在函数的起始和结尾,多个寄存器的传输是很常用的操作。

? 内嵌桶形移位器产生了更为复杂的指令——内嵌桶形移位器是一个硬件部件,在一个输入寄存器被一条指令使用之前,内嵌桶形移位器可以处理该寄存器中的数据。它扩展了许多指令的功能,以此改善了内核性能,提高了代码密度。

? Thumb 16位指令集——ARM内核增加了一套称之为Thumb指令的16位指令集,使得内核既能够执行16位指令,也能够执行32位指令,从而增强了ARM内核的功能。16位指令与

32位的定长指令相比较,代码密度可以提高约30%。 ? 条件执行——只有当某个特定条件满足时指令才会被执行。这个特性可以减少分支指令的数目,从而改善性能,提高代码密度。

3、ARM体系结构发展过程中,主要有哪些变种,对各变种做简要介绍。(P49~50)

答:我们将在ARM体系中增加的某些特定功能称为ARM体系的某种变种(variant),下面介绍ARM体系的一些变种形式。 (1)Thumb指令集(T变种)

Thumb指令集是将ARM指令集的一个子集重新编码而形成的一个指令集。ARM指令长度为32位,Thumb指令长度为16位。这样,使用Thumb指令集可以得到密度更高的代码,这对于需要严格控制产品成本的设计非常有意义。 (2)长乘法指令(M变种)

M变种增加了两条用于进行长乘法操作的ARM指令:其中一条指令用于实现32位整数乘以32位整数,生成64位整数的长乘法操作,另一条指令用于实现32位整数乘以32位整数,然后再加上32位整数,生成64位整数的长乘加操作。 (3)增强型DSP指令(E变种)

E变种包含了一些附加的指令,这些指令用于增强处理器对一些典型DSP算法的处理性能,主要包括:几条新的实现16位数据乘法

和乘加操作的指令,实现饱和的带符号数的加减法操作的指令。 (4)Java加速器Jazelle(J变种)

ARM的Jazelle技术将Java的优势和先进的32位RISC芯片完美地结合在一起。Jazelle技术提供了Java加速功能,可以得到比普通Java虚拟机高得多的性能。与普通的Java虚拟机相比,Jazelle使Java代码运行速度提高了3倍,而功耗降低了80%。

Jazelle技术使得程序员可以在一个单独的处理器上同时运行Java应用程序、已经建立好的操作系统、中间件以及其他应用程序。与使用协处理器和双处理器相比,使用单独的处理器可以在提供高性能的同时,保证低功耗和低成本。

(5)ARM媒体功能扩展(SIMD变种)

SIMD变种的主要特点是:可以同时进行两个16位操作数或者4个8位操作数的运算,提供了小数算术运算,用户可以定义饱和运算的模式,两套16位操作数的乘加/乘减运算,32位乘以32位的小数MAC,同时8位/16位选择操作。

4、ARM体系结构版本的命名规则有哪些?简单说明ARM7TDMI的含义。(P50)

答:ARM产品通常以ARM[x][y][z][T][D][M][I][E][J][F][-S]形式出现。ARM体系结构的命令规则中这些后缀的具体含义见表3-2。ARM7TDMI的含义即ARM7内核,增加了Thumb指令集(T变种)、JTAG调试器、长乘法指令(M变种)和嵌入式跟踪宏单元的功能。

5、列举目前常用的ARM微处理器的型号及功能特点。(P51~53)

答:ARM微处理器目前包括下面几个系列,以及其它厂商基于ARM体系结构的处理器,除了具有ARM体系结构的共同特点以外,每一个系列的ARM微处理器都有各自的特点和应用领域。 ? ARM7系列 ? ARM9系列 ? ARM9E系列 ? ARM10E系列 ? ARM11系列 ? SecurCore系列 ? Inter的Xscale ? Inter的StrongARM

其中,ARM7、ARM9、ARM9E和ARM10E为4个通用处理器系列,每一个系列提供一套相对独特的性能来满足不同应用领域的需求。SecurCore系列专门为安全要求较高的应用而设计。

6、比较ARM9与ARM7处理器的性能特点,试说明它们有何异同。(P55~56)

答:ARM7提供了非常好的性能-功耗比,它包含了Thumb指令集快速乘法指令和ICE调试技术的内核。ARM9处理器通过全新的设计,采用了更多的晶体管,能够达到两倍以上于ARM7处理器的

处理能力。ARM7内核是0.9MIPS/MHz的三级流水线和冯·诺伊曼结构,而ARM9内核是5级流水线,提供1.1MIPS/MHz的哈佛结构。 从ARM7到ARM9的性能提升还来源于存储器读写指令——load和store,以及互锁技术的应用。

7、简单介绍OMAP5912微处理器的特点和功能。(P59~60) 答:OMAP5912处理器是OMAP1510系列的一个分支,是由TI应用最为广泛的TMS320C55X DSP内核与低功耗、高性能的ARM926EJ-S微处理器组成的双核应用处理器,这两个内核通过一种专用的处理器内部通信机制相连接。OMAP5912的结构如图3-10所示。C55x系列可提供对低功耗应用的实时多媒体处理的支持;ARM926可满足控制和接口方面的处理需要。基于双核结构,OMAP5912具有极强的运算能力和极低的功耗,一方面,产品性能高、省电;另一方面,同其它OMAP处理器一样,采用开放式、易于开发的软件设施,支持广泛的操作系统,如Linux、Windows、WinCE、Nucleus、Palm OS、VxWorks等。可以通过API及用户熟悉且易于使用的工具优化其应用程序。

OMAP5912处理器的目标应用是: ? 需要密集信号处理的设备 ? 通讯终端 ? WAN 802.11X ? BlueTooth

? GSM,GPRS,EDGE ? CDMA

? 视频和图像处理(MPEG4,JPEG,Windows Media Video,etc.) ? 高级语言处理应用(text-to-speech,speech recognition) ? 音频处理(MPEG-1 Audio Layer3 [MP3],AMR,WMA,AAC,及其它GSM Speech Codecs) ? 图形和视频加速 ? 数据处理

8、常用的OMAP5912开发工具有哪些?(P60~61) 答:常用的OMAP5912开发工具有: (1)OMAP5912 Starter Kit (OSK)

Omap5912基本板,提供了完成设计与测试过程所需的所有软件,这包括一系列主板专用库、芯片专用库以及一套针对OMAP5912 Linux内核的Linux开发工具。

(2)MU-Q-VGA LCD Module for OMAP5912 OSK的LCD扩充套件,提供了LCD触摸屏。 (3)Accelerator Program for OMAP5912

针对omap5912OSK的Linux和WinCE 4.2 BSP和驱动程序软件包,方便易用,支持很多设备和扩展模块,如LCD、USB Client & Host、键盘、触摸屏、以太网、串口等设备。

(4)RAPID DEVELOPMENT KIT (RDK)

omap5912 OSK无线模块扩充套件。 (5)Portable Data Terminal Reference Design

基于omap5912的便携式数据终端(PDT)参考设计,一个完整的多媒体智能手机设计案例。相关应用包括导航、游戏、学习辅助、通话、娱乐等等。 ??

第4章 ARM微处理器的编程模型与指令系统

1、ARM微处理器有哪几种运行模式?其中哪些是特权模式,哪些又是异常模式?(P64)

答:ARM微处理器支持7种运行模式,分别为:用户模式;快速中断模式;外部中断模式;管理模式;数据访问终止模式;系统模式;未定义指令中止模式。除用户模式以外,其余的所有6种模式称之为非用户模式,或特权模式(Privileged Modes);而除去用户模式和系统模式以外的5种又称为异常模式(Exception Modes),常用于处理中断或异常。

2、ARM体系结构的存储器格式有哪几种?(P64~65)

答:ARM体系结构可以用两种方法存储字数据,称之为大端格式(big-endian)和小端格式(little-endian)。大端格式:字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中;小端格

式:低地址中存放的是字数据的低字节,高地址存放的是字数据的高字节。

3、ARM状态下和Thumb状态下寄存器的组织有何不同?(P69~70) 答:Thumb状态下的寄存器集是ARM状态下寄存器集的一个子集,程序可以直接访问8个通用寄存器(R7~R0)、程序计数器(PC)、堆栈指针(SP)、连接寄存器(LR)和CPSR。同时,在每一种特权模式下都有一组SP、LR和SPSR。在Thumb状态下,高位寄存器R8~R15并不是标准寄存器集的一部分,但可使用汇编语言程序受限制的访问这些寄存器,将其用作快速的暂存器。

4、简述CPSR各状态位的作用,并说明如何对其进行操作,以改变各状态位。(P67~68)

答:CPSR可在任何运行模式下被访问,它包含条件码标志位、中断禁止位、当前处理器模式标志位,以及其他一些相关的控制和状态位。

条件码标志位:

? N(Negative)当用两个补码表示的带符号数进行运算时,N=1表示运算的结果为负数;N=0 表示运算的结果为正数或零; ? Z(Zero)Z=1 表示运算的结果为零;Z=0表示运算的结果为非零;

? C(Carry)可以有4种方法设置C的值:① 加法运算(包括

比较指令CMN):当运算结果产生了进位时(无符号数溢出),C=1,否则C=0。② 减法运算(包括比较指令CMP):当运算时产生了借位(无符号数溢出),C=0,否则C=1。③ 对于包含移位操作的非加/减运算指令,C为移出值的最后一位。④ 对于其他的非加/减运算指令,C的值通常不改变。

? V(OVerflow)可以有2种方法设置V的值:① 对于加/减法运算指令,当操作数和运算结果为二进制的补码表示的带符号数时,V=1表示符号位溢出。② 对于其他的非加/减运算指令,V的值通常不改变。

CPSR的低8位(包括I、F、T和M[4:0])称为控制位,当发生异常时这些位可以被改变。如果处理器运行特权模式,这些位也可以由程序修改。

状态寄存器(PSR)中的其余位为保留位,当改变PSR中的条件码标志位或者控制位时,保留位不要被改变,在程序中也不要使用保留位来存储数据。保留位将用于ARM版本的扩展。

5、ARM体系结构所支持的异常类型有哪些?具体描述各类异常,在应用程序中应该如何处理?(P70~71)

答:ARM体系结构所支持的异常类型有复位、未定义指令、软件中断、指令预取中止、数据中止、外部中断请求、快速中断请求。具体地:

? 当处理器的复位电平有效时,产生复位异常,程序跳转到复位

异常处理程序处执行;

? 当ARM处理器或协处理器遇到不能处理的指令时,产生未定义指令异常。可使用该异常机制进行软件仿真;

? 软件中断异常由执行SWI指令产生,可用于用户模式下的程序调用特权操作指令。可使用该异常机制实现系统功能调用; ? 若处理器预取指令的地址不存在,或该地址不允许当前指令访问,存储器会向处理器发出中止信号,但当预取的指令被执行时,才会产生指令预取中止异常;

? 若处理器数据访问指令的地址不存在,或该地址不允许当前指令访问时,产生数据中止异常;

? 当处理器的外部中断请求引脚有效,且CPSR中的I位为0时,产生IRQ异常。系统的外设可通过该异常请求中断服务; ? 当处理器的快速中断请求引脚有效,且CPSR中的F位为0时,产生FIQ异常。

6、ARM指令有哪几种寻址方式?试分别叙述其各自的特点并举例说明。(P77)

答:ARM指令系统支持的基本寻址方式有7种:立即数寻址、寄存器寻址、寄存器间接寻址、基址变址寻址、多寄存器寻址、堆栈寻址、相对寻址。他们的特点分别是:

? 立即数寻址:操作数本身就在指令中给出。如:ADD R0,R0,#0x3f

? 寄存器寻址:指令中地址码给出的是寄存器编号。如:ADD R0,R1,R2

? 寄存器间接寻址:寄存器中的值作为操作数的地址,操作数本身存放在存储器中。如:ADD R0,R1,[R2]

? 基址变址寻址:将寄存器的内容与指令中给出的地址偏移量相加,从而得到一个操作数的有效地址,用于访问基址附近的存储器单元。如:LDR R0,[R1,#4]

? 多寄存器寻址:块拷贝寻址。如:LDMIA R0,{R1,R2,R3,R4}

? 堆栈寻址:用堆栈作为地址。如:STMFD SP! {R1-R7,LR}

? 相对寻址:以程序计数器PC的当前值为基地址,指令中的地址标号作为偏移量,将两者相加之后得到操作数的有效地址。如:BL NEXT

7、简述ARM指令集的分类。(P81)

答:ARM指令集总体分为六大类:数据处理指令、程序状态寄存器访问指令、Load/Store指令、跳转指令(转移指令)、异常中断指令、协处理器指令。

8、假设R0的内容为0x8000,寄存器R1、R2内容分别为0x01和0x10,存储器内容为空。执行下述指令后,说明PC如何变化?存储器及寄

可以在绝大多数8位、16位、32位以至64位微处理器、微控制器、数字信号处理器(DSP)上运行。 3)可固化(Romable)

?C/OS-II是为嵌入式应用而设计的,这就意味着,只要读者有固化手段(C编译、连接、下载和固化),?C/OS-II可以嵌入到读者的产品中成为产品的一部分。 4)可裁剪(Scalable)

可以只使用?C/OS-II中应用程序需要的那些系统服务。也就是说某产品可以只使用很少几个?C/OS-II调用,而另一个产品则使用了几乎所有?C/OS-II的功能,这样可以减少产品中的?C/OS-II所需的存储器空间(RAM和ROM)。这种可剪裁性是靠条件编译实现的。 5)占先式(Preemptive)

?C/OS-II是完全占先式的实时内核,?C/OS-II总是运行就绪条件下优先级最高的任务。 6)多任务

?C/OS-II可以管理64个任务,目前这一版本保留8个给系统。留给用户的应用程序最多可以有56个任务。赋予每个任务的优先级必须是不相同的,这意味着?C/OS-II不支持时间片轮转调度法(常用的非抢占式调度算法)。 7)可确定性

全部?C/OS-II的函数调用与服务的执行时间具有可确定性。 8)任务栈

每个任务有自己单独的栈,?C/OS-II允许每个任务有不同的栈空间,以便压低应用程序对RAM的需求。 9)系统服务

?C/OS-II提供很多系统服务,例如邮箱、消息队列、信号量、块大小固定的内存的申请与释放、时间相关函数等。 10)中断管理

中断可以使正在执行的任务暂时挂起,如果优先级更高的任务被该中断唤醒,则高优先级的任务在中断嵌套全部退出后立即执行,中断嵌套层数可达255层。

8、常用的linux操作系统采用怎样的内存管理机制和调度机制?(P130)

答:Linux内存管理程序通过映射机制把用户程序的逻辑地址映射到物理地址,在用户程序运行时,如果发现程序中要用的虚拟地址没有对应的物理内存时,就发出请页要求。如果有空闲的内存可供分配,就请求分配内存,并把正在使用的物理页记录在页缓存中;如果没有足够的内存可供分配,那么就调用交换机制,腾出一部分内存。为了支持虚拟存储器的管理,Linux系统采用分页(paging)的方式来载入进程。所谓分页即是把实际的存储器分割为相同大小的段,例如每个段1024个字节,这样1024个字节大小的段称为一个页面(page)。

Linux属于典型的多用户多任务操作系统。它采用分时技术,进

程交替执行,实现所谓的“假并行”。它主要有三种调度算法,一个是基于优先级的循环执行法,二是FIFO算法,三是传统的基于优先级的循环执行法。前两种调度算法都是软实时的,而第三种则并非实时的。

第6章 嵌入式Linux开发环境及其在ARM上的移植 1、试述嵌入式Linux系统移植的一般过程。(P141~142)

答:嵌入式系统的开发和应用层软件的开发不同,有其自身的特点,尤其在开发流程上有很大的不同。从大体上讲,Linux系统移植一般分为下面几步:

(1)开发环境的搭建

嵌入式系统移植过程中,目标机和宿主机往往在软硬件环境上有很大的不同,开发时常常在功能强大的宿主机上进行,这就形成了交叉开发环境的搭建与选择问题。同时由于宿主机和目标机在体系结构等方面的差异,编译时也需要采用交叉编译工具对目标代码进行编译,这样,才能使生成的可执行文件在目标机上能够执行。

(2)系统引导

在微处理器第一次启动的时候,会从预定的、固定的地址空间开始执行指令。一般的嵌入式系统中并没有PC机上的BIOS,而是由一种称为Bootloader的系统引导程序来完成上述功能,启动代码完全依赖于硬件,需要在系统移植中完成。

(3)内核引导

系统移植的开发人员还应当完成Bootloader和内核的衔接部分的移植以及I/O映射、存储器映射等与目标硬件平台相关的板级初始化和CPU自身初始化的移植工作。

(4)设备驱动程序

Linux内核源代码树中的相当大部分是各类驱动程序,在实际的开发过程中,也需要对相应的设备进行驱动,如LCD、网卡、触摸屏等等进行移植和编写。由于一般在Linux源码和相关社区中都拥有相当丰富的设备驱动源码资源,因此,设备驱动的任务主要是相近源码的移植修改工作。

(5)文件系统

在嵌入式Linux内核启动的最后阶段,将进行文件系统的加载。不同的嵌入式目标平台有不同的应用需求,需要根据具体情况实现对文件系统的移植工作。目前,常用的嵌入式文件系统有JFFS2、Cramfs、Romfs等。

2、Linux系统中常用的交叉编译工具有哪些?简述它们的功能和基本用法。(P143~153)

答:(1)GNU binutils是一套用来构造和使用二进制所需的工具集。建立嵌入式交叉编译环境,Binutils工具包是必不可少的,而且Binutils与GNU的C编译器gcc是紧密相集成的,没有binutils,gcc也不能正常工作。GNU binutils是一组开发工具,包括连接器、汇编

器和其他用于目标文件和档案的工具。

(2)GUN cc(GUN C Compiler,简称gcc)是GUN项目的C编译器套件,能够编译用C、C++、Objective C编写的程序。

(3)make工具通过一个称为makefile的文件来完成并自动维护编译工作。

(4)glibc 是提供系统调用和基本函数的C库,比如open,malloc,printf等等。所有动态连接的程序都要用到它。它是编译Linux系统程序很重要的组成部分。

(5)gdb是一个用来调试C和C++程序的调试器(Debugger),它能使用户在程序运行时观察程序的内部结构和内存的使用情况。gdb的功能主要是监视程序中变量的值、设置断点以使程序在指定的代码行上停止执行、支持单步执行等。

3、如何分步编译和安装交叉编译环境所需要的库和源代码?试着自己构建嵌入式Linux系统交叉编译环境。(P156~160) 答:[略]

4、5题应在第九章,此处为作者疏漏(见第九章习题)

6、Linux操作系统的移植工作主要分为哪几个方面?其中内核功能模块的裁剪主要有哪几种方法?(P162~164)

答:对Linux操作系统的移植工作主要分为两个方面,一方面是

针对硬件特点对源代码的修改,比如内核的启动部分、存储设备的大小、具体的驱动问题等等;另一方面是功能模块的裁剪,主要是对内核功能的配置,包括支持的文件类型、外设模块等等。

总体上讲,针对硬件的修改有两种方法:

(1)对一种全新的硬件平台开展移植工作时,需采用“自底向上”的设计方法从头设计,即从硬件的需求考虑逐步地采用分析、设计、编码、测试。

(2)大多数情况下,是在前人工作的基础上修改己有的代码。Linux己经可以在多种体系结构中运行,可以参考相近的体系结构的代码,修改与目标硬件平台不同的部分即可。

嵌入式Linux内核功能模块的裁剪主要有三种方法: (1)使用Linux自身的配置工具,编译定制内核。 (2)修改内核源代码,进行内核裁剪。 (3)基于系统调用关系,进行内核裁剪

7、如何使用Linux自身的配置工具编译定制内核?(P169)

答:配置完内核之后,内核仍然以源代码的方式存在,不能直接下载到嵌入式系统中运行,因此,必须对内核进行编译,生成最终在目标板上运行的可执行代码。

编译内核分以下三步进行:

(1)执行以下命令,正确设置编译内核所需的附属文件,进行依赖性编译:# make dep

(2)执行以下命令,清除以前构造内核时产生的所有目标文件、模块文件和一些临时文件:# make clean

(3)执行以下命令,生成新的可执行内核映像文件:# make zImage

完成上述命令之后,就会在/arch/arm/boot/下生成一个自己定制的内核映像文件了,系统文件名可以任意取,如zImage.rom。

8、什么是文件系统?常用的嵌入式文件系统有哪些?(P169~170)

答:文件系统是指在一个物理设备上的任何文件组织和目录,它构成了Linux系统上所有数据的基础,Linux程序、库、系统文件和用户文件都驻留其中,因此,它是系统中庞大复杂且又是最为基本和重要的资源。通常对于一个嵌入式系统,仅包含内核是不够的,还必须有文件系统的支持。

Linux支持的文件系统有很多种,比如ext2(LinuxExtended-2)、minix文件系统、msdos(最初的FAT文件系统)、ntfs(WindowsNT文件系统)、nfs(网络文件系统)、hpft(OS/2高性能文件系统)、ncpfs(NovellNetWare文件系统)、affs Amiga(快速文件系统)等等。

9、如何构建一个嵌入式Linux文件系统?(P172)

答:要构建一个小型的Linux文件系统,就需要决定文件系统中哪些部分要保留,哪些部分可以裁减。首先应该保留那些保证系统运行的最基本的文件和目录,再通过对系统功能的分析,决定哪些模块

是可以裁减的。

一个最小的文件系统必须包括以下的内容:程序函数库、库函数文件的链接、/bin/sh(shell)、最基本的设备文件。

但是,这些文件目录组成的最基本的文件系统只能运行shell,不能完成其它任何的应用程序。要完成一些基本的功能还需要以下的一些文件:init程序、系统启动设置、基本的应用程序、设备文件、显示系统信息的虚拟文件系统、其它文件系统挂载目录、系统启动时执行的脚本、压缩工具等。

第7章 linux下设备驱动程序的开发设计

1、设备驱动程序在大多数嵌入式系统中起着重要作用,因为它们提供了 应用程序 和 设备 之间的软件层。

2、设备驱动程序通常包含 中断处理程序 和 设备服务子程序 两部分。

3、嵌入式系统中_____A____、___C_______、_____D___等都属于字符设备,典型的块设备有_____B_____、____E______等。

A.按键 B.硬盘 C.触摸屏 D.手写板 E.CD-ROM

4、系统中不同的设备有_____A_____主设备号,主设备号 A 设备使用____A______驱动程序。 A.相同的 B.不同的

5、CS8900A有两种工作模式:MEMORY模式和IO模式。

6、如何理解设备管理的“设备无关性”概念?(P174)

答:在Linux/uclinux的框架结构中,和设备相关的处理可以分为两个层次——文件系统层和设备驱动层。设备驱动层屏蔽具体设备的细节,文件系统层则向用户提供一组统一的、规范的用户接口。在嵌入式操作系统下的设备驱动程序主要是控制和管理下层物理设备的硬件控制器,同时为上层应用提供统一的、与设备无关的系统调用服务,这种设备管理方法称为“设备无关性”。

7、按模块化设计,一个典型的Linux设备驱动程序应包含哪几部分?在Linux操作系统中如何实现一个驱动程序的开发?(P177)

答:一个典型的Linux设备驱动程序应包含以下几部分代码:驱动程序模块的注册与注销函数、设备的打开、关闭、读、写及需要的其他操作函数、设备的中断服务程序。

在Linux操作系统中实现一个驱动程序的开发,必须按照如下步骤进行:设备或模块的初始化;实现该文件操作接口;注册了设备中断;编写中断服务程序;文件读写操作。

8、Linux中的设备可以分为哪几类,各有何特点?(P177~179)

答:Linux中的设备可以分为三类:字符设备、块设备和网络设备。各自的特点是:字符设备是指数据处理以字节为单位按顺序进行的设备,它没有缓冲区,不支持随机读写。在对字符设备发出读/写请求时,实际的硬件I/O一般就紧接着发生了。块设备是指那些在输入/输出时数据处理以块为单位的设备,它一般都采用了缓存技术,支持数据的随机读写。网络设备面向的上一层不是文件系统层而是网络协议层,设备节点只有在系统正确初始化网络控制器之后才能建立。内核和网络设备驱动程序间的通信,与字符设备驱动程序、块设备驱动程序与内核间的通信也是完全不一样的。在Linux中,整个网络接口驱动程序的框架可分为四层,从上到下分别为协议接口层、网络设备接口层、提供实际功能的设备驱动功能层、以及网络设备和网络媒介层。

9、如何理解驱动程序的设备文件接口?(P182) 答:略。

10、详细描述在Linux操作系统下CS8900A网络芯片驱动程序的实现。(P194)

答:Linux操作系统下CS8900A网络芯片驱动程序的实现按照如下步骤进行:

(1)初始化CS8900A芯片

对于CS8900A芯片,初始化函数是通过cs89x0_probe()和cs89x0_probe1()函数来实现。 int cs89x0_probe(struct device *dev) {

int base_addr = CS8900_BASE;

return cs89x0_probe1(dev,base_addr); }

其中CS8900_BASE是I/O被映射到的基地址。 static int cs89x0_probel(struct device *dev, int ioaddr) {

irq2dev_map[0] = dev; ……

/* 初始化寄存器,建立片选和芯片工作方式*/

*(volatile unsigned char *)0xfffff42b |= 0x01; /* output /sleep */

*(volatile unsigned short *)0xfffff428 |= 0x0101; /* not sleeping */ *(volatile unsigned char *)0xfffff42b &= ~0x02; /* input irq5 */ *(volatile unsigned short *)0xfffff428 &= ~0x0202;/* irq5 fcn on */ *(volatile unsigned short *)0xfffff102 = 0x8000; /* 0x04000000 */ *(volatile

unsigned

short

*)0xfffff112

=

0x01e1

/*128k,2ws,FLASH,en*/

??

/* 初始化设备结构*/ if (dev->priv == NULL){

dev->priv = kmalloc(sizeof(struct net_local),GFP_KERNEL);

memset(dev->priv, 0, sizeof(struct net_local)); }

dev->base_addr = ioaddr;

lp = (struct net_local *)dev->priv; ??

/* 取得芯片类型*/

rev_type = readreg(dev, PRODUCT_ID_ADD); lp->chip_type = rev_type &~ REVISON_BITS;

lp->chip_revision = ((rev_type & REVISON_BITS) >> 8) + 'A'; lp->send_cmd = TX_AFTER_ALL; ??

/*注册接口方法*/ dev->open = net_open; dev->stop = net_close;

dev->hard_start_xmit = net_send_packet; dev->get_stats = net_get_stats;

dev->set_multicast_list = &set_multicast_list;

dev->set_mac_address = &set_mac_address; ??

ether_setup(dev); }

(2)编写设备打开函数与关闭函数

打开和关闭一个网络接口是由ifconfig命令来完成的。当使用ifconfig为一个接口赋地址时,它完成两项工作。第一,它通过ioctl(SIOCSIFADDR)(即Socket I/O Control Set InterFace ADDRess)来赋地址;第二,它通过ioctl(SIOCSIFFLAGS)(即Socket I/O Control Set InterFace FLAGS)对dev->flag中的IFF_UP置位来打开接口。

CS8900A是一个ISA设备,不支持共享中断,但是这在嵌入式系统外设比较少的情况下对系统的性能没什么影响。另外,在接口可以和外界通信以前,还需要将芯片上的硬件地址复制到dev->dev_addr指针指向的空间上,这个工作也可以在初始化函数cs89x0_probe1中完成。

设备打开函数net_open的基本流程如下:

① 没有在初始化函数中注册中断号和I/O地址,则在设备打开时要进行注册;

② 将该设备挂到irq2dev_map中。若使用基于中断的数据接收方式,以后就可以通过中断号和irq2dev_map数组直接查找相应的设备了;

③ 初始化物理设备的寄存器;

④ 设置接口相应的dev的私有数据结构(dev->priv)中的一些字段;

⑤ 设置dev中的tbusy,interrupt和start等字段。 设备关闭函数net_close()与打开函数动作相反。 (3)数据包发送/接收函数的编写

在CS8900A芯片的I/O模式下,数据包的发送流程

① 发送一个传输命令到TxCMD端口(I/O base + 0004h),使芯片进入发送状态;

② 将要发送数据帧的长度发送到TxLength端口(I/O base + 0006h);

③ 通过信息包指针端口(I/O base +000Ch)读取Burst寄存器(寄存器18),判断Rdy4TxNOW位(第8位)的值。如果Rdy4TxNOW值为1,则跳到第4步;如果Rdy4TxNOW位的值为0,驱动程序将等待一段时间,再判断Rdy4TxNOW的值,直到它为1为止。另外,如果程序中Rdy4TxiE(寄存器BufCFG的第8位)被置为1,当CS8900A的发送缓冲区可写时,Rdy4Tx(寄存器BufEvent的第8位)将被置为1,并触发一个中断,这时候就不需要判断Rdy4TxNOW了;

④ 程序发送函数将反复执行写指令,将数据发送到接收/发送数据端口(I/O base +0000h)。

net_rx()函数的操作流程如下: ① 申请skb缓存区存储新的数据包; ② 从硬件中读取新到达的数据;

③ 调用函数netif_rx(),将新的数据包向网络协议的上一层传送; ④ 修改接口的统计函数。 4)中断处理函数的编写

一般的中断服务程序的基本流程如下: ① 确定发生中断的具体网络接口

② 打开标志位dev->interrupt,表示本服务程序正在被使用; ③ 读取中断状态寄存器,根据寄存器判断中断发生的原因。有两种可能,一种是有新数据包到达;另一种是上次的数据传输已完成。

④ 若是因为有新数据包到达,则调用接收数据包的子函数net_rx();

⑤ 如果中断是上次传输引起,则通知协议的上一层,修改接口的统计信息,关闭标志位tbusy,为下次传输做准备;

⑥ 关闭标志位interrupt。

CS8900A驱动程序的中断处理函数的实现代码如下:

void cs8900_interrupt(int irq, void *dev_id, struct pt_regs * regs) {

struct device *dev = (struct device *)(irq2dev_map[/* FIXME */0]);

struct net_local *lp; int ioaddr, status; dev = irq2dev_map[0]; dev->interrupt = 1;

ioaddr = dev->base_addr;

lp = (struct net_local *)dev->priv;

while((status = readword(dev,ISQ_PORT))){ switch(status & ISQ_EVENT_MASK){ 类型*/

case ISQ_RECEIVER_EVENT: net_rx(dev); break;

case ISQ_TRANSMITTER_EVENT: lp->stats.tx_packets++; dev->tbusy = 0; mark_bh(NET_BH);

/*通知上层*/

/*获取信息包*/ /*判断中断

if((status & TX_OK) == 0) lp->stats.tx_errors++; if

status

&

TX_LOST_CRS

lp->stats.tx_carrier_errors++; if

status

&

TX_SQE_ERROR

lp->stats.tx_heartbeat_errors++; if

status

&

TX_LATE_COL

lp->stats.tx_window_errors++;

if(status & TX_16_COL) lp->stats.tx_aborted_errors++; break;

case ISQ_BUFFER_EVENT:

if(status & READY_FOR_TX){ dev->tbusy = 0; mark_bh(NET_BH);

/*通知上层*/

}

if(status & TX_UNDERRUN){ lp->send_underrun++;

if(lp->send_underrun > 3) lp->send_cmd TX_AFTER_ALL; } break;

case ISQ_RX_MISS_EVENT:

lp->stats.rx_missed_errors += (status >>6); break;

case ISQ_TX_COL_EVENT:

lp->stats.collisions += (status >>6); break; } }

dev->interrupt = 0; return;}

= 第8章 用户图形接口GUI

1、简述嵌入式系统对GUI的基本要求。(P206)

答:GUI在嵌入式系统或者实时系统中的地位将越来越重要,这些系统对GUI的基本要求包括:轻型、占用资源少、高性能、高可靠性、可配置、可移植等特点。 ? 体积小

谈到“嵌入”,真的是除了小还是小,现在PC的存储器动辄就是以GB论,对于嵌入式的硬件来说根本是不可能的奢求,大部分的嵌入式系统用的Flash大都以16MB或者32MB为主,与PC简直是天壤之别,所以这样苛刻的环境底下只有尽量减小软件的体积了。 ? 消耗系统资源少

对于手持式设备如PDA、手机等,最注重的就是系统资源及省电功能,在省电的前提下CPU速度就不能太高,运算速度越快越耗电,而且散热也会成为很大的问题。对于非手持式设备如Set Top Box、部份WebPAD等,这类系统主要考虑的是硬件的成本,所以嵌入式系统的CPU速度不如PC机,存储容量也小得多,因此GUI系统面临着另一种挑战,必须谨慎使用系统资源,不能有任何无谓的浪费。 ? 系统独立

嵌入式系统的一大特色就是硬件差异很大,不像PC机全部都是X86架构。尽管底层硬件差异很大,上层的GUI系统仍然需要表现出统一的界面,所以嵌入式GUI系统必须尽量与硬件划清界限,最好的设计是在GUI系统与硬件中间有一层系统负责隔离,在这方面,

Linux Kernel已经可以扮演这个角色。 ? 可配置、可移植

嵌入式系统往往是一种定制设备,它们对GUI的需求也各不相同。举个简单的例子,有的系统只要求一些图形功能,而有些系统要求完备的GUI支持。因此,GUI自身也必须是可定制的。

2、简述目前常见的嵌入式GUI系统的特点。(P207~210)

答:目前主流的嵌入式GUI系统主要有MicroWindows、Qt/Embedded、Tiny-X Windows、OpenGUI和MiniGUI等。由于嵌入式系统之间在特定应用环境下的差异,这些GUI系统在其结构、实现方法、使用方法、应用范围等方面也都有各自的特点。

(1)MicroWindows

MicroWindows是一个著名的开源嵌入式GUI软件,目的是把现代图形视窗环境引入到运行Linux的小型设备和平台上,作为X Windows的替代品。它支持多线程,但必须使用PThread库。MicroWindows是一个典型的基于Client/Server体系结构的GUI系统,采用分层结构。 (2)OpenGUI

OpenGUI分为三层:最低层是由汇编编写的快速图形引擎;中间层提供了图形绘制API,包括线条、矩形、圆弧等,并且兼容于Borland的BGI API;第三层用C++编写,提供完整的GUI对象集。OpenGUI采用LGPL条款发布。OpenGUI比较适合于基于x86平台

的实时系统,可移植性稍差,目前的发展也基本停滞。 (3)Tiny-X Windows

以X Windows System搭配Tiny-X Server架构来说,最大的优点就是弹性与开发速度。因为与桌面的X Windows架构相同,因此相对于很多以Qt、GTK+、FLTK等开发的软件来说,移植更容易。但因为X Windows系统的运行还需要其他程序和库的支持,包括X Windows管理器、XLib、建立在XLib之上的GTK和Qt等函数库,因此,即使是Tiny-X Windows系统,在运行期间所占用的系统资源也很多,国外使用Tiny-X Windows的环境也多是比较高端的平台。此外,Tiny-X Windows是一个多进程的GUI,它无法运行在很多仅支持多任务(线程)的RTOS上,因此它对于操作系统的兼容性较差,实时性不高。

(4)Qt/Embedded

Qt/Embedded延续了Qt在X上的强大功能,但在底层摒弃了XLib,仅采用FrameBuffer作为底层图形接口。同时,将外部输入设备抽象为keyboard和mouse等输入事件,底层接口支持键盘、鼠标、触摸屏以及用户自定义的设备等。 (5)MiniGUI

MiniGUI是由北京飞漫软件技术有限公司主持的自由软件,遵循GPL条款发布(1.2.6及之前的版本以LGPL条款发布),其目标是为实时嵌入式Linux系统建立一个快速、稳定和轻量级的图形用户界面支持系统。

3、比较MicroWindows、Qt/Embedded和MiniGUI的功能特性。(P210) 答:见表8-1。[略]

4、Qt/Embedded的图形引擎实现基础是什么,其实现结构是怎样的?(P214)

答:Qt/Embedded的底层图形引擎是基于FrameBuffer之上的。FrameBuffer是在Linux内核架构版本2.2以后推出的标准显示设备驱动接口。采用mmap系统调用,可以将FrameBuffer的显示缓存映射为可以连续访问的一段内存指针。

FrameBuffer驱动程序的实现分为两个方面:一方面是对LCD以及其相关部件的初始化,包括画面缓冲区的创建和对DMA通道的设置;另一方面是对画面缓冲区的读写,具体的代码为read、write、lseek等系统调用接口函数。至于将画面缓冲区的内容输入到LCD显示屏上,则是由硬件自动完成的,对于软件来说是透明的。

5、简述Qt/Embedded窗口系统的工作原理。(P215)

答:Qt/Embedded的窗口系统采用一种客户/服务器体系结构。一个典型的嵌入式Qt窗口系统一般包括:一个服务器进程、一个或多个客户进程。服务器进程负责为客户和其本身分配显示区域、生成鼠标和键盘事件,它通常包含那些启动客户的用户界面,例如应用程序发射台。而客户进程则通过与服务器通信来申请显示区域,接收鼠标

和键盘事件。客户可以直接访问所分配的显示区域,以便为用户提供GUI服务。

服务器和客户通过共享内存的方式来传递所有分配显示区域上的信息,如果需要的话还可以维护一个软光标。

6、Qt/Embedded中信号和槽的概念分别是什么?(P216)

答:信号(signal)和槽(slot)是一种高级接口,应用于对象之间的通信,它是QT的核心特性,也是QT区别于其它工具包的重要地方。

当对象改变其状态时,信号就由该对象发射(emit)出去,这就是对象所要做的全部事情,对象并不知道另一端是谁在接收这个信号。这是真正的信息封装,它确保对象被当作一个真正的软件组件来使用。

槽用于接收信号,但它们是普通的对象成员函数。一个槽并不知道是否有任何信号与自己相连接。而且,对象并不了解具体的通信机制。

7、举例说明信号和槽是如何连接的。(P217~218)

答:信号与槽的连接模型如下图所示:

Object1signal1signal2connect(Object1, signal1, Object2, slot1)Connect(Object1, signal1, Object2, slot2)Object2signal1slot1slot2Object3signal1slot1connect(Object1, signal2, Object4, slot1)Object4slot1slot2slot3connect(Object3, signal1, Object4, slot3) 通过调用QObject对象的connect函数来将某个对象的信号与另外一个对象的槽函数相关联,这样当发射者发射信号时,接收者的槽函数将被调用。这个函数的作用就是将发射者sender对象中的信号signal与接收者receiver中的member槽函数联系起来。

8、自己动手建立QT/E开发环境(2.x或3.x系列)。(P220~222) 答:[略]

9、简述Qt/Embedded应用系统的基本开发流程。(P223)

答:基于Qt/Embedded开发一个嵌入式应用的一般过程如下图所示。

选定嵌入式硬件平台在工作的机器上安装Qt/Embedded工具开发包根据目标硬件平台,交叉编译Qt/Embedded的库在工作的机器上进行应用程序的编码、调试根据目标硬件平台,交叉编译嵌入式应用在嵌入式硬件设备上调试运行应用有问题调试有无问题无发布嵌入式应用

从图中可以看到,应用软件开发工作基本上是在工作站或是PC机上完成的。在工作站或PC机上调试运行嵌入式应用,并将输出结果显示在一个仿真小型设备显示终端的模拟器上。在开发的后期,要根据选择的嵌入式硬件平台,将嵌入式应用编译链接成适合在目标平台上运行的二进制目标代码。另外由于应用系统使用到了Qt/Embedded的库,所以还要对Qt/Embedded库的源代码进行交叉编译,然后链接成为适合在目标平台上使用的二进制目标代码库。当一个Qt/Embedded应用被下载到目标平台上,并能够可靠运行时,一个开发过程才宣告结束。

10、试说明在Qt/Embedded中鼠标类设备和触摸屏设备的异同点。(P226)

答:Qt/Embedded中没有特别针对触摸屏的设备接口,不过触摸

屏和鼠标类设备在功能上基本是一致的,因此,在Qt库中一般把触摸屏模拟成鼠标设备来实现对触摸屏设备的操作。由于触摸屏在实现原理上存在着A/D量化误差的问题,因此所有的触摸屏接口实现类需要从特殊的类QCalibratedMouseHandler继承,并获得校正功能。另外,触摸屏和鼠标底层接口的不一样,会造成对上层接口的不一致。例如,从鼠标驱动接口中几乎不会得到绝对位置信息,一般只会得到相对移动量。鼠标接口需要考虑移动加速度,而触摸屏接口则几乎是清一色的绝对位置信息和压力信息。针对此类差别,Qt/Embedded将同一类设备的接口部分也给予区别和抽象。

第9章 基于OMAP5912的开发应用实例 1、如何构建基于OMAP5912的嵌入式开发平台。 答:[略]

2、嵌入式Linux系统的启动流程分哪几个层次?(P244)

答:一般来说,一个嵌入式Linux系统的启动可以分为四个层次: (1)引导加载程序:Bootloader和包括固化在固件中的boot代码(可选项)两大部分。

(2)Linux内核:针对特定的嵌入式系统专门定制的Linux内核以及内核的启动参数。特定于OMAP平台,选用麦克泰公司的Montavista Linux。

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

Top