201511嵌入式下午真题
第 1 题
阅读以下关于某嵌入式系统设计的说明,回答问题1至问题4,将答案填入答题纸的对应栏内。
【说明】
某公司承接了某嵌入式系统的研制任务。该嵌入式系统由数据处理模块、系统管理模块、FC网络交换模块和智能电源模块组成,系统组成如图1-1所示。数据处理模块处理系统的应用任务;系统管理模块除了处理系统的应用任务外,还负责管理整个嵌入式系统;FC网络交换模块采用消息机制,支持广播和组播,主要负责系统的数据交换;智能电源模块负责给其他模块供电,该模块根据系统命令可以给其他模块供电或停止供电。
【问题1】(3分)
该系统的软件大部分是用C语言编程的,编程人员经常会使用运算符,请按优先级由高到低的次序,重新排序下面的运算符:%,=,<=,&&。
【问题2】(4分)
该系统的开发要求按软件能力成熟度模型CMM3级开发,请回答下列问题:
(1)CMM3级包含多少个关键过程域?
(2)请写出CMM3级的关键过程域。
(3)CMM2级包含多少个关键过程域?
(4)在对该开发软件单位进行CMM3级达标评级时,只需检查3级的关键过程域还是3级和2级的关键过程域都需要检查?
【问题3】(3分)
(1)在本系统中,FC网络采用何种拓扑结构?请从如下4项中选择最为合适的。
A.总线B.树型C.星形D点对点
(2)FC网络除了用于交换的光纤基础架构,还必须有高性能的I/O通道结构支持,I/O通道在FC网络中的优势是什么?
【问题4】(5分)
智能电源模块首先进行系统初始化,初始化后各设备就可使用,再根据系统初始配置表对嵌入式系统的其他模块供电。智能电源模块通常完成两件事情:一、周期性地查询本模块温度、各路电流(给各模块供电的)以及电源模块的供电是否异常,如果异常,则进行异常处理,并报系统管理模块,由系统管理模块进行决策;二、进入中断处理程序,处理系统管理模块的各种命令,如果系统管理模块命令关机下电,则智能电源模块对所有模块(也包括自己)进行下电处理。
图1-2是智能电源模块上的管理软件处理流程图,请完成该流程图,给(1)~(5)处填空。
答案与解析
- 试题难度:较难
- 知识点:嵌入式系统开发与维护知识>其它
- 试题答案:
【问题1】
按优先级由高到低的次序,运算符排序为:
%,<=,&&,=
【问题2】
(1)CMM3级(已定义级)包括7个关键过程区域
(2)同行评审、组间协调、软件产品工程、集成软件管理、培训大纲、组织过程定义、组织过程集点
(3)CMM2级(可重复级)包括6个关键过程区域
(4)3级和2级的关键过程域都需要检查【问题3】
(1)C
(2)简单、廉价、高速
【问题4】
(1)按初始配置表给各模块供电
(2)电源模块温度检测
(3)向其他模块供电的各路电流检测
(4)屏蔽中断
(5)处理系统控制模块发来命令 - 试题解析:
本题考查嵌入式系统设计中的基本C语言编程、软件工程化、FC网络以及智能电源管理设计等知识及应用。
【问题1】
C语言中运算符优先级排序如下,分为优先级15级:
(1)圆括号【()】、下标运算符【[]】、分量运算符的指向结构体成员运算符【->】、结构体成员运算符【.】;
(2)逻辑非运算符【!】、按位取反运算符【~】、自增自减运算符【++】【 --】、负号运算符【-】、类型转换运算符【(类型)】、指针运算符和取地址运算符【*】【&】、长度运算符【sizeof】;
(3)乘法运算符【*】、除法运算符【/】、取余运算符【%】;
(4)加法运算符【+】、减法运算符【-】;
(5)左移动运算符【<<】、右移动运算符【>>】;
(6)关系运算符【< 】【>】【<=】【 >= 】;
(7)等于运算符【==】、不等于运算符【!=】;
(8)按位与运算符【&】;
(9)按位异或运算符【^】;
(10)按位或运算符【|】;
(11)逻辑与运算符【&&】;
(12)逻辑或运算符【||】;
(13)条件运算符【?:】;
(14)赋值运算符【=】【/=】【*=】【%=】【+=】【-=】【<<=】【>>=】【&=】【^=】【|=】;
(15)逗号运算符【,】。
运算符优先级的记法:优先级最高者其实并不是真正意义上的运算符,包括:数组下标、函数调用操作符、各结构成员选择操作符。它们都是自左向右结合。
单目运算符的优先级仅次于上述运算符,在所有的真正意义的运算符中,它们的优先级最高。
双目运算符的优先级低于单目运算符的优先级。在双目运算符中,算术运算符的优先级最高,移位运算符次之,关系运算符再次之,接着就是逻辑运算符,赋值运算符,最后是条件运算符。总结以下两点:
任何一个逻辑运算符的优先级低于任何一个关系运算符;
移位运算符的优先级比算术运算符要低,但是比关系运算符要高。
下表是C语言运算符优先级表(由上至下,优先级依次递减)。【问题2】
如下表格所示,软件能力成熟度模型CMM中,将软件能力成熟度自低到高依次划分为5级。除等级1外,每个成熟度等级被分解成几个关键过程域,其中“同行评审”属于已定义级的关键过程域。【问题3】
1.点到点型指网络中一个信息源节点连接到一个或多个目的节点,是专用的链路,具有通信效率高,延迟小的优点,但是建立多点全互联的网络具有连线多、成本高、资源利用率低等缺点。2.总线拓扑结构是将网络中的所有设备通过相应的硬件接口直接连接到公共总线上,结点之间按广播方式通信,一个结点发出的信息,总线上的其他结点均可“收听”到。
优点:结构简单、布线容易、可靠性较高,易于扩充,是局域网常采用的拓扑结构。
缺点:所有的数据都需经过总线传送,总线成为整个网络的瓶颈;出现故障诊断较为困难。最著名的总线拓扑结构是以太网(Ethernet)。
3.星型拓扑结构 每个结点都由一条单独的通信线路与中心结点连结。
优点:结构简单、容易实现、便于管理,连接点的故障容易监测和排除,通信吞吐量高,延迟少等。
缺点:中心结点是全网络的可靠瓶颈,中心结点出现故障会导致网络的瘫痪。
4.环形拓扑结构 各结点通过通信线路组成闭合回路,环中数据只能单向传输。
优点:结构简单,适合使用光纤,传输距离远,传输延迟确定。
缺点:环网中的每个结点均成为网络可靠性的瓶颈,任意结点出现故障都会造成网络瘫痪,另外故障诊断也较困难。最著名的环形拓扑结构网络是令牌环网(Token Ring)
5.树型拓扑结构 是一种层次结构,结点按层次连结,信息交换主要在上下结点之间进行,相邻结点或同层结点之间一般不进行数据交换。
优点:连结简单,维护方便,适用于汇集信息的应用要求。
缺点:资源共享能力较低,可靠性不高,任何一个工作站或链路的故障都会影响整个网络的运行。
本题为了满足嵌入式系统对高带宽、低延迟的通信要求,通过分析以上网络的拓扑结构特点,FC网络应选择星形结构。星形结构是最佳的方案。
SAN通常有FC SAN和IP SAN两种实现技术。FC SAN采用I/O结合光线通道,IPSAN采用iSCSI实现异地间数据交换,具有简单、廉价、高速等优势。
第 2 题
阅读以下关于某四轴飞行器系统设计的说明,回答问题1至问题4,将解答填入答题纸的对应栏内。
【说明】
在某四轴飞行器系统设计中,利用惯性测量单元(IMU)、PID电机控制、2.4G无线遥控通信和高速空心直流电机驱动等技术来实现一个简易的嵌入式四轴飞行器方案。整个系统的设计包括飞控板和遥控板两部分,两者之间采用2.4G无线模块进行数据传输。飞控板采用高速单片机STM32作为处理器,采用含有三轴陀螺仪、三轴加速度计的运动传感器MPU6050作为惯性测量单元,通过2.4G无线模块和遥控板进行通信,最终根据PID控制算法以PWM方式驱动空心电机来控制目标。
图2-1为李工设计的系统总体框图。飞控板和遥控板的核心处理器都采用STM32 F103。飞控系统的惯性测量单元采用MPU6050测量传感器,MPU6050使用IIC接口,时钟引脚SCL、数据引脚SDA和数据中断引脚分别接到STM32的对应管脚,图2-2为该部分原理图。遥控板采用STM32单片机进行设计,使用AD对摇杆模拟数据进行采集,采用NRF2401无线模块进行通信,图2-3为该部分原理图。
李工所设计的系统软件同样包含飞控板和遥控板两部分,飞控板软件的设计主要包括无线数据的接收、自身姿态的实时计算、电机PID增量的计算和PWM的电机驱动。遥控板主控制器软件通过ADC外设对摇杆数据进行采集,把采集到的数据通过2.4G无线通信模块发送至飞控板。图2-4为飞控系统的软件流程示意图。
【问题1】(4分)
由图2-1系统总体框图设计可知,飞控板和遥控板之间是用2.4G无线通信进行数据传输,各自主处理器和无线通信模块之间是SPI接口。同时,在飞控板上,处理器和惯性测量单元是通过IIC进行数据交互。以下关于SPI接口和IIC接口的描述中,正确的是:(1)、(2)、(3)、(4)。
A.SPI和IIC都是主从式通信方式
B.SPI的数据收发线是各自独立的,IIC也是同样
C.SPI和IIC的传输都不需要片选控制
D.IIC总线是一个多主机的总线,可以连接多于一个能控制总线的器件到总线
E.IIC总线包括标准模式,快速模式和高速模式,相互之间的传输速度差异并不大
F.在原理设计中,到底采用SPI和IIC哪种方式,需要依据外设芯片的接口而定
G.SPI是一种环形总线结构
H.在IIC总线上,可以有多个从设备具有相同的IIC地址
【问题2】(4分)
(1)图2-2飞控板部分原理图中,R4的作用是什么?
(2)图2-3遥控板部分原理图中,C11、C12、C13、C14的作用是什么?
【问题3】(4分)
在STM32处理器的PWM使用过程中,最为关键的就是PWM的频率和占空比。PWM的频率依赖于PWM模块的参考时钟频率,自动装载寄存器ARR的值加1之后再乘以参考时钟频率即可得到PWM的频率。PWM的占空比是用捕获比较寄存器CCR和自动装载寄存器ARR获得的,PWM占空比=CCR/(ARR+1)。
假设当前主控板的STM32处理器PWM模块的参考时钟频率为1kHz,要将PWM模块的频率设置为100kHz,则ARR寄存器的值应设置为多少?如果此时占空比希望设置为20%,那么CCR寄存器的值应该设置为多少?
【问题4】(3分)
飞控系统每0.5毫秒进行一次定时器的触发,每次中断都会检查一次无线模块数据的接收,以确保飞控系统控制信息的实时性。每2次中断(即1毫秒)读取一次MPU6050单元的数据,并进行算法处理。每4次中断(即2毫秒)通过计算当前飞控板系统的姿态,结合遥控端的目标姿态,根据两者的差值通过PID控制算法对各个电机进行调速控制。每200次中断(即100毫秒)采集一次电池电压,然后通过无线模块把电池电压发送给遥控板,以告知操作人员当前电压的大小。
图2-4为飞控系统软件实现的简要流程图,根据以上描述,请补全图2-4中的空(1)~(6)处的内容。
答案与解析
- 试题难度:一般
- 知识点:嵌入式系统总线&通信接口>其它
- 试题答案:
【问题1】(顺序不限)
(1)~(4):A、D、F、G
【问题2】
(1)增强驱动能力
(2)滤波,保持信号的稳定性
【问题3】
ARR寄存器的值:99
CCR寄存器的值:20
【问题4】
(1)检查一次无线模块数据的接收
(2)count%2=0
(3)读取MPU6050单元的数据,并进行算法处理
(4)计算当前飞控板系统的姿态,对各个电机进行调速控制
(5)count%200=0
(6)采集电池电压,通过无线模块把电池电压发送给遥控板 - 试题解析:
本题考查嵌入式软硬件系统协同设计过程中的知识及应用。
此类题目要求考生认真阅读题目中的题干描述,仔细理解设计的原理框图,详细观察提供的硬件原理图和所描述的软件实现流程示意图。前后结合进行题目分析。
【问题1】
1.SPI总线
SPI(Serial Peripheral Interface,串行外围设备接口)是由Motorola公司开发的一个低成本、易使用的接口,主要用在微控制器(MCU)和外围设备芯片之间进行连接。
SPI是一个4线接口,主要使用4个信号:1.主机输出/从机输入(MOSI);2.主机输入/从机输出(MISO);3.串行SCLK或SCK;4.外设片选((CS) ̅)。
根据时钟极性和时钟相位的不同,SPI有4种工作模式。时钟极性有高电平、低电平两种。时钟相位有两个:时钟相位0和时钟相位1。4种工作模式分别是——模式0、模式1、模式2和模式3,它们的区别是定义了在时钟脉冲的哪条边沿转换(toggles)输出信号,哪条边沿采样输入信号,还有时钟脉冲的稳定电平值(就是时钟信号无效时是高还是低)。
2.IIC总线
IIC BUS(Inter Integrated Circuit BUS,内部集成电路总线)是由Philips公司推出的二线制串行扩展总线,用于连接微控制器及其外围设备。
I2C总线是具备总线仲裁和高低速设备同步等功能的高性能多主机总线。直接用导线连接设备,通信时无需片选信号。
在I2C总线上,只需要两条线—串行数据SDA线、串行时钟SCL线,它们用于总线上器件之间的信息传递。
(1)SDA和SCL都是双向的。
(2)每个器件都有一个唯一的地址以供识别,而且各器件都可以作为一个发送器或接收器(由器件的功能决定)。
(3)I2C总线的数据传输过程:
①开始:主设备产生启动信号,表明数据传输开始。
②地址:主设备发送地址信息,包含7位的从设备地址和1位的数据方向指示位(读或写位,表示数据流的方向)。
③数据:根据指示位,数据在主设备和从设备之间进行传输。数据一般以8位传输,MSB先传;具体能传输多少量的数据并没有限制。接收器产生1位的ACK(应答信号)表明收到了每个字节。传输过程可以被中止和重新开始。
④停止:主设备产生停止信号,结束数据传输。
【问题2】
在一般的硬件设计尤其是IIC的电路设计中,对于SDA和SCL两线,由于其内部是漏极开路(open-drain),通过上拉电阻外加一个3.3V电源,用于增强系统的驱动能力。
同时在电源设计中,为了去除干扰噪声,需要对电源进行滤波处理,通常采用电容进行滤波处理,以保护系统电源信号的稳定性。
【问题3】
根据题干的描述可以得到公式如下:
(1)(自动装载寄存器ARR的值+1)*时钟频率=PWM频率
代入公式进行计算:(ARR+1)*1KHz=100KHz,可得到ARR=99;
(2)PWM占空比=CCR/(ARR+1)
代入公式进行计算:20%=CCR/(99+1),可以得到CCR寄存器为20。
【问题4】
根据问题的描述信息,可以获得系统的流程图:
系统启动,如果定时器到,需要检查一次无线模块数据的接收,并进行计数增加。对计数进行判断,如果是除2的余为0则说明是2次中断的倍数到达,需要进行MPU6050单元的数据读取和处理,如果中断是4的倍数,那么就说明需要计算飞控板系统的姿态,并对电机进行调速控制。如果是200次的倍数,则需要采集电池电压,并通过无线模块把电池电压发送给遥控板。
第 3 题
阅读以下关于某嵌入式系统多路数据采集的说明,回答问题1至问题3,将解答填入答题纸的对应栏内。
【说明】
某嵌入式系统中,存在16路数据采集通道,为了提高数据采集的可靠性,对16路采集通道均采用双余度设计,为了监控采集通道是否发生故障,对各路双余度通道采集值进行比较,只有当该通道两个余度设备采集值均不小于45时,才表示该路通道正常。设计人员设计函数num_of_passer用于统计无故障通道数目,在该函数的设计中考虑了如下因素:
(1)采用如下数据结构存储通道号及采集值:
(2)当输入参数异常时,函数返回4;
(3)若正确统计了无故障通道数目,则返回该数目;
(4)该函数需要两个输入参数,第一个参数是用于存储通道号及余度采集值的数组,第二个参数为通道总数目。
开发人员根据上述要求使用ANSI C对代码实现如下(代码中第一个数字代表行号):
【问题1】(3分)
嵌入式软件中通常使用圈复杂度来衡量程序的可维护性(一般要求圈复杂度不大于10),请计算函数num_of_passer的圈复杂度。
【问题2】(6分)
作为测试人员,请参照表3-1序号1的方式使用代码审查的方法找出该程序中所包含的至少3处错误。
【问题3】(6分)
覆盖率是度量测试完整性的一个手段,也是度量测试有效性的一个手段。在嵌入式软件白盒测试过程中,通常以语句覆盖率、分支覆盖率和MC/DC覆盖率作为度量指标,请指出对函数num_of_passer达到100%语句覆盖、100%分支(DC)覆盖和100%MC/DC覆盖所需的最少测试用例数目。
答案与解析
- 试题难度:一般
- 知识点:嵌入式系统实施知识>软件测试
- 试题答案:
【问题1】
圈复杂度:7
【问题2】【问题3】
- 试题解析:
本题考查软件测试的一些基本概念和通过代码审查查找软件缺陷以及设计测试用例的能力。
此题目要求考生认真阅读题目所给的软件设计说明信息和软件代码,熟悉结构体数据类型和不同代码覆盖率的要求,结合软件测试的一些基本概念,在此嵌入式软件中进行实际应用。
【问题1】
通过对控制流图的分析和判断来计算环形复杂度。
圈复杂度也称为环形复杂度、程序环境复杂度,是一种为程序逻辑复杂性提供定量测度的软件度量,将该度量用于计算程序的基本的独立路径数目,为确保所有路径至少执行一次的测试数量的上界。有以下三种方法计算圈复杂度:
(1)没有流程图的算法:基数为1,碰到以下项加1;分支数(如if、for、while和do while);switch中的case语句数;如果条件是2个复合条件的话,则加2,否则加1。
(2)给定流图G的圈复杂度V(G),定义为V(G)=P+1,P是流图G中判定节点的数量。
(3)给定流图G的圈复杂度V(G),定义为V(G)=E-N+2,E是流图中边的数量,N是流图中节点的数量。【问题2】
代码检查法主要检查代码和程序设计的一致性,代码结构的合理性,代码编写的标准性、可读性,代码逻辑表达的正确性等方面。
【问题3】
覆盖率是度量测试完整性的一个手段,也是度量测试有效性的一个手段。在嵌入式软件白盒测试过程中,通常以语句覆盖率、分支覆盖率和MC/DC覆盖率作为度量指标。
1.语句覆盖
设计足够多的测试用例,使得被测试程序中的每条可执行语句至少被执行一次。
2.分支覆盖
设计足够多的测试用例,使得被测试程序中的每个判断的“真”、“假”分支至少被执行一次。
3.MC/DC覆盖
要求在一个程序中每一种输入输出至少得出现一次,在程序中的每一个条件必须产生所有可能的输出结果至少一次,并且每一个判定中的每一个条件必须能够独立影响一个判定的输出,即在其他条件不变的前提下仅改变这个条件的值,而使判定结果改变。如上图所示,要使语句块1和语句块2各执行1次,至少需要两个测试用例。
如上图的红框所示,需要覆盖这两个判定,每个判定为真和假分别出现1次。
函数num_of_passer在第4行和第7行有两处条件判断,为了使程序中每个判定取所有可能值至少一次,第4行需要取TRUE和FALSE,第7行需要取TRUE和FALSE。由于第4行取FALSE时,就能覆盖到第7行判定,同时又由于第7行的判定在一个大于一次的循环中,一个测试用例就可以覆盖到第7行的TRUE和FALSE,所以函数num_of_passer100%的分支覆盖也最少需要两个测试用例就可以满足,即一个第4行取TRUE的测试用例和一个第4行取FALSE、第7行取TRUE和FALSE的测试用例即可,由于第7行的条件判断在多次循环中,取TRUE和FALSE的测试用例也比较好构造。
假设array==NULL条件为A1, NUM==0为条件B1, array[n].value1>45条件为A2, array[n].value2>45条件为B2。
则需要的测试用例为如下表格的红色字体所示,需要4个用例数。
第 4 题
阅读以下关于数据采集与处理系统的说明,回答问题1至问题3,将答案填入答题纸的对应栏内。
【说明】
某公司承接了一个数据采集与处理系统的项目,由刘工负责系统的方案设计,刘工的设计方案如图4-1所示。该方案是基于PCI总线的多功能处理系统,PCI设备1是以太网,PCI设备2用于数据采集,PCI设备3、PCI设备4用于和该系统中的其他处理模块进行互联,LEGACY设备1、LEGACY设备2用于处理系统中一些慢速设备。
【问题1】(3分)
在以下描述PCI总线的基本概念中,正确的表述有(1)、(2)、(3)、(4)、(5)、(6)。
A.PCI总线是一个与处理器有关的高速外围总线
B.PCI总线的基本传输机制是猝发式传送
C.PCI设备一定是主设备
D.PCI的物理地址与其他总线一样,是由内存地址空间和I/O地址组成
E.PCI设备的地址译码不能对配置空间直接寻址
F.PCI设备识别主要是对开发商代码和设备代码进行识别
G.访问配置空间时,PCI桥应提供IDSEL信号以选择PCI设备
H.系统中只允许有一条PCI总线
I.PCI总线是高速串行总线
J.PCI总线有3种桥,即HOST/PCI 桥,PCI/PCI桥,PCI/LEGACY桥
K.PCI桥是可以把一条总线的地址空间映射到另一条总线的地址空间
【问题2】(4分)
PCI设备2和主CPU之间采用双口RAM方式交换数据,双口RAM是常见的共享式多端口存储器,其最大的特点是存储数据共享。它允许两个独立的CPU或控制器同时异步访问存储单元。既然数据共享,就必须存在访问仲裁控制,否则就会出现错误或冲突。内部仲裁逻辑控制提供以下功能:对同一地址单元访问的时序控制;存储单元数据块的访问权限分配;信令交换逻辑(例如中断信号)等。
两个端口对同一内存操作有4种情况:
A.两个端口同时对同一地址单元读出数据:
B.两个端口同时对同一地址单元写入数据;
C.两个端口不同时对同一地址单元存取数据;
D.两个端口同时对同一地址单元,一个写入数据,另一个读出数据。
在上述情况下,两个端口的存取不会出现错误的是(1)和(2),会出现写入错误的是(3),会出现读出错误的是(4)。
【问题3】(8分)
PCI设备2和主CPU之间通过双端口存储器进行数据交换。刘工设计了环形队列的实现方式。设备2向环形队列写入数据,主CPU从环形队列读取数据。环形队列是一个首尾相连的FIFO数据结构,采用数组存储,到达尾部时将转回到0位置,该转回是通过取模操作来实现的。因此环形队列逻辑上是将数组元素q[0]与q[MAX-l]连接,形成一个存放队列的环形空间。为了方便读写,还要用数组下标来指明队列的读写位置,其中head指向可以读的位置,tail指向可以写的位置,环形队列如图4-2所示。
使用环形队列时需要判断队列为空还是为满。当tail追上head时,队列为满,当head追上tail时,队列为空。通常判断环形队列为空/为满有两种判断方法。
1.附加一个标志位tag,当head赶上tail,队列空,则令tag=0,当tail赶上head,队列满,则令tag=l;
2.限制tail赶上head,即队尾结点与队首结点之间至少留有一个元素的空间。队列空:head==tai;队列满:(tail+1)%MAXN==head。
如果采用第一种方法(即附加标志实现算法),则环形队列的结构定义如下:
初始化环形队列的c语言代码为:
判断队列为空的C语言代码为(1)。
判断队列为满的C语言代码为(2)。
入队操作时,如果队列不满,则入队后更新尾指针的C语言代码为q->tail=(3)。
出队操作时,如果队列不空,则出队后更新头指针的C语言代码为q->head=(4)。
如果采用第二种方法,还采用上述数据结构,初始化环形队列的C语言代码为:
判断队列为空的C语言代码为(5)。
判断队列为满的C语言代码为(6)。
入队操作时,如果队列不满,则入队后更新尾指针的C语言代码为q->tail=(7)。
出队操作时,如果队列不空,则出队后更新头指针的C语言代码为q->head=(9)。
答案与解析
- 试题难度:一般
- 知识点:嵌入式系统总线&通信接口>其它
- 试题答案:
【问题1】
(1)~(6):B、E、F、G、J、K
【问题2】
(1)A
(2)C
(3)B
(4)D
【问题3】
(1)(q->head==q->tail)&&(q->tag=0)
(2)((q->head==q->tail)&&(q->tag=1))
(3)(q->tail+1)%q->size
(4)(q->head+1)%q->size
(5)(q->head==q->tail)
(6)(q->head==(q->tail+1)%q->size))
(7)(q->tail+1)%q->size
(8)(q->head+1)%q->size - 试题解析:
本题考查嵌入式系统中计算机总线、存储、环形队列等相关知识。
【问题1】
该方案是基于PCI总线的多功能处理系统。PCI(Peripheral Component Interconnect)总线是一种高性能局部总线,是为了满足外设间以及外设与主机间高速数据传输而提出来的。在数字图形、图像和语音处理,以及高速实时数据采集与处理等对数据传输率要求较高的应用中,采用PCI总线来进行数据传输,可以解决原有的标准总线数据传输率低带来的瓶颈问题。
PCI总线是一种树型结构,并且独立于CPU,可以和CPU并行操作。PCI总线上可以挂接PCI设备和PCI桥片,一个PCI设备可以既是主设备也是从设备,但是在同一个时刻,这个PCI设备或者为主设备或者为从设备。在PCI总线中有3类设备,PCI主设备、PCI从设备和桥设备。其中PCI从设备只能被动地接收来自HOST主桥,或者其他PCI设备的读写请求;而PCI主设备可以通过总线仲裁获得PCI总线的使用权,主动地向其他PCI设备或者主存储器发起存储器读写请求。而桥设备的主要作用是管理下游的PCI总线,并转发上下游总线之间的总线事务。PCI总线有3种桥,即HOST/PCI桥、PCI/PCI桥和PCI/LEGACY 桥。
PCI总线的地址总线与数据总线是分时复用的。这样做的好处是,一方面可以节省接插件的管脚数,另一方面便于实现猝发数据传输。在做数据传输时,由一个PCI设备做发起者(主控,Initiator或Master),而另一个PCI设备做目标(从设备,Target或Slave)。总线上的所有时序的产生与控制,都由Master来发起。PCI总线在同一时刻只能供一对设备完成传输,这就要求有一个仲裁机构(Arbiter),来决定谁有权力拿到总线的主控权。
PCI总线有如下显著的特点:
(1)高速性,PCI局部总线以33MHz的时钟频率操作,采用32位数据总线,数据传输速率可高达132MB/S,远超过以往各种总线。而早在1995年6月推出的PCI总线规范2.1已定义了64位、66MHz的PCI总线标准。因此PCI总线完全可为未来的计算机提供更高的数据传送率。另外,PCI总线的主设备(Master)可与计算机内存直接交换数据,而不必经过计算机CPU中转,也提高了数据传送的效率。
(2)即插即用性,PCI设备识别主要是对开发商代码和设备代码进行识别,PCI设备的硬件资源,则是由计算机根据其各自的要求统一分配,绝不会有任何的冲突问题。作为PCI板卡的设计者,不必关心计算机的哪些资源可用,哪些资源不可用,也不必关心板卡之间是否会有冲突。
(3)可靠性,PCI独立于处理器的结构,形成一种独特的中间缓冲器设计方式,将中央处理器子系统与外围设备分开。这样用户可以随意增添外围设备,以扩充计算机系统而不必担心在不同时钟频率下会导致性能的下降。PCI总线增加了奇偶校验错(PERR)、系统错(SERR)、从设备结束(STOP)等控制信号及超时处理等可靠性措施,使数据传输的可靠性大为增加。
(4)复杂性,PCI总线强大的功能大大增加了硬件设计和软件开发的实现难度。硬件上要采用大容量、高速度的CPLD或FPGA芯片来实现PCI总线复杂的功能。软件上则要根据所用的操作系统,用软件工具编制支持即插即用功能的设备驱动程序。
(5)自动配置,PCI总线规范规定PCI设备可以自动配置。PCI定义了3种地址空间:存储器空间、输入/输出空间和配置空间,每个PCI设备中都有256字节的配置空间用来存放自动配置信息,在系统初始化时,通过idsel引脚片选决定PCI设备,自动根据读到的有关设备的信息,结合系统的实际情况为设备分配存储地址、中断和某些定时信息。
(6)共享中断,PCI总线是采用低电平有效方式,多个中断可以共享一条中断线。
(7)扩展性好,如果需要把许多设备连接到PCI总线上,而总线驱动能力不足时,可以采用多级PCI总线,这些总线上均可以并发工作,每个总线上均可挂接若干设备。因此PCI总线结构的扩展性是非常好的。
(8)多路复用,在PCI总线中为了优化设计采用了地址线和数据线共用一组物理线路,即多路复用。PCI接插件尺寸小,又采用了多路复用技术,减少了元件和管脚个数,提高了效率。
(9)严格规范,PCI总线对协议、时序、电气性能、机械性能等指标都有严格的规定,保证了PCI的可靠性和兼容性。由于PCI总线规范十分复杂,其接口的实现就有较高的技术难度。
【问题2】
双口RAM是在一个存储器上具有两套完全独立的数据线、地址线和读写控制线,并允许两个独立的系统同时对该存储器进行随机性的访问。每个读写口都有一套自己的地址寄存器和译码电路,可以并行地独立工作。两个读写口可以按各自接收的地址同时读出或写入,或一个写入而另一个读出。与两个独立的存储器不同,两个读写口的访存空间相同,可以访问同一个存储单元。通常使双端口存储器的一个读写口面向CPU,另一个读写口则面向外设或输入/输出处理机。如图4-3所示。双口RAM最大的特点是存储数据共享。一个存储器配备两套独立的地址、数据和控制线,允许两个独立的CPU或控制器同时异步地访问存储单元。因为数据共享,就必须存在访问仲裁控制。当两个端口对同一内存操作时,当两个端口同时对同一地址单元读出数据,或者两个端口不同时对同一地址单元存取数据的情况下,两个端口的存取不会出现错误;当两个端口同时对同一地址单元写入数据的情况下,会出现写入错误;当两个端口同时对同一地址单元,一个写入数据,另一个读出数据的情况下,会出现读出错误。
【问题3】
环形队列是在实际编程极为有用的数据结构,它有如下特点:它是一个首尾相连的FIFO的数据结构,采用数组的线性空间;数据组织简单,能很快知道队列是否满或空;能以很快的速度来存取数据。因为简单高效,甚至在硬件都实现了环形队列。
内存上没有环形的结构,因此环形队列实际上是数组的线性空间来实现。那当数据到了尾部如何处理呢?它将转回到0位置来处理。这个转回是通过数组下标索引取模操作(Index% MAXN)来实现的。
因此环列队列的是逻辑上将数组元素q[0]与q[MAXN-l]连接,形成一个存放队列的环形空间。为了方便读写,还要用数组下标来指明队列的读写位置。定义Head/tail两个变量,其中head指向可以读的位置,tail指向可以写的位置。
环形队列的关键是判断队列为空,还是为满。当tail追上head时,队列为满;当head追上tail时,队列为空。但如何知道谁追上谁,还需要一些辅助的手段来判断。
如何判断环形队列为空、为满有两种判断方法。一是附加一个标志位tag,当head赶上tail,队列空,则令tag=0,当tail赶上head,队列满,则令tag=l;二是限制tail赶上head,即队尾结点与队首结点之间至少留有一个元素的空间。队列空时head==tail,队列满时(tail+1)%MAXN==head。
入队操作时,如队列不满,则写入9->1311=(9->tail+1)%q->size;出队操作时,如果队列不空,则从head处读出。下一个可读的位置在q->head=(q->head+1)%q->size。
第 5 题
阅读以下关于C语言编程方面的说明和程序,回答问题1至问题3,将答案填入答题纸的对应栏内。
【说明】
在开发某嵌入式系统时,设计人员根据系统要求,分别编写了如下程序,其中:
程序1是关于文件操作的一段程序。
程序2是某信息管理系统的系统登录和密码验证程序,规定密码最长为20个字符。首先,打开密码文件syS_COde,如果成功,则将文件中的密码信息与用户输入的密码进行比较,若相等,则身份验证通过并进入信息管理系统,否则输出错误信息并退出登录系统。如果打开文件sys_code失败,则由用户输入密码并保存到密码文件sys_code。
【问题1】(3分)
变量存储类型是指数据在内存中存储的方法,即确定所定义的变量在内存中的存储位置,也确定了变量的作用域和生存期,内部变量有3种存储类型。假设有一个内部整型变量aa,请按不同存储类型给出相应的变量声明。
【问题2】(6分)
王工在编写某嵌入式程序时,用到对文件系统的操作,由于要保证系统的安全性,要求必须使用文件检测函数feof()和ferror(),完成【程序1】中的空(1)~(3),将答案写到答题纸相应的位置。
【问题3】(6分)
王工根据系统的需求编写了【程序2】,请填写其中的空(1)~(3),将解答填入答题纸的对应栏内。
答案与解析
- 试题难度:一般
- 知识点:嵌入式软件程序设计>嵌入式程序设计>面向过程的语言
- 试题答案:
【问题1】
自动内部变量:int aa;或auto int aa;
寄存器内部变量:register int aa;或register aa;
静志内部变量:static int aa;
【问题2】
(2)NULL或者0
(2)!feof(fp)
(3)ferror(fp)
【问题3】
(1)sign=l或sign或sign!=0或等价表示形式
(2)syspwd[i]或*(syspwd+i)或等併表示形式
(3)usrpwd,syspwd或syspwd,usrpwd或等价表示形式 - 试题解析:
本题考查C语言的基本概念和编程方面的基本知识。
【问题1】
在C语言中,对变量的存储类型说明有以下四种:
(1)auto 自动内部变量-------内部变量
(2)register 寄存器内部变量--------内部变量
(3)extern 外部变量
(4)static 静态内部变量-----------内部变量
在介绍了变量的存储类型之后,可以知道对一个变量的说明不仅应说明其数据类型,还应说明其存储类型。
因此变量说明的完整形式应为:存储类型说明符数据类型说明符变量名,变量名…;例如:
自动内部变量:int aa;或auto int aa;
寄存器内部变量:register int aa;或register aa;
静态内部变量:static int aa;
1.自动内部变量的类型说明符为auto(缺省的符号,不写就是默认auto)。
这种存储类型是C语言程序中使用最广泛的一种类型。C语言规定,函数内凡未加存储类型说明的变量均视为自动变量,也就是说自动变量可省去说明符auto。
自动内部变量的作用域仅限于定义该变量的个体内。在函数中定义的自动内部变量,只在该函数内有效。在复合语句中定义的自动内部变量只在该复合语句中有效。
2.外部变量的类型说明符为extern
(1)外部变量和全局变量是对同一类变量的两种不同角度的提法。全局变量是从它的作用域提出的,外部变量从它的存储方式提出的,表示了它的生存期。
(2)当一个源程序由若干个源文件组成时,在一个源文件中定义的外部变量在其他的源文件中也有效。
3.静态内部变量static
静态局部变量的特点为:
(1)静态局部变量在函数内定义,但不像自动变量那样,当调用时就存在,退出函数时就消失。静态局部变量始终存在着,也就是说它的生存期为整个源程序。
(2)静态局部变量的生存期虽然为整个源程序,但是其作用域仍与自动变量相同,即只能在定义该变量的函数内使用该变量。退出该函数后,尽管该变量还继续存在,但不能使用它。
(3)允许对构造类静态局部量赋初值。在数组一章中,介绍数组初始化时已作过说明。若未赋以初值,则由系统自动赋以0值。
(4)对基本类型的静态局部内部变量若在说明时未赋以初值,则系统自动赋予0值。而对自动变量不赋初值,则其值是不定的。根据静态局部变量的特点,可以看出它是一种生存期为整个源程序的量。虽然离开定义它的函数后不能使用,但如再次调用定义它的函数时,它又可继续使用,而且保存了前次被调用后留下的值。因此,当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量。虽然用全局变量也可以达到上述目的,但全局变量有时会造成意外的副作用,因此仍以采用局部静态内部变量为宜。
4.静态全局内部变量
全局变量(外部变量)的说明之前再冠以static就构成了静态的全局变量。全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其他源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其他源文件中引起错误。从以上分析可以看出,把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。因此static这个说明符在不同的地方所起的作用是不同的。应予以注意。
4.寄存器变量register
上述各类变量都存放在存储器内,因此当对一个变量频繁读写时,必须要反复访问内存储器,从而花费大量的存取时间。为此,C语言提供了另一种变量,即寄存器变量。这种变量存放在CPU的寄存器中,使用时,不需要访问内存,而直接从寄存器中读写,这样可提高效率。寄存器变量的说明符是register。对于循环次数较多的循环控制变量及循环体内反复使用的变量均可定义为寄存器变量。
【问题2】
feof( )函数用于检测文件当前读写位置是否处于文件尾部。只有当当前位置不在文件尾部时,才能从文件读数据。
函数定义:int feof(FILE *fp)
返回值:0或非0
如果fb所指的文件的位置处于文件尾部,返回非0;否则返回0。在对文件进行读操作前,应用这个函数测试当前位置是否在文件尾部。
文件操作的每个函数在执行中都有可能出错,C语言提供了相应的标准函数ferror用于检测文件操作是否出现错误。
函数定义:int ferror (FILE *fp)
返回值:0或非0
Ferror函数检查上次对文件中所进行的操作是否成功,如果成功则返回0;否则返回非0。因此,应该及时调用ferror函数检测操作执行的情况,以免丢失信息。