嵌入式系统课后复习答案

发布时间 : 星期四 文章嵌入式系统课后复习答案更新完毕开始阅读

? ? ? ? ?

软件中断异常由执行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 ?

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

答:(1)R0的内容为空,0X8004的内容为0x01,0X8008的内容为0x10. (2)R0的内容为0x01,0X8004的内容为0x10.

第五章

3、说明嵌入式操作系统进程调度的几种策略,并说出不同之处和优缺点。(P105~108) 答:实时调度方法大致可以划分为以下几类:

离线和在线调度:离线调度算法具有确定性,但缺乏灵活性,适用于那些特性能够预先确定,且不容易发生变化的应用。在线调度算法的调度信息则在系统运行过程中动态获得,在线调度算法在形成最佳调度决策上具有较大的灵活性。

抢占和非抢占调度:在抢占式调度算法中,正在运行的任务可能被其他任务所打断,抢占式调度算法,使关键任务能够打断非关键任务的执行,确保关键任务的截止时间能够得到满足,抢占式调度算法要更复杂些,且需要更多的资源,并可能在使用不当的情况下会造成低优先级任务出现长时间得不到执行的情况。非抢占式调度常用于那些任务需要按照预先确定的顺序进行执行,且只有当任务主动放弃CPU资源后,其他任务才能得到执行的情况。

静态和动态调度:在静态调度算法中,任务的优先级需要在系统运行前进行确定,且在运行过程中不会发生变化。在动态调度算法中,任务的优先级可根据需要进行改变,也可能随着时间按照一定的策略自动发生变化。

4、嵌入式系统中进程间通信主要采用哪几种形式?(P110)

答:嵌入式系统中进程间通信主要采用两种形式:共享内存和消息传递。二者在逻辑上没有什么区别,进程通信采用哪种方式,主要依赖实际需要。进程间通信也可以采用信号和管道的方式。

6、嵌入式操作系统中的内存管理功能有哪些?并做简要阐述。(P120) 答:嵌入式操作系统中的内存管理功能有:

1)虚拟内存空间:操作系统采用虚拟内存功能使系统显得它有比实际大得多的内存空间,虚拟内存可以比系统中的物理内存大许多倍。

2)内存保护:系统中每个进程有自己的虚拟地址空间,这些虚拟地址空间相互之间完全分离。因此运行一个应用的进程不会影响其他的进程。同样,硬件的虚拟内存机制允许内存区域被写保护,这样保护了代码和数据不被恶意应用重写。

3)内存映射:用来把映像和数据文件映像到一个进程的地址空间。在内存映射中,文件的内容被直接链接到进程的虚拟地址空间。

4)公平物理内存分配:内存管理子系统分配给系统中运行的每个进程公平的一份系统物理内存。

5)共享虚拟内存:允许进程拥有分隔的虚拟地址空间,但有时还需要进程共享内存。如进程间通信需要共享内存。

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

答:Linux内存管理程序通过映射机制把用户程序的逻辑地址映射到物理地址,在用户程序运行时,如果发现程序中要用的虚拟地址没有对应的物理内存时,就发出请页要求。如果有空闲的内存可供分配,就请求分配内存,并把正在使用的物理页记录在页缓存中;如果没有足够的内存可供分配,那么就调用交换机制,腾出一部分内存。为了支持虚拟存储器的管理,Linux系统采用分页(paging)的方式来载入进程。

Linux操作系统主要有三种调度算法,一个是基于优先级的循环执行法,二是FIFO算法,三是传统的基于优先级的循环执行法。前两种调度算法都是软实时的,而第三种则并非实时的。

第五章小结

?

进程是可并发执行的、具有独立功能的程序在一个数据集合上的运行过程,是操作系统进行资源分配和保护的基本单位。一个进程可以简单地认为是一个程序在系统内的唯 一执行。 ?

不论哪种操作系统,进程的基本调度状态可归为3种:就绪状态、运行状态和阻塞状态。系统总是在处于就绪状态的进程里选择一个就绪进程转换为运行状态。这个在就绪进程中选择一个进程,并使之运行的工作就叫进程调度,这是操作系统的一项重要任务。 ? ?

