2016~2017(1)《嵌入式系统》研究生试卷(开卷)从下列题目中任选10题作答,每题十分,满分100分。1、对于操作系统,什么是调度?简述抢占式调度、非抢占式调度的优缺点。答:调度:调度(schedulers)是内核的主要职责之一,就是决定该轮到哪个任务运行了。多数实时内核是基于优先级调度法的。每个任务根据重要程度的不同,被赋予一定的优先级。基于优先级的调度法是指,CPU总是让处于就绪态的,优先级最高的任务先运行。基于优先级的内核有2种类型:不可剥夺型和可剥夺型。优缺点:非抢占式:让进程运行直到结束或阻塞的调度方式容易实现适合专用系统,不适合通用系统抢占式:允许将逻辑上可继续运行的在运行过程暂停的调度方式可防止单一进程长时间独占CPU系统开销大(降低途径:硬件实现进程切换,或扩充主存以贮存大部分程序)2.嵌入式系统中经常要用到无限循环,你有几种用C语言实现无限循环的方法?进一步,你更喜欢哪种方法,为什么?答:while(1){}for(;;){}Loop:...gotoLoop;一般for(;;)性能更优for(;;){}这两个;;空语句,编译器一般会优掉的,直接进入死循环while(1){}每循环一次都要判断常量1是不是等于零,在这里while比for多做了这点事不过从汇编的角度来说,都是一样的代码。3.在C语言中,关键字static的作用是什么?答:1用于全局变量定义时。全局变量定义时加上static修饰,表示该变量为静态全局变量。作用域为当前文件。2用于函数定义或声明。任意函数的定义或声明中包含了static修饰,表示该函数为静态函数,只能在本文件中被调用。3用于局部变量定义。局部变量定义时,带有static关键字,表示其为静态局部变量,只被初始化一次,之后每次调用函数时,该变量值为上次函数退出时的值。即,改变量的生存周期被扩展到整个程序运行时间段内。4.嵌入式系统经常具有要求程序员去访问某特定的内存位置的特点。例如在某工程中,要求设置一绝对地址为0x78AB的整型变量的值为0xaa66。编译器是一个纯粹的ANSI编译器。写一段代码去完成这一任务。答:int*ptr;ptr=(int*)0x67a9;*ptr=0xaa55;5.I/O接口要解决什么问题?有什么I/O编址方式及各种编制方式的优缺点?答:I/O接口是一电子电路(以IC芯片或接口板形式出现),其内有若干专用寄存器和相应的控制逻辑电路构成。它是CPU和I/O设备之间交换信息的媒介和桥梁。有两种,即独立编址和统一编址。1.独立编址(专用的I/O端口编址)----存储器和I/O端口在两个独立的地址空间中(1)优点:I/O端口的地址码较短,译码电路简单,存储器同I/O端口的操作指令不同,程序比较清晰;存储器和I/O端口的控制结构相互独立,可以分别设计(2)缺点:需要有专用的I/O指令,程序设计的灵活性较差2.统一编址(存储器映像编址)----存储器和I/O端口共用统一的地址空间,当一个地址空间分配给I/O端口以后,存储器就不能再占有这一部分的地址空间(1)优点:不需要专用的I/O指令,任何对存储器数据进行操作的指令都可用于I/O端口的数据操作,程序设计比较灵活;由于I/O端口的地址空间是内存空间的一部分,这样,I/O端口的地址空间可大可小,从而使外设的数量几乎不受限制6.ARM的数据存储模式有大端模式和小端模式两种。大端模式是指字数据的高位字节存储在低地址中,字数据的低字节则存放在高地址中;小端模式是指字数据的高位字节存储在高地址中,字数据的低字节则存放在低地址中。ARM默认的存储模式是传统的小端模式。假设存储起始地址为0x67a9,字数据0x783C1A24在大端模式下的存储结果是什么?答:内存地址ox67a9ox67aaox67abox67ac存放内容ox78ox3Cox1Aox247.和一般计算机应用软件相比,嵌入式软件主要有哪些特点?答:1.系统内核小。2.专用性强。3.系统精简。4.高实时性的系统软件(OS)是嵌入式软件的基本要求。5.嵌入式软件开发要想走向标准化,就必须使用多任务的操作系统。6.嵌入式系统开发需要开发工具和环境。软件要求固化存储;软件代码要求高质量、高可靠性;软件系统的高实时性是基本要求;嵌入式系统软件需要实时多任务操作系统开发平台;在嵌入式系统的软件开发工程中,采用C语言是最佳选择。8.μC/OS-Ⅱ任务级的调度由函数OSSched()完成,中断级的调度由函数OSIntExt()完成。试分析函数OSSched()阴影部分代码的含义。答:9.要使μC/OS-Ⅱ能正常运行,处理器必须具备的哪些条件?答:处理器的C编译器能产生可重入代码;在程序中用C语言就可以打开或者关闭中断;处理器支持中断,并且能产生定时中断(通常在10——1000Hz之间);处理器支持能够容纳一定量数据的硬件堆栈(达几千字节);处理器有将堆栈指针和其他CPU寄存器存储和读出到堆栈(或者内存)的指令。10.数据声明(Datadeclarations)5.用变量a给出下面的定义a)一个整型数b)一个指向整型数的指针c)一个指向指针的的指针,它指向的指针是指向一个整型数d)一个有10个整型数的数组e)一个有10个指针的数组,该指针是指向一个整型数f)一个指向有10个整型数数组的指针g)一个指向函数的指针,该函数有一个整型参数并返回一个整型数h)一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数(答:a)inta;b)int*a;c)int**a;d)inta[10];e)int*a[10];f)int(*a)[10];g)int(*a)(int);/h)int(*a[10])(int);/11.下面的声明都是什么意思?嵌入式系统程序设计为什么如此看重关键字const?constinta;intconsta;constint*a;int*consta;intconst*aconst;答:1)关键字const的作用是为给读你代码的人传达非常有用的信息,实际上,声明一个参数为常量是为了告诉了用户这个参数的应用目的。2)通过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码。3)合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。简而言之,这样可以减少bug的出现12.关于关键字volatile1)一个参数既可以是const还可以是volatile吗?解释为什么。2)一个指针可以是volatile吗?解释为什么。3)下面的函数有什么错误:intsquare(volatileint*ptr){return*ptr**ptr;}答:1).是的。一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。2).是的。尽管这并不很常见。一个例子是当一个中服务子程序修该一个指向一个buffer的指针时。3).这段代码的有个恶作剧。这段代码的目的是用来返指针*ptr指向值的平方,但是,由于*ptr指向一个volatile型参数,编译器将产生类似下面的代码:intsquare(volatileint*ptr){inta,b;a=*ptr;b=*ptr;returna*b;}由于*ptr的值可能被意想不到地该变,因此a和b可能是不同的。结果,这段代码可能返不是你所期望的平方值!正确的代码如下:longsquare(volatileint*ptr){inta;a=*ptr;returna*a;}13.中断是嵌入式系统中重要的组成部分,这导致了很多编译开发商提供一种扩展—让标准C支持中断,从而产生了一个新的关键字__interrupt。下面的代码就使用了__interrupt关键字去定义了一个中断服务子程序(ISR),请评论一下这段代码。__interruptdoublecompute_area(doubleradius){doublearea=PI*radius*radius;printf(\nArea=%f,area);returnarea;}答:a、ISR不能返回一个值。b、ISR不能传递参数。c、在许多处理器编译器中,浮点一般都是不可冲入的。有些处理器编译器需要让额外的寄存器入栈,有些处理器编译器就不允许在ISR中做浮点运算。此外ISR应该是短而有效率的。在ISR中做浮点运算是不明智的。d、printf经常是有冲入性和性能上的问题,所以一般不使用printf函数14.简述嵌入式系统硬件层、中间层、系统软件层和应用软件层的特点和作用。答:硬件层:嵌入式微处理器、存储器、通用设备接口和I/O接口。嵌入式核心模块=微处理器+电源电路+时钟电路+存储器Cache:位于主存和嵌入式微处理器内核之间,存放的是最近一段时间微处理器使用最多的程序代码和数据。它的主要目标是减小存储器给微处理器内核造成的存储器访问瓶颈,使处理速度更快。(2)中间层(也称为硬件抽象层HAL或者板级支持包BSP):它将系统上层软件和底层硬件分离开来,使系统上层软件开发人员无需关系底层硬件的具体情况,根据BSP层提供的接口开发即可。BSP有两个特点:硬件相关性和操作系统相关性。设计一个完整的BSP需要完成两部分工作:A、嵌入式系统的硬件初始化和BSP功能。片级初始化:纯硬件的初始化过程,把嵌入式微处理器从上电的默认状态逐步设置成系统所要求的工作状态。板级初始化:包含软硬件两部分在内的初始化过程,为随后的系统初始化和应用程序建立硬件和软件的运行环境。系统级初始化:以软件为主的初始化过程,进行操作系统的初始化。B、设计硬件相关的设备驱动。(3)系统软件层:由RTOS、文件系统、GUI、网络系统及通用组件模块组成。RTOS是嵌入式应用软件的基础和开发平台。(4)应用软件:由基于实时系统开发的应用程序组成。15.若每一条指令都可以分解为取指、译码和执行三步。已知取指时间t取指=4△t,译码时间t译码=3△t,执行时间t执行=5△t。如果按串行方式执行完100条指令需要(1)△t;如果按照流水线方式执行,执行完100条指令需要(2)△t。给出答案依据。(1)A.1190B.1195C.1200D.1205(2)A.504B.507C.508D.510答。根据题意可以看到,在此流水线中按串行方式执行完100条指令要用1200△t。采用流水方式执行,执行的总时间的关键取决于最长的执行时间,所以执行完100条的时间为:4Δt+3Δt+5Δt+(100-1)*5Δt=507Δt。