当前位置:首页计算机类软件水平考试中级嵌入式系统设计师->2015年嵌入式系统设计师下午真题卷

2015年嵌入式系统设计师下午真题卷

推荐等级:

发布时间: 2021-12-17 11:05

扫码用手机做题

试卷预览

1 问答题 1分

阅读以下关于某四轴飞行器系统设计的说明,回答下列问题。

[说明] 在某四轴飞行器系统设计中,利用惯性测量单元(IMU)、PID电机控制、2.4G无线遥控通信和高速空心直流电机驱动等技术来实现一个简易的嵌入式四轴飞行器方案。整个系统的设计包括飞控板和遥控板两部分,两者之间采用2.4G无线模块进行数据传输。

飞控板采用高速单片机STM32作为处理器,采用含有三轴陀螺仪、三轴加速度计的运动传感器MPU16050作为惯性测量单元,通过2.4G无线模块和遥控板进行通信,最终根据PID控制算法以PWM方式驱动空心电机来控制目标。

中级嵌入式系统设计师,历年真题,2015年嵌入式系统设计师下午真题卷

图1为李工设计的系统总体框图。

飞控板和遥控板的核心处理器都采用STM32 F103。飞控系统的惯性测量单元采用MPU6050测量传感器,MPU6050使用IIC接口,时钟引脚SCL、数据引脚SDA和数据中断引脚分别接到STM32的对应管脚,图2为该部分原理图。

遥控板采用STM32单片机进行设计,使用AD对摇杆模拟数据进行采集,采用NRF2401无线模块进行通信,图3为该部分原理图。

李工所设计的系统软件同样包含飞控板和遥控板两部分,飞控板软件的设计主要包括无线数据的接收、自身姿态的实时计算、电机PID增量的计算和PWM的电机驱动。

遥控板主控制器软件通过ADC外设对摇杆数据进行采集,把采集到的数据通过2.4G无线通信模块发送至飞控板。图4为飞控系统的软件流程示意图。

中级嵌入式系统设计师,历年真题,2015年嵌入式系统设计师下午真题卷

中级嵌入式系统设计师,历年真题,2015年嵌入式系统设计师下午真题卷

中级嵌入式系统设计师,历年真题,2015年嵌入式系统设计师下午真题卷

1、由图1系统总体框图设计可知,飞控板和遥控板之间是用2.4G无线通信进行数据传输,各自主处理器和无线通信模块之间是SPI接口。同时,在飞控板上,处理器和惯性测量单元是通过IIC进行数据交互。以下关于SPI接口和IIC接口的描述中,正确的是:______ 、______、______、______。 A.SPI和IIC都是主从式通信方式 B.SPI的数据收发线是各自独立的,IIC也是同样 C.SPI和IIC的传输都不需要片选控制 D.IIC总线是一个多主机的总线,可以连接多于一个能控制总线的器件到总线 E.IIC总线包括标准模式,快速模式和高速模式,相互之间的传输速度差异并不大 F.在原理设计中,到底采用SPI和IIC哪种方式,需要依据外设芯片的接口而定 G.SPI是一种环形总线结构 H.在IIC总线上,可以有多个从设备具有相同的IIC地址

2、(1)图2飞控板部分原理图中,R4的作用是什么?

(2)图3遥控板部分原理图中,C11、C12、C13、C14的作用是什么?

3、在STM32处理器的PWM使用过程中,最为关键的就是PWM的频率和占空比。PWM的频率依赖于PWM模块的参考时钟频率,自动装载寄存器ARR的值加1之后再乘以参考时钟频率即可得到PWM的频率。

PWM的占空比是用捕获比较寄存器CCR和自动装载寄存器ARR获得的,PWM占空比=CCR/(ARR+1)。 假设当前主控板的STM32处理器PWM模块的参考时钟频率为1kHz,要将PWM模块的频率设置为100kHz,则ARR寄存器的值应设置为多少?如果此时占空比希望设置为20%,那么CCR寄存器的值应该设置为多少?

4、5毫秒进行一次定时器的触发,每次中断都会检查一次无线模块数据的接收,以确保飞控系统控制信息的实时性。每2次中断(即1毫秒)读取一次。MPU16050单元的数据,并进行算法处理。每4次中断(即2毫秒)通过计算当前飞控板系统的姿态,结合遥控端的目标姿态,根据两者的差值通过PID控制算法对各个电机进行调速控制。每200次中断(即100毫秒)采集一次电池电压,然后通过无线模块把电池电压发送给遥控板,以告知操作人员当前电压的大小。 图4为飞控系统软件实现的简要流程图,根据以上描述,请补全图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)读取MPU16050单元的数据,并进行算法处理 (4)计算当前飞控板系统的姿态,对各个电机进行调速控制 (5)count%200=0 (6)采集电池电压,通过无线模块把电池电压发送给遥控板

1、本题考查嵌入式软硬件系统协同设计过程中的知识及应用。 此类题目要求考生认真阅读题目中的题干描述,仔细理解设计的原理框图,详细观察提供的硬件原理图和所描述的软件实现流程示意图。