进程调度应使用恰当的调度算法,以确保公平。实时调度方法大致可以划分为以下4类:离线和在线调度、抢占式和非抢占式调度、静态和动态调度、最佳和试探性调度。 嵌入式系统中进程间通信主要采用2种形式:共享内存和消息传递。也可以采用信号和管道的方式。信号主要用于向一个或多个进程发异步事件信号,信号实际上是一个中断的模拟,它不仅可以由硬件产生,也可以由软件产生。管道是单向的字节流,它可以把

一个进程的标准输出与另一个进程的标准输入连接起来。 ? ?

广义的中断通常被分为中断、自陷和异常(exception)等类别。

在实时多任务系统中,中断服务程序通常包括3个方面的内容:①中断前导:保存中断现场,进入中断处理;②用户中断服务程序:完成对中断的具体处理;③中断后续:恢复中断现场,退出中断处理。 ? ?

一个完善的内存管理其主要功能有:虚拟内存空间、内存区域写保护、内存映射、公平物理内存分配和共享虚拟内存。

Linux系统是一个多用户多任务操作系统,支持分时处理和软实时处理,并带有微内核特征(如模块加载/卸载机制),具有很好的定制特性。Linux内存管理程序通过映射机制把用户程序的逻辑地址映射到物理地址。为了支持虚拟存储器的管理,Linux系统采用分页(paging)的方式来加载进程。 ?

Linux进程状态有5种,分别为运行态、可唤醒态、不可换形态、僵死状态和停滞状态。 Linux系统采用进程控制块负责记录和跟踪进程在系统中的全部信息。 ?

Linux支持多种进程间通信机制。其中比较重要的5种是信号、管道、信号量、消息列队和共享内存。

第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的功能主要是监视程序中变量的值、设置断点以使程序在指定的代码行上停止执行、支持单步执行等。

4、在嵌入式系统中使用Bootloader有哪些优点?(P245)

答:大多数嵌入式系统还是采用了引导加载程序Bootloader,而不让可执行映像在EEPROM或FLASH中就地执行。这样做是出于几个方面的考虑:

(1)效率方面的考虑

虽然CPU可以在ROM或FLASH空间就地执行操作系统(包含应用软件)的映像,但是ROM和FLASH的速度往往比不上RAM。所以先把映像从ROM或FLASH空间搬运到RAM空间,然后在RAM空间中运行这个映像,有利于提高系统的运行效率。

(2)操作系统的多样性

一方面嵌入式系统可以采用很多不同种类的操作系统,同一种操作系统也可以有不同的版本。而且,嵌入式系统的应用软件又常常与操作系统连成一体,这就更增加了系统映像的多样性。另一方面,嵌入式系统的硬件提供商所面对的通常是二次开发商而不是最终用户,往往并不清楚最终用的是什么操作系统,或者手中并无目标操作系统的映像。所以,最好的办法是先在硬件中装上一个引导加载程序,而让二次开发商提供具体的操作系统映像,这样就为采用不同版本,甚至完全不同的操作系统(以及应用程序)映像提供了灵活性。

(3)存储地与执行地分离 特别是在嵌入式系统的调试阶段,更换系统的可执行映像是很频繁的事情,此时需要把新的可执行映像写入相应的EPROM或FLASH芯片中去。如果让可执行映像就地运行,那就变成要把新的映像覆盖到正在执行的老的映像上,那样当然会带来一些技术上的问题。这说明映像的存储地与执行地应该分离。

(4)调试/排错方面的考虑

调试/排错方面的考虑也要求在RAM中执行系统映像。嵌入式软件的开发在前期可以采用一些模拟、仿真的调试/排错手段,可是最终总得要“来真格”的,到实际的运行环境中考察、调试。如果目标程序在ROM或FLASH中就地运行,就无法通过这种方法设置断点了。

(5)嵌入式系统独特的开发模式

联系合同范文客服:xxxxx#qq.com(#替换为@)