201211嵌入式下午真题
第 1 题
阅读下列说明和图、表,回答问题1至问题3,将解答填入答题纸的对应栏内。
【说明】
某车载导航系统的结构如图1-1所示,由导航处理系统和显示系统两部分组成。导航处理系统安装在某型车的设备区,显示系统安装在某型车的前方,便于驾驶员观看和操作。
导航处理系统由主处理机模块、电子盘模块、信号处理模块和电源模块组成,主处理机模块执行电子地图功能、导航控制功能等,生成的导航显示画面通过信号线在LCD液晶彩色显示屏显示给驾驶员;信号处理模块处理外部采集数据,将处理后的数据通过内部总线传输给主处理机模块;电子盘模块存储电子地图数据及导航数据。
显示系统由LCD液晶彩色显示屏、面板键盘(自定义键盘)和电源模块组成,主要是显示导航画面,也可通过面板键盘进行导航控制。
【问题1】(6分)
GPS天线接收卫星信号,将定位信息以帧的形式,通过RS232串行接口传输给主处理机模块。通常RS232的管脚规格如表1-1所示。
采用RS232通信,如果发送的数据量超过接收方缓冲区时,可能在接收方缓冲区因处理时间延迟等导致接收数据丢失。因此,需要进行流量控制。
请回答下面三个问题,将答案填写在答题纸的对应栏中。
(1)如果通过软件进行流量控制,也就是将流量控制信息以特殊的数据进行发送,使用上表中的哪两个管脚进行状态信息发送?(回答管脚名称)
(2)如果通过硬件方式进行流量控制,使用上表中的哪两个管脚进行状态信息发送?(回答管脚名称)
(3)若RS232适配器的FIFO深度为4B,通信波特率为9600bps,数据位为8位,无校验,停止位为1,无数据流控。在应用设计中每次以4字节为单位进行数据发送,每两次发送之间严格控制时间间隔为10ms,连续发送100次,在此过程中,忽略所有由于调度等因素引起的发送延迟。那么,从第1次发送开始,到第100次数据发送出去,消耗的时间为多少毫秒?
【问题2】(6分)
主处理机模块与信号处理模块间通过双端口存储器进行数据交换。李工设计时,将双端口存储器空间划分为两个缓冲区,两个缓冲区分别交替地接收信号处理机传输来的最新数据,然后按数据块方式提供给用户程序使用。
假设每个缓冲区的大小为512KB,将512KB数据写入当前空闲缓冲区接口服务为Write_Buffer,将当前有效的512KB数据读出缓冲区的接口服务为Read_Buffer,假设双端口存储器中不提供硬件信号量,两个缓冲区间的互斥操作由软件标记实现,软件对双端口存储器的单次操作(读写一个字的操作)为原子操作。
下面是用C语言设计的一组对双缓冲区的管理程序代码,请填补该程序代码中的空缺,将答案填写在答题纸上。
【问题3】(3分)
请回答关于面板按键设计过程中的下列问题,将答案填写在答题纸的对应栏中。
在进行面板键盘处理设计时,通常在扫描键盘过程中,按键会产生机械抖动。针对抖动问题,王工认为只有通过硬件设计才能消除抖动,而李工认为用软件方法就可以解决该问题。针对抖动向题,你认为可以采用哪类方式消除?
答案与解析
- 试题难度:一般
- 知识点:嵌入式硬件设计>其它
- 试题答案:
【问题1】
(1)RXD和TXD(或者TXD和RXD)
(2)RTS和CTS(或者CTS和RTS)
(3)993.75
【问题2】
(1)!(*Mutex[0])或者*Mutex[0]==0x00 或者*Mutex[0]==0
(2)*Mutex[0]=0x00或者*Mutex[0]=0
(3)len=Read_Buffer(1,Data)
【问题3】
硬件方法和软件方法都可以。 - 试题解析:
本题考查嵌入式系统设计,涉及嵌入式软件和硬件基础知识的应用。
【问题1】
EIA制定的RS-232C接口与外界的相连采用25芯(DB-25)和9芯(DB-9)D型插接件,实际应用中,并不是每只引脚信号都必须用到。软件方式按照RXD和TXD两个引脚。硬件方式按照RTS和CTS两个引脚。RS-232各个引脚的功能如下图所示。在使用RS232进行数据传送时,需要注意其配置方式,包括流控位宽,起始位宽等。在该题目中,数据位宽为8bit,停止位为1bit,无别的流控位,因此,每个字节传输需要的位宽为9bit,按照9600bps的速率进行传输时,每个字节需要的时间为9/9600=0.9375ms,因此传输4字节需要的时间为4×0.9375ms=3.75ms。在进行100次的传输中,每隔10ms传输一次,又由于同时忽略了其他调度时间,由于3.75小于10,可知,在每10ms传输一次的过程中肯定是可以将对应的4字节数据传输完毕。因此,在100次的传输中,前99次传输需要的时间是99×10ms=990ms,最后一次也就是第100次传输消耗的时间为3.75ms,因此,总共需要的时间为990ms+3.75ms=993.75ms。
【问题2】
PPC_Read_Data( )函数(数据处理模块读数据程序段)的具体过程如下:
1.首先判断双缓冲有无数据;
(1)如果无新数据,就退出
(2)如果有数据,就继续
2.如果缓冲区0有数据;
(1)再判断缓冲区0是否加锁;如果未加锁,则先加锁,再读数据,再解锁。
(2)如果未加锁,则先加锁,再读数据,再解锁。
3.对缓冲区1同样如此处理。
【问题3】
硬件方法和软件方法都可以消除抖动问题。
1.硬件方法
硬件方法常用专用的去抖芯片或者自己组装一个双稳态消抖电路,就是两个与非门构成的RS触发器。
2.软件方法
软件方法是当检测出键闭合后执行一个10ms~20ms的延时程序,再一次检测键的状态,如仍保持闭合状态,则确认真正有键按下。
第 2 题
阅读下列说明和图,回答问题1至问题3,将解答填入答题纸的对应栏内。
【说明】
在某嵌入式系统设计中,使用8片RAM进行64KRAM的外部存储器扩展,如图2-1所示。该CPU共有16根地址线,8根数据线,在设计中,利用CPU的MERQ作为访问控制信号,该访问控制信号低电平有效。另外,R/W作为读写命令信号(高电平为读,低电平为写)。8片8Kx8位的RAM芯片与CPU相连,RAM芯片的片选内部为上拉电阻到电源,各个RAM芯片的片选信号和74138译码器的输出相连,译码器的地址选择端连接到CPU的A13,A14,A15地址线上。
【问题1】(8分)
根据上图所示,写出RAM0,RAM1和RAM7的地址范围(请用16进制进行表示)。
RAM0:(1)
RAM1:(2)
RAM7:(3)
若CPU操作的地址总线为A800H,结合图2-1所示的示意图,CPU访问的是哪个 RAM存储器(4)。
【问题2】(4分)
如果运行时发现不论往哪片RAM写入数据后,以C000H为起始地址的存储芯片都有与其相同的数据,假设芯片与译码器可靠工作,则说明:
(1)RAM0-RAM7中(1)的片选输入端总是处于低电平。
(2)如果有问题的存储芯片的片选输入端总是处于低电平,以下可能原因中描述不正确的是(2)。
A.该存储芯片的CS端与存储芯片的WE端错连或短路
B.该存储芯片的CS端与CPU的MREQ端错连或短路
C.该存储芯片的CS端与地线错连或短路
D.该存储芯片的CS端悬空
【问题3】(3分)
根据连接图,若出现地址线A15与CPU断线,并搭接到高电平上,下面描述中正确的是( )。(该题为多选题)
A.此时存储器只能寻址A15=l的地址空间
B.此时存储器只能寻址总共64KB空间的高32KB地址空间
C.此时访问64KB空间的高32KB地址空间时会错误地访问到低32KB地址空间
D.此时访问64KB空间的低32KB地址空间时会错误地访问到高32KB地址空间
答案与解析
- 试题难度:一般
- 知识点:嵌入式硬件设计>其它
- 试题答案:
【问题1】
(1)0000H-1FFFH
(2)2000H-3FFFH
(3)E000H-FFFFH
(4)RAM5
【问题2】
(1)RAM6(2)D
【问题3】
A、B、D - 试题解析:
本题考查嵌入式处理器硬件应用和设计。
【问题1】
根据74LS138的地址选择线的连接,可以得到A15,A14,A13的值为:
000选择的是RAM0;
001选择的是RAM1;
010选择的是RAM2;
011选择的是RAM3
100选择的是RAM4;
101选择的是RAM5;
110选择的是RAM6;
111选择的是RAM7;
由于每个RAM的空间大小为8K,所以各个RAM的地址范围依次是:
RAM0:0000H-1FFFH
RAM1:2000H-3FFFH
RAM2:4000H-5FFFH
RAM3:6000H-7FFFH
RAM4:8000H-9FFFH
RAM5:A000H-BFFFH
RAM6:C000H-DFFFH
RAM7:E000H-FFFFH
【问题2】
C000H地址的片选为RAM6,也就是说RAM6一直处于被选通状态。
如果有问题的存储芯片的片选输入端总是处于低电平,片选输入端是CS,低电平有效,而WE和MREQ也是低电平有效,所以,可能把CS和WE或者MREQ错连了,或者是直接接地。所以ABC的描述都正确的。
【问题3】
若出现地址线A15与CPU断线,并搭接到高电平上,说明了此时存储器只能寻址A15=l的地址空间,也就是100,101,110,111这几个。只能寻址到4片RAM。所以,此时存储器只能寻址总共64KB空间的高32KB地址空间;此时访问64KB空间的低32KB地址空间时会错误地访问到高32KB地址空间。
第 3 题
阅读下列说明和图,回答问题1至问题3,将解答填入答题纸的对应栏内。
【说明】
操作系统主要功能之一是处理机管理,处理机管理主要是实现处理机扩充,以支持多个进程的并行运行,提高计算机的计算效率。
进程是动态的概念,通常称进程为程序的一次执行。进程的主体部分是程序,包括程序和数据。进程在执行期间具备确定的状态。
线程是进程中某个单独执行的控制流,也称为轻量进程。
【问题1】(3分)
简述抢占(剥夺)式调度算法和非抢占式调度算法的特点。
【问题2】(3分)
请从下列叙述中选择出正确的叙述并将其序号填写在答题纸上。(该题为多选题)
A.在多进程多线程系统中,处理机调度的最小单位是进程
B.线程可定义为进程内的一个执行单位,或者定义为进程内的一个可调度的实体
C.一个线程可以属于多个进程
D.进程处于可执行状态时,它的线程可以被调度执行,处于阻塞状态时,其所有线程均不能执行
E.进程的多个线程共享进程的地址空间
【问题3】(9分)
进程状态之间切换关系如图3-1所示,具体说明进程三种状态的特点,并将三种状态之间的切换条件(a)至(d)填写在答题纸对应栏目中。
答案与解析
- 试题难度:一般
- 知识点:操作系统概述>其它
- 试题答案:
【问题1】
所谓抢占式,指按照一定的规则(例如优先数),在每次中断处理结束后进行调度,选择条件最优的进程投入运行;
所谓非抢占式调度是指,进程一旦被调度,就将一直运行,除非由于自身原因不能运行。
【问题2】
B、D、E
【问题3】
运行状态特点:进程占有CPU,正在运行其程序时处于运行态。
就绪状态特点:进程具备了一切运行的条件,但由于CPU正在运行别的进程而使它不能运行时,处于就绪态。
等待状态特点:进程由于自身原因必须等待某个条件的具备,否则不能继续运行时,处于等待态。
(a)某个运行条件不能满足(例如等待资源);
(b)等待条件消失(例如等待的资源已经获得满足);
(c)进程自愿放弃CPU使用权,或被强制剥夺CPU使用权;
(d)就绪队列中的进程获得CPU使用权。 - 试题解析:
本题考查操作系统中进程、线程以及进程调度等方面的应用知识。
【问题1】
在操作系统初始化时,创建所有进程,进程运行过程中,也可创建子进程。进程调度算法很多,归结为两类,即抢占(剥夺)式和非抢占式。抢占式调度策略,指按照一定的规则(例如优先数),在每次中断处理结束后进行调度,选择条件最优的进程投入运行。非抢占式调度是指,进程一旦被调度,就将一直运行,除非由于自身原因不能运行。
【问题2】
在多进程多线程系统中,处理机调度的最小单位是线程,而不是进程。
线程可定义为进程内的一个执行单位,或者定义为进程内的一个可调度的实体。
进程由一个或一组线程组成;一个线程属于且仅属于一个进程。
进程处于可执行状态时,它的线程可以被调度执行,而处于阻塞状态时,其所有线程均不能执行。
进程的多个线程共享进程的地址空间。
【问题3】
图3-1给出了进程三个状态:运行、就绪、等待之间的切换关系,这三种状态的特点如下:①进程拥有CPU,正在运行其程序时处于运行态;②具备了一切运行的条件,但由于CPU正在运行别的进程而使它不能运行时,进程处于就绪态:③由于自身原因必须等待某个条件的具备,否则不能继续运行时,进程处于等待态。
对于正在运行的进程,当某个运行条件不能满足,例如等待某个资源时,便将CPU让出而转入等待态;当等待条件消失,例如等待的资源已经获得满足,进程从等待态进入就绪态等待调度;处于运行态的进程,如自愿放弃CPU,或被高优先级进程强制剥夺CPU使用权后,从运行态转入就绪态;控制权被释放后,CPU将从就绪队列中选取排在最前面的进程投入运行。就绪队列中获得CPU使用权的进程,便转入运行态。
三种状态的特点如下。
(1)运行态:进程占有CPU,正在运行其程序时处于运行态;
(2)就绪态:进程具备了一切运行的条件,但由于CPU正在运行别的进程而使它不能运行时,处于就绪态;
(3)等待态:进程由于自身原因必须等待某个条件的具备,否则不能继续运行时,处于等待态。
三种状态之间的切换条件分别为:
(1)某个运行条件不能满足(例如等待资源);
(2)等待条件消失(例如等待的资源已经获得满足);
(3)进程自愿放弃CPU使用权,或被强制剥夺CPU使用权;
(4)就绪队列中的进程获得CPU使用权。
第 4 题
阅读下列说明和表,回答问题1至问题2,将解答填入答题纸的对应栏内。
【说明】
看门狗(Watchdog)技术是嵌入式系统设计中保证系统可靠的常用技术。嵌入式控制系统运行时由于受到外部干扰或者内部系统错误,程序有时会出现“跑飞”现象,导致整个系统瘫痪。为了防止这一现象的发生,对系统可靠性要求较高的场合往往要加入看门狗电路。当系统“跑飞”时,看门狗电路能自动恢复系统的运行。
【问题1】(8分)
设某嵌入式系统程序完整运行所需的周期时间是tp,看门狗的定时周期为tw,要求tw(1)tp,在程序运行过程中需要定时(2)(俗称“喂狗”),只要程序正常运行,定时器就不会溢出。若由于干扰等原因使系统不能在tp时刻修改定时器的计数值,定时器将在tw时刻(3),引发(4),使系统得以重新运行。
请填充以上叙述中空缺处的内容,将答案填写在答题纸的对应栏中。
【问题2】(7分)
张工在某嵌入式系统中设计实现了看门狗电路,采用的芯片寄存器如表4-1、表4-2、表4-3、表4-4所示。
王工编写了以下程序代码,实现看门狗电路的初始化。请仔细阅读每行代码,然后回答问题。
(1)在程序的第2、3、4行,分别使用了volatile关键字,请说明该关键字的作用。
(2)在程序的第7行,实现了对看门狗的三个功能设置,除了设置预装比例值外,其他两个功能分别是什么?
(3)在程序的第10行,实现了对看门狗的哪个功能设置?
(4)该系统结构采用的编址方式是什么?
(5)该系统的位序是大端方式还是小端方式?
答案与解析
- 试题难度:一般
- 知识点:嵌入式微处理器>其它
- 试题答案:
【问题1】
(1)>或大于
(2)修改定时器的计数值(或重新设定看门狗的定时周期)
(3)溢出(或超时)
(4)系统复位中断
【问题2】
(1)类型修饰符,防止编译器对代码进行优化
(2)设置看门狗的分频因素为1/128、使能中断产生
(3)使能看门狗定时器
(4)统一编址
(5)小端方式 - 试题解析:
本题考查嵌入式系统中看门狗的应用以及驱动程序的设计。
【问题1】
在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界电磁场的干扰,造成各种寄存器和内存的数据混乱,会导致程序指针错误,不在程序区,取出错误的程序指令等,都有可能会陷入死循环,程序的正常运行被打断,由单片机控制的系统无法继续正常工作,导致整个系统的陷入停滞状态,发生不可预料的后果。
看门狗,又叫watchdog,从本质上来说就是一个定时器电路,一般有一个输入和一个输出,其中输入叫做喂狗,输出一般连接到另外一个部分的复位端,一般是连接到单片机。看门狗的功能是定期的查看芯片内部的情况,一旦发生错误就向芯片发出重启信号。看门狗命令在程序的中断中拥有最高的优先级。
所以,假设某嵌入式系统程序完整运行所需的周期时间是tp,看门狗的定时周期为tw,要求tw大于tp,在程序运行过程中需要定时修改定时器的计数值(俗称“喂狗”),只要程序正常运行,定时器就不会溢出。若由于干扰等原因使系统不能在tp时刻修改定时器的计数值,定时器将在tw时刻溢出(或超时),引发系统复位中断,使系统得以重新运行。【问题2】
(1)volatile的本意是“易变的” 因为访问寄存器要比访问内存单元快的多,所以编译器一般都会作减少存取内存的优化,但有可能会读脏数据。当要求使用volatile声明变量值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。精确地说就是,遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问;如果不使用volatile,则编译器将对所声明的语句进行优化。(简洁的说就是:volatile关键词影响编译器编译的结果,用volatile声明的变量表示该变量随时可能发生变化,与该变量有关的运算,不要进行编译优化,以免出错)。
第 5 题
阅读下列说明和程序,回答问题1至问题3,将解答填入答题纸的对应栏内。
【说明】
在开发某嵌入式系统时,设计人员根据系统要求,分别编写了相关程序,其中:
【程序1】是李工编写的一个数据交换子程序。
【程序2】是赵工编写的一段利用递归方法判别链表表示的两个数据结构是否相等的程序,若相等则返回值为1,否则返回为0。判别的准则是若两个链表的首指针相等,则相等;否则进行内部元素比较,元素中的itemid表示后面联合体union的有效性,itemid为0时,联合体union里面的data项有效,否则联合体union中的Link项有效。
【问题1】(6分)
执行【程序1】后,打印出来的a=3,b=4;并没有完成数据交换,请指出李工的问题?并改正程序错误。将答案填写在答题纸中对应的栏目。
【问题2】(5分)
仔细阅读并分析【程序2】中的C语言代码,完成其中(1)~(5)空白填空,将答案填入答题纸的对应栏内。
【问题3】(4分)
李工编写某嵌入式软件时,遇到了一些问题,请帮助李工解答下面2个问题,并将答案填写在答题纸中对应的栏目。
(1)李工在编译时,程序没有通过编译,经检查程序后将文件头的# include <filename.h>改为 # include "filename.h"后编译通过,请问 # include < filename.h >和 # include "filename.h"的区别是什么?
(2)李工在编写一段C++程序时,需要调用一段已编译的C语言函数,为什么要加 extern "C"?
答案与解析
- 试题难度:一般
- 知识点:嵌入式软件程序设计>其它
- 试题答案:
李工的问题:形参不能作为函数的输出参数使用。
对应的swap函数修改如下:调用时修改为swap(&a,&b)
【问题2】
(1)x!-NULL&& y!-NULL
(2)x->itemid = y->itemid
(3)x->un.data = y->un.data
(4)Equalltem(x->un.link, y->un.link);
(5)Equalltem(x->nextltem,y->nextltem);
【问题3】
(1)对于# include <filename.h>,编译器从工程指定路径搜索filename.h;
对于#include "filename.h",编译器从当前路径和工程指定路径搜索filename.h;
(2)C++语言支持函数重载,C语言不支持函数重载,函数被C++编译后在库中的名字与C语言不同。C++提供了C连接交换指定符号extern "C"来解决名字匹配问题。 - 试题解析:
本题考查嵌入式C/C++编程知识与应用。
【问题1】
函数swap采用值传递,虽然将形参x和y交换了,但是并不影响到实参,所以执行【程序1】后,打印出来的a=3,b=4;并没有完成数据交换。将值传递改成指针传递就可以了。
【问题2】
该段C语言程序是一段利用递归方法判别链表表示的两个数据结构是否相等的程序,若相等则返回值为1,否则返回为0。
【问题3】
本题考查考生对预处理指令include的正确理解。对于#include <filename.h>来说,编译器会从工程指定路径搜索filename.h文件;对于# include "filename.h"来说,编译器会从当前路径和工程指定路径捜索filename.h文件。
C++语言支持函数重载,C语言不支持函数重载,函数被C++编译后在库中的名字与C语言不同。为了C++程序中能够调用C程序,就需要C++提供C连接交换指定符号extern "C"来解决名字匹配问题。
#include是文件包含指令,#include < filename.h >,这条指令会导致预处理器把#include后面跟的文件(即filename.h文件)的内容替换到这条指令的位置。如果文件名由< >括起来,将表示在依赖于系统的目录中寻找这个文件。如果文件名由" "括起来,系统将会首先在当前程序目录中查找对应文件,如果找不到,再到其他依赖于系统的目录中寻找。
在C++中调用C库函数,就需要在C++程序中用extern “C”声明要引用的函数。这是给链接器用的,告诉链接器在链接的时候用C函数规范来链接。主要原因是C++和C程序编译完成后在目标代码中命名规则不同。