前后结合进行题目分析。 由图1系统总体框图可知,飞控板和遥控板之间是用2.4G无线通信进行数据传输,各自主处理器和无线通信模块之间是SPI接口。同时,在飞控板上,处理器和惯性测量单元是通过IIC进行数据交互。 IIC (Inter-Integrated Circuit)和SPI (Serial Peripheral Interface)这两种通信协议非常适合近距离低速芯片间进行通信。Philips (for IIC)和Motorola (for SPI)出于不同背景和市场需求制定了这两种标准通信协议。IIC开发于1982年,SPI总线首次推出是在1979年。

SPI包含4根信号线,分别是: (1)SCLK: Serial Clock (output from master) (2)MOSI, SIMO: Master Output, Slave Input(output from master) (3)MISO, SOMI: Master Input, Slave Output(output from slave) (4)SS: Slave Select (active low, output from master)

SPI是单主设备(single-master)通信协议,这意味着总线中只有一支中心设备能发起通信。

当SPI主设备想读/写从设备时,它首先拉低从设备对应的SS线(SS是低电平有效),接着开始发送工作脉冲到时钟线上,在相应的脉冲时间上,主设备把信号发到MOSI实现“写”,同时可对MISO采样而实现“读”。SPI有4种操作模式——模式0、模式1、模式2和模式3,它们的区别是定义了在时钟脉冲的哪条边沿转换(toggles)输出信号,哪条边沿采样输入信号,还有时钟脉冲的稳定电平值(就是时钟信号无效时是高还是低)。

与SPI的单主设备不同,IIC是多主设备的总线,IIC没有物理的芯片选择信号线,没有仲裁逻辑电路,只使用两条信号线—— ‘serial data’ (SDA)和‘serial clock’(SCL)。IIC数据传输速率有标准模式(100kbps)、快速模式(400bps)和高速模式(3.4Mbps),另外一些变种实现了低速模式(10kbps)和快速+模式(1Mbps)。

物理实现上,IIC总线由两根信号线和一根地线组成。IIC通信过程大概如下。首先,主设备发一个START信号,这个信号就像对所有其他设备喊:请大家注意!然后其他设备开始监听总线以准备接收数据。接着,主设备发送一个7位设备地址加一位的读写操作的数据帧。当所有设备接收数据后,比对地址以判断自己是否为目标设备。如果比对不符,设备进入等待状态,等待STOP信号的来临;如果比对相符,设备会发送一个应答信号——ACKNOWLEDGE作回应。当主设备收到应答后便开始传送或接收数据。数据帧大小为8位,尾随1位的应答信号。主设备发送数据,从设备应答;相反主设备接收数据,主设备应答。当数据传送完毕,主设备发送一个STOP信号,向其他设备宣告释放总线,其他设备回到初始状态。

在物理实现上,SCL线和SDA线都是漏极开路(open-drain),通过上拉电阻外加一个电压源。当把线路接地时,线路为逻辑0,当释放线路,线路空闲时,线路为逻辑1。基于这些特性,IIC设备对总线的操作仅有“把线路接地”——输出逻辑0。

2、在一般的硬件设计尤其是IIC的电路设计中,对于SDA和SCL两线,由于其内部是漏极开路(open-drain),通过上拉电阻外加一个3.3V电源,用于增强系统的驱动能力。 同时在电源设计中,为了去除干扰噪声,需要对电源进行滤波处理,通常采用电容进行滤波处理,以保护系统电源信号的稳定性。

3、在STM32处理器的PWM使用过程中,最为关键的就是PWM的频率和占空比。PWM的频率依赖于PWM模块的参考时钟频率,自动装载寄存器ARR的值加1之后再乘以参考时钟频率即可得到PWM的频率。

PWM的占空比是用捕获比较寄存器CCR和自动装载寄存器ARR获得的,PWM占空比=CCR/(ARR+1)。 进行ARR寄存器的值计算过程中,符合的公式为: ARR寄存器=要设置的频率/时钟频率-1。 根据占空比则指导CCR的设置符合的公式为: CCR寄存器=(占空比)×(ARR+1)。

4、飞控系统每0.5毫秒进行一次定时器的触发,每次中断都会检查一次无线模块数据的接收,以确保飞控系统控制信息的实时性。每2次中断(即1毫秒)读取一次MPU6050单元的数据,并进行算法处理。每4次中断(即2毫秒)通过计算当前飞控板系统的姿态,结合遥控端的目标姿态,根据两者的差值通过PID控制算法对各个电机进行调速控制。

每200次中断(即100毫秒)采集一次电池电压,然后通过无线模块把电池电压发送给遥控板,以告知操作人员当前电压的大小。 根据以上说明,可以知道其实现流程应该为: 系统启动,如果定时器到,需要检查一次无线模块数据的接收,并进行计数增加。对计数进行判断,如果是除2的余为0则说明是2次中断的倍数到达,需要进行MPU6050单元的数据读取和处理,如果中断是4的倍数,那么就说明需要计算飞控板系统的姿态,并对电机进行调速控制。如果是200次的倍数,则需要采集电池电压,并通过无线模块把电池电压发送给遥控板。

2 问答题 1分

某公司承接了某嵌入式系统的研制任务。该嵌入式系统由数据处理模块、系统管理模块、FC网络交换模块和智能电源模块组成,系统组成如图1所示。数据处理模块处理系统的应用任务;系统管理模块除了处理系统的应用任务外,还负责管理整个嵌入式系统;FC网络交换模块采用消息机制,支持广播和组播,主要负责系统的数据交换;智能电源模块负责给其他模块供电,该模块根据系统命令可以给其他模块供电或停止供电。

中级嵌入式系统设计师,历年真题,2015年嵌入式系统设计师下午真题卷

1、该系统的软件大部分是用C语言编程的,编程人员经常会使用运算符,请按优先级由高到低的次序,重新排序下面的运算符:%, =, <=, &&。

2、该系统的开发要求按软件能力成熟度模型CMM 3级开发,请回答下列问题:

(1)CMM 3级包含多少个关键过程域?

(2)请写出CMM 3级的关键过程域。

(3)CMM2级包含多少个关键过程域?

(4)在对该开发软件单位进行CMM 3级达标评级时,只需检查3级的关键过程域还是3级和2级的关键过程域都需要检查?

3、(1)在本系统中,FC网络采用何种拓扑结构?请从如下4项中选择最为合适的。 A.总线 B.树型 C.星形 D.点对点

(2)FC网络除了用于交换的光纤基础架构,还必须有高性能的I/O通道结构支持,I/O通道在FC网络中的优势是什么?

4、智能电源模块首先进行系统初始化,初始化后各设备就可使用,再根据系统初始配置表对嵌入式系统的其他模块供电。

智能电源模块通常完成两件事情:

一、周期性地查询本模块温度、各路电流(给各模块供电的)以及电源模块的供电是否异常,如果异常,则进行异常处理,并报系统管理模块,由系统管理模块进行决策;

二、进入中断处理程序,处理系统管理模块的各种命令,如果系统管理模块命令关机下电,则智能电源模块对所有模块(也包括自己)进行下电处理

中级嵌入式系统设计师,历年真题,2015年嵌入式系统设计师下午真题卷

图2是智能电源模块上的管理软件处理流程图,请完成该流程图,给(1)~(5)处填空。

查看答案 开始考试
正确答案:

本题解析:

1、按优先级由高到低的次序,运算符排序为: %, <=, &&, =

2、(1)CMM 3级(已定义级)包括7个关键过程区域 (2)同行评审、组间协调、软件产品工程、集成软件管理、培训大纲、组织过程定义、组织过程集点 (3)CMM 2级(可重复级)包括6个关键过程区域 (4)3级和2级的关键过程域都需要检查

3、(1)C (2)简单、廉价、高速

4、(1)按初始配置表给各模块供电 (2)电源模块温度检测 (3)向其他模块供电的各路电流检测 (4)屏蔽中断 (5)处理系统控制模块发来命令

1、本题考查嵌入式系统设计中的基本C语言编程、软件工程化、FC网络以及智能电源管理设计等知识及应用。 本问题考查C语言的基础知识。

在C语言中,对各种运算符的优先级是有规定的,必须掌握。优先级最高者其实并不是真正意义上的运算符,包括:数组下标、函数调用操作符、各结构成员选择操作符。它们都是自左向右结合。 单目运算符的优先级仅次于上述运算符,在所有的真正意义的运算符中,它们的优先级最高。

双目运算符的优先级低于单目运算符的优先级。在双目运算符中,算术运算符的优先级最高,移位运算符次之,关系运算符再次之,接着就是逻辑运算符,赋值运算符,最后是条件运算符。

总结以下两点: (1)任何一个逻辑运算符的优先级低于任何一个关系运算符; (2)移位运算符的优先级比算术运算符要低,但是比关系运算符要高。 下表是C语言运算符优先级表(由上至下,优先级依次递减)。

中级嵌入式系统设计师,历年真题,2015年嵌入式系统设计师下午真题卷

综上所述,本题中运算符优先级由高到低的次序为: %,<=, &&, =

2、CMM即软件能力成熟度模型,是目前国际上最流行、最实用的软件生产过程标准和软件企业成熟度的等级认证标准。CMM是美国卡内基-梅隆大学软件工程研究所与企业、政府合作的基础上开发的模型,主要用于评价软件企业的质量保证能力。目前,国内外的很多大型企业采用这一模型,如国内的鼎新、浪潮通软、用友、金蝶、创智、亚信、华为等公司都启动了CMM软件过程改进计划。国军标GJB500-2003<<军用软件能力成熟度模型>>就是以CMM为参考蓝本而制定的。

CMM模型将软件能力成熟度自低到高依次划分,1级为初始级、2级为可重复级、3级为已定义级、4级为已管理级、5级为优化级。除等级1外,每个成熟度等级被分解成几个关键过程域,指明为了改进其软件过程组织应关注的区域,关键过程域识别出为了达到各成熟度等级所必须着手解决的问题。CMM共有18个关键过程域,其中初始级无关键过程域。

CMM 2级(可重复级)包括6个关键过程域,为软件配置管理、软件质量保证、软件子合同管理、软件项目跟踪与监督、软件项目策划、软件需求管理;

CMM 3级(已定义级)包括7个关键过程域,为同行评审、组间协调、软件产品工程、集成软件管理、培训大纲、组织过程定义、组织过程集点;

CMM 4级(已管理级)包括2个关键过程域,为软件质量管理和定量过程管理;

CMM 5级(优化级)包括3个关键过程域,为过程更改管理、技术改革管理和缺陷预防。

在CMM某一级达标时,必须是该级别的所有关键过程域满足要求,同时低级别的所有关键过程域也必须达标。因此,某单位进行CMM 3级达标评级时,对3级和2级的关键过程域都需要检查。

3、数据通信网络常见的拓扑结构由简单到复杂依次为:点对点、总线、树型、星形。 点到点型指网络中一个信息源节点连接到一个或多个目的节点,是专用的链路,具有通信效率高,延迟小的优点,但是建立多点全互联的网络具有连线多、成本高、资源利用率低等缺点。 总线型指网络中一个信息源节点连接到一个或多个目的节点,采用集中控制、令牌访问、CSMA/CD等方式,具有连线少、成本较低、资源利用率高等优点,但存在通信吞吐量低、延迟大的缺点,尤其在网络负载重的情况下。

树型指网络中所有节点挂接到一个树形结构上,可以采用集中控制、令牌访问等方式,具有连线简单、成本较低的优点,但存在通信吞吐量低、延迟大的缺点,尤其在网络负载重的情况下。 星形指网络中所有节点连接到中心交换机,节点之间的通信经过交换机路由转发,具有通信吞吐量高、延迟小、连线较简单的优点,但存在成本高、交换机单点故障风险的缺点。

本题为了满足嵌入式系统对高带宽、低延迟的通信要求,通过分析以上网络的拓扑结构特点,FC网络应选择星形结构。星形结构是最佳的方案。 SAN通常有FC SAN和IP SAN两种实现技术。FC SAN采用I/O结合光线通道,IP SAN采用iSCSI实现异地间数据交换,具有简单、廉价、高速等优势。

4、智能电源模块首先进行系统初始化,再根据系统初始配置表对嵌入式系统的其他模块供电。按照智能电源模块的工作过程,判断有无中断,如有中断,则进入中断处理程序。

如没有中断,则周期性地查询本模块温度、各路电流(给各模块供电的)以及电源模块的供电是否异常,如果异常,则进行异常处理,并报系统管理模块,由系统管理模块进行决策。

在中断处理程序中,首先屏蔽中断,喂看门狗,统计中断次数,接收系统控制模块的各种命令,处理系统控制模块发来的这些命令,打开中断。如果系统控制模块命令关机下电,则智能电源模块对所有模块(也包括自己)进行下电处理。 智能电源模块上的管理软件处理流程图如图3所示。

中级嵌入式系统设计师,历年真题,2015年嵌入式系统设计师下午真题卷

3 问答题 1分

阅读以下关于某嵌入式系统多路数据采集的说明,回答下列问题。

[说明] 某嵌入式系统中,存在16路数据采集通道,为了提高数据采集的可靠性,对16路采集通道均采用双余度设计,为了监控采集通道是否发生故障,对各路双余度通道采集值进行比较,只有当该通道两个余度设备采集值均不小于45时,才表示该路通道正常。

设计人员设计函数num_of_passer用于统计无故障通道数目,在该函数的设计中考虑了如下因素:

9采用如下数据结构存储通道号及采集值: Struct value {unsigned int No; //通道号,1到16 unsigned short Value1; //余度1采集值 unsigned short Value2; //余度2采集值 }

10当输入参数异常时,函数返回-1;

11若正确统计了无故障通道数目,则返回该数目;

12该函数需要两个输入参数,第一个参数是用于存储通道号及余度采集值的数组,第二个参数为通道总数目。

开发人员根据上述要求使用ANSI C对代码实现如下(代码中第一个数字代表行号): 1)unsigned int num_of_passer(struct value array[], unsigned int num) { 2)unsigned int n=0; //循环变量 3)unsigned int counter; //无故障通道数目 4)if((array=NULL)||(num==0)||(num>16)) 5)return-1; //当输入参数异常时,函数返回-1 6)for(n=0; nimage.png=num; n++) { 7)if((array[n].Value1>45) && ((array[n].Value2>45))) 8)counter=counter+1; } 9)return counter; }

1、嵌入式软件中通常使用圈复杂度来衡量程序的可维护性(一般要求圈复杂度不大于10),请计算函数num_of_passer的圈复杂度。

2、作为测试人员,请参照表1序号1的方式使用代码审查的方法找出该程序中所包含的至少3处错误。

中级嵌入式系统设计师,章节练习,案例分析

3、覆盖率是度量测试完整性的一个手段,也是度量测试有效性的一个手段。在嵌入式软件白盒测试过程中,通常以语句覆盖率、分支覆盖率和MC/DC覆盖率作为度量指标,请指出对函数num_of_passer达到100%语句覆盖、100%分支(DC.覆盖和100%MC/DC覆盖所需的最少测试用例数目,如表2所示。

中级嵌入式系统设计师,章节练习,案例分析

查看答案 开始考试
正确答案:

本题解析:

1、圈复杂度:7

2、中级嵌入式系统设计师,历年真题,2015年嵌入式系统设计师下午真题卷

3、中级嵌入式系统设计师,历年真题,2015年嵌入式系统设计师下午真题卷

1、本题考查软件测试的一些基本概念和通过代码审查查找软件缺陷以及设计测试用例的能力。

此题目要求考生认真阅读题目所给的软件设计说明信息和软件代码,熟悉结构体数据类型和不同代码覆盖率的要求,结合软件测试的一些基本概念,在此嵌入式软件中进行实际应用。

控制流程图分析是一个静态的分析过程,它提供静态的度量标准技术,一般主要运用在白盒测试的方法中。控制流图是McCabe复杂度计算的基础,McCabe度量标准是将软件的流程图转化为有向图,然后以图论的知识和计算方法来衡量软件的质量。

McCabe复杂度包括圈复杂度(Cyclomatic complexity)、基本复杂度、模块涉及复杂度、设计复杂度和集成复杂度等。 在软件测试的概念里,圈复杂度“用来衡量一个模块判定结构的复杂程度,数量上表现为独立线性路径条数,即合理的预防错误所需测试的最少路径条数,圈复杂度大说明程序代码可能质量低且难于测试和维护,根据经验,程序的可能错误和高的圈复杂度有着很大关系”。

圈复杂度大说明程序代码的判断逻辑复杂,可能质量低且难于测试和维护。程序的可能错误和高的圈复杂度有着很大关系。 嵌入式软件中通常使用圈复杂度来衡量程序的可维护性,一般要求圈复杂度不大于10。函数num_of_passer。的流程图如图1所示。

中级嵌入式系统设计师,历年真题,2015年嵌入式系统设计师下午真题卷

有以下3种方法计算圈复杂度:

(1)没有流程图的算法: 基数为1,碰到以下项加1: 分支数(如if、for、while和do while);switch中的case语句数; 如果条件是2个复合条件的话,则加2,否则加1。

(2)给定流程图G的圈复杂度V(G),定义为V(G)=E-N+2,E是流图中边的数量,N是流图中结点的数量。

(3)给定流程图G的圈复杂度V(G),定义为V(G)=P+1,P是流图G中判定结点的数量。

按第1种没有流程图的算法,函数num_of_passer中一个for,两个if,但是一个if是3个复合条件应该加3,另一个if是两个组合条件,应该加2,所以圈复杂度为基数(1)+for(1)+if(3)+if(2)=7,圈复杂度为7。

按第2种圈复杂度V(G),定义为V(G)=E-N+2算法,函数num_of_passer流程图中E为16,N为11,所以V(G)=16-11+2=7。

按第3种圈复杂度V(G),定义为V(G)=P+1,函数num_of_passer流程图中P为6,所以V(G)=P+1=6+1=7。

上述3种算法中的任意方法,函数num_of_passer的圈复杂度都计算为7。

2、代码审查是不执行软件代码,而通过阅读软件代码发现代码可能存在的错误的过程。

代码审查的测试内容包括检查代码和设计的一致性;检查代码执行标准的情况;检查代码逻辑表达的正确性;检查代码结构的合理性;检查代码的可读性。通过对说明的阅读,按照说明中描述的要求进行函数num_of_passer的代码审查。

阅读第1行代码,函数返回值定义为unsigned int;而在说明的第(2)条描述了当输入参数异常时,函数返回-1;这样发现说明和代码不一致,显然代码定义的unsigned int不能返回-1,此为第1处错误。修改函数返回值的定义为int类型即可。

阅读第3行代码,定义了无故障通道数目counter,在定义时未进行初始化,并且在第8行使用前依然未初始化。这就导致counter的初值为非确定值,可能出错,此为第2处错误。在第3行定义counter时初始化为0或者在使用前进行初始化为0均可。

阅读第4行代码,对模块输入参数进行合法性检查,num合法值为1至16;然后查找使用num之处,在第6行对num进行了使用,但第6行使用时却从0开始,而且是小于等于num,这就意味着如果第4行num值为最大值16,在第6行就需要循环判断17次(0到16),而本题的说明中描述很清楚,最多就16路通道,此为第3处错误。

但此问题的更改有两种方案,方案1可以更改第4行num>16为num>=16,缩小此参数的合法范围;方案2可以更改第6行n<=num为n<num减少循环次数。

阅读第7行代码,对每个通道采集的双余度值进行有效性判断。按照说明,当余度设备采集值均不小于45时,才表示该路通道正常;但代码中使用当余度设备采集值均大于45时,表示该路通道正常,在对边界点45的处理上与说明不一致,此为第4处错误。将第7行代码中的两个“>”符号修改为“>=”即可与说明一致。

3、覆盖率是度量测试完整性的一个手段,也是度量测试有效性的一个手段。在嵌入式软件白盒测试过程中,通常以语句覆盖率、分支覆盖率和MC/DC覆盖率作为度量指标。语句覆盖率指程序中每条可执行语句至少被执行一次。分支覆盖指程序中每个判定取所有可能值至少一次。

MC/DC覆盖率指在一个程序中每一种输入输出至少应出现一次,在程序中的每一个条件必须产生所有可能的输出结果至少一次,并且每个判定中的每个条件必须能够独立影响一个判定的输出,即在其他条件不变的前提下仅改变这个条件的值,而使判定结果改变。 对函数num_of_passer来说,为了使其中所有的语句至少执行一次,程序中的两种返回值必须各覆盖一次,所以为达到100%语句覆盖率,至少需要两个测试用例,即参数异常的测试用例和参数正常的测试用例。

函数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的测试用例也比较好构造。

函数num_of_passer的组合条件也出现在第4行和第7行。对第4行的组合条件需要4个测试用例来满足MC/DC覆盖,分别为①参数array为NULL,②array不为NULL且num为0,③array不为NULL且num为大于16的值,④array不为NULL且num为1到16之间的值。对第7行的组合条件需要3个测试用例来满足MC/DC覆盖,分别为①Value1>45且Value2>45,②Value1>45且Value2<=45,③Value1<=45且Value2为任意值。

由于取第4行array不为NULL且num为1到16之间值的测试用例时,程序将执行到第7行,这时由于第7行在一个多次循环中,第7行需要的3个测试用例都可以在此用例中进行覆盖,所以最少需要4个测试用例就可以使函数num_of_passer满足100%的MC/DC覆盖。

4 问答题 1分

阅读以下关于C语言编程方面的说明和程序,回答下列问题。

[说明] 在开发某嵌入式系统时,设计人员根据系统要求,分别编写了如下程序,其中: 程序1是关于文件操作的一段程序。 程序2是某信息管理系统的系统登录和密码验证程序,规定密码最长为20个字符。首先,打开密码文件sys_code,如果成功,则将文件中的密码信息与用户输入的密码进行比较,若相等,则身份验证通过并进入信息管理系统,否则输出错误信息并退出登录系统。如果打开文件sys_code失败,则由用户输入密码并保存到密码文件sys_code。

[程序1] #include image.pngstdio.h> #include image.pngstdlib.h> Void main15 { FILE *fp; char c, fname [20]; printf("输入文件名:"); Scanf("%S", fname); if((fp=fopen(fname, "r"))==______) { printf("不能打开文件:%sin", fname); exit16; } while (______) /*检测文件是否结束*/ { c=fgetc(fp); if (______) /*检测文件是否出错*/ { printf("文件读错误\n"); break; } putchar(c); } }

[程序2] void password15 { int sign=0; sign=checkcode15; if (______) { printf("\a\n\n\n\n\n\n\n\n\n\t\t密码错误, 请重新登录!"); getch 19; system("cls"); exit20; } system("cls"); printf ("\a\n\n\n\n\n\n\n\n\n\t\t"); printf("欢迎登录信息管理系统!\n"); getch 19; return; } int checkcode 15 { FILE *fp; char ch, syspwd[21]="\0"; char usrpwd[21]="\0"; int i; /*身份验证*/ if((fp=fopen("sys_code", "r"))==NULL) { system("cls"); printf("please set your identify\n"); printf("password(image.png=20): "); for(i=0; iimage.png20; i++){ ch=getchar19; if (ch=='\r' || ch=='\n') break; ______ =ch; } fp=fopen("sys_code", "w"); fputs(syspwd,fp); fclose(fp); return 0; else{ system("cls"); fgets(syspwd,21,fp); fclose(fp); printf("please enter your password:"); for(i=0; iimage.png20; i++){ ch=getehar19; if (ch=='\r' ||ch=='\n') break; usrpwd[i]=ch; } if(strcmp(______)!=0) return 1; } return 0; } }

1、变量存储类型是指数据在内存中存储的方法,即确定所定义的变量在内存中的存储位置,也确定了变量的作用域和生存期,内部变量有3种存储类型。假设有一个内部整型变量aa,请按不同存储类型给出相应的变量声明。

2、王工在编写某嵌入式程序时,用到对文件系统的操作,由于要保证系统的安全性,要求必须使用文件检测函数feof()和ferror(),完成[程序1]中的空。

3、王工根据系统的需求编写了[程序2],请填写其中的空。

查看答案 开始考试
正确答案:

本题解析:

1、自动内部变量:int aa; 或auto int aa; 寄存器内部变量:register int aa; 或register aa; 静态内部变量:static int aa;

2、(1)NULL或者0 (2)!feof(fp) (3)ferror(fp)

3、(1)sign==1或sign或sign!=0或等价表示形式 (2)syspwd[i]或*(syspwd+i)或等价表示形式 (3)usrpwd, syspwd或syspwd, usrpwd或等价表示形式

1、本题考查C语言的基本概念和编程方面的基本知识。

变量存储类型是指数据在内存中存储的方法,即确定所定义的变量在内存中的存储位置,也确定了变量的作用域和生存期,内部变量存储类型有3种,分别是:自动内部变量、寄存器内部变量、静态内部变量。

自动(auto)存储型变量又称自动变量,它是最常用的一种变量的存储类型,在函数内部或复合语句内部定义的局部变量(或称为内部变量)。只要存储类型是缺省的,均为自动变量。它的特点是其生命期域定义它的函数或复合语句的执行期同长,且有效范围仅在定义它的函数或复合语句内。

寄存器(register)存储型变量一般存储在计算机CPU的通用寄存器中,因而定义的这种类型变量存取速度快,适合于频繁使用的变量,可加快程序的运行速度,由于CPU中通用寄存器的数目有限,且每次可供C语言使用的通用寄存器数更有限,因而在程序中不宜大量使用这种存储类型的变量,以二三个为宜,当然超过可用的寄存器数,也不会出错,编译程序将会将超过可用寄存器数的寄存器型变量当作auto变量处理。一般将最频繁使用的变量定义成寄存器型变量。

静态(static)存储型变量是分配在存储器中C程序占据的数据段内,对运行的C程序而言,这是一个程序所用的固定内存区域,因而静态变量的存储地址在整个程序的运行执行期间均保留,不会被别的变量占据。静态变量可以定义成全局变量或局部变量,当定义成全局变量时,它在定义它的整个程序执行期间均存在,其原来的存储位置不会变化。当定义成局部变量时,虽然在定义它的函数内或复合语句中有效,但在执行完该函数或复合语句后,静态变量最后取得的值仍然保存,不会消失,因为它所占的存储地址不会被别的变量占用,这样,当程序再次调用该函数或执行该复合语句时,该静态变量当前值就是再次进入该函数或执行该复合语句的初始值。

假设有一个内部整型变量aa,按不同存储类型的变量声明如下:a)自动内部变量:int aa; 或auto int aa; b)寄存器内部变量:register int aa; 或register aa; c)静态内部变量:static int aa;

2、王工在编写某嵌入式程序时,用到对文件系统的操作,由于要保证系统的安全性,要求必须使用文件检测函数feof()和ferror(),完成[程序1]中的空。feof()函数用于检测文件当前读写位置是否处于文件尾部。只有当当前位置不在文件尾部时,才能从文件读数据。

函数定义:int feof(FILE*fp) 返回值:0或非0 如果fp所指的文件的位置处于文件尾部,返回非0;否则返回0。在对文件进行读操作前,应用这个函数测试当前位置是否在文件尾部。

文件操作的每个函数在执行中都有可能出错,C语言提供了相应的标准函数ferror用于检测文件操作是否出现错误。

函数定义:int ferror (FILE*fp) 返回值:0或非0 Ferror函数检查上次对文件fp所进行的操作是否成功,如果成功则返回0;否则返回非0。因此,应该及时调用ferror函数检测操作执行的情况,以免丢失信息。

[程序1]首先输入文件名,打开这个文件,如果不能打开,则输出“不能打开文件:XX”,程序退出。如果能正常打开该文件,则循环读这个文件,一次读一个字节,读取后,及时检测读操作是否出错,如果出错,报“文件读错误”,退出循环;否则输出该字符。在循环语句的判断冬件中,检测文件是否结束,如果结束,则退出循环。[程序1]需要填空的三条完整语句为: (1)if((fp=fopen(fname, "r'))===NULL) (2)while(!feof(fp)) /*检测文件是否结束*/ (3)if(ferror(fp)) /*检测文件是否出错*/

3、[程序2]是某信息管理系统的系统登录和密码验证的一个简易程序示例,其密码最长为20个字符。首先,打开密码文件sys_code,如果成功,则将文件中的密码信息与用户输入的密码进行比较,若相等,则身份验证通过并进入信息管理系统,否则输出错误信息并退出登录系统。如果打开文件sys_code失败,则由用户输入密码并保存到密码文件sys_code。[程序2]需要填空的3条完整语句为: (1)if(sign) (2)syspwd[i]=ch; (3)if(strcmp(usrpwd, syspwd)!=0)

5 问答题 1分

阅读以下关于数据采集与处理系统的说明,回答下列问题。

[说明] 某公司承接了一个数据采集与处理系统的项目,由刘工负责系统的方案设计,刘工的设计方案如图1所示。该方案是基于PCI总线的多功能处理系统,PCI设备1是以太网,PCI设备2用于数据采集,PCI设备3、PCI设备4用于和该系统中的其他处理模块进行互联,LEGACY设备1、LEGACY设备2用于处理系统中一些慢速设备。

中级嵌入式系统设计师,章节练习,案例分析

1、在以下描述PCI总线的基本概念中,正确的表述有______、______、______、______、______、______。 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、PCI设备2和主CPU之间采用双口RAM方式交换数据,双口RAM是常见的共享式多端口存储器,其最大的特点是存储数据共享。它允许两个独立的CPU或控制器同时异步访问存储单元。既然数据共享,就必须存在访问仲裁控制,否则就会出现错误或冲突。内部仲裁逻辑控制提供以下功能:对同一地址单元访问的时序控制;存储单元数据块的访问权限分配;信令交换逻辑(例如中断信号)等。 两个端口对同一内存操作有4种情况: A.两个端口同时对同一地址单元读出数据; B.两个端口同时对同一地址单元写入数据; C.两个端口不同时对同一地址单元存取数据; D.两个端口同时对同一地址单元,一个写入数据,另一个读出数据。 在上述情况下,两个端口的存取不会出现错误的是______和______,会出现写入错误的是______,会出现读出错误的是______。

3、PCI设备2和主CPU之间通过双端口存储器进行数据交换。刘工设计了环形队列的实现方式。设备2向环形队列写入数据,主CPU从环形队列读取数据。环形队列是一个首尾相连的FIFO数据结构,采用数组存储,到达尾部时将转回到0位置,该转回是通过取模操作来实现的。因此环形队列逻辑上是将数组元素q[0]与q[MAX-1]连接,形成一个存放队列的环形空间。

为了方便读写,还要用数组下标来指明队列的读写位置,其中head指向可以读的位置,tail指向可以写的位置,环形队列如图2所示。

中级嵌入式系统设计师,章节练习,案例分析

使用环形队列时需要判断队列为空还是为满。当tail追上head时,队列为满,当head追上tail时,队列为空。

通常判断环形队列为空/为满有两种判断方法。

(1)附加一个标志位tag,当head赶上tail,队列空,则令tag=0,当tail赶上head,队列满,则令tag=1;

(2)限制tail赶上head,即队尾结点与队首结点之间至少留有一个元素的空间。队列空:head==tai;队列满:(tail+1)%MAXN==head。 如果采用第一种方法(即附加标志实现算法),则环形队列的结构定义如下: typedef struct ringg { int head; /*头部,出队列方向*/ int tail; /*尾部,入队列方向*/ int tag; int size; /*队列总尺寸*/ int space[RINGQ_MAX]; /*队列空间*/ }RINGQ; RINGQ p, *q; q=&p; 初始化环形队列的C语言代码为: q->head=q->tail=q->tag=0; q->size=RINGQ_MAX; 判断队列为空的C语言代码为______。 判断队列为满的C语言代码为______。 入队操作时,如果队列不满,则入队后更新尾指针的C语言代码为q->tail=______。出队操作时,如果队列不空,则出队后更新头指针的C语言代码为q->head=______。如果采用第二种方法,还采用上述数据结构,初始化环形队列的C语言代码为: q->head=q->tail=0; q->size=RINGQ_MAX; 判断队列为空的C语言代码为______。 判断队列为满的C语言代码为______。 入队操作时,如果队列不满,则入队后更新尾指针的C语言代码为q->tail=______。 出队操作时,如果队列不空,则出队后更新头指针的C语言代码为q->head=______。

查看答案 开始考试
正确答案:

本题解析:

1、B、E、F、G、J、K

2、A C B D

3、(q->head==q->tail)&&(q->tag=0) ((q->head=q->tail)&&(q->tag==1)) (q->tail+1)%q->size (q->head+1)%q->size (q->head==q->tail) (q->head==(q->tail+1)%q->size)) (q->tail+1)%q->size (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,另一个读写口则面向外设或输入/输出处理机。如图3所示。

中级嵌入式系统设计师,历年真题,2015年嵌入式系统设计师下午真题卷

双口RAM最大的特点是存储数据共享。一个存储器配备两套独立的地址、数据和控制线,允许两个独立的CPU或控制器同时异步地访问存储单元。

因为数据共享,就必须存在访问仲裁控制。当两个端口对同一内存操作时,当两个端口同时对同一地址单元读出数据,或者两个端口不同时对同一地址单元存取数据的情况下,两个端口的存取不会出现错误;当两个端口同时对同一地址单元写入数据的情况下,会出现写入错误;当两个端口同时对同一地址单元,一个写入数据,另一个读出数据的情况下,会出现读出错误。

3、环形队列是在实际编程极为有用的数据结构,它有如下特点:它是一个首尾相连的FIFO的数据结构,采用数组的线性空间;数据组织简单,能很快知道队列是否满或空;能以很快的速度来存取数据。

因为简单高效,甚至在硬件都实现了环形队列。 内存上没有环形的结构,因此环形队列实际上是数组的线性空间来实现。那当数据到了尾部如何处理呢?它将转回到0位置来处理。这个转回是通过数组下标索引取模操作(Index% MAXN)来实现的。

因此环列队列的是逻辑上将数组元素q[0]与q[MAXN-1]连接,形成一个存放队列的环形空间。为了方便读写,还要用数组下标来指明队列的读写位置。定义Head/tail两个变量,其中head指向可以读的位置,tail指向可以写的位置。 环形队列的关键是判断队列为空,还是为满。

当tail追上head时,队列为满;当head追上tail时,队列为空。但如何知道谁追上谁,还需要一些辅助的手段来判断。 如何判断环形队列为空、为满有两种判断方法。

一是附加一个标志位tag,当head赶上tail,队列空,则令tag=0,当tail赶上head,队列满,则令tag=1;

二是限制tail赶上head,即队尾结点与队首结点之间至少留有一个元素的空间。

队列空时head==tail,队列满时(tail+1)%MAXN=head。 入队操作时,如队列不满,则写入q->tail=(q->tail+1)%q->size;出队操作时,如果队列不空,则从head处读出。下一个可读的位置在q->head=(q->head+1)%q->size。

其他考生还关注了更多>

相关题库更多>