当前位置:首页 → 计算机类 → 软件水平考试 → 中级嵌入式系统设计师->2016年嵌入式系统设计师下午真题卷
推荐等级:
发布时间: 2021-12-17 11:13
扫码用手机做题
【说明】某综合化智能空气净化器设计以微处理器为核心,包含各种传感器和控制器,具有检测环境空气参数(包含温湿度、可燃气体、细颗粒物等),空气净化、加湿、除湿、加热和杀菌等功能,并能通过移动客户端对其进行远程控制。图1-1为该系统电气部分连接图,除微处理器外,还包括了片上32KJBFLASH,以及SRAM和EEPROM。
问题:1.1 该系统的SRAM的地址线宽度为11,数据线宽度为8,其容量为多少字节?
问题:1.2 该系统分别设计了IOS和Android两种不同操作系统下的客户端程序,二者在开发上都使用MVC(模型(M)—视图(V)—控制器(C))设计模式。在典型的程序设计中,用户可以直接和视图进行交互,通过对事件的操作,可以触发视图的各种事件,再通过控制器,以达到更新模型或数据的目的。请完善图1-2所示的流程模型。
问题:1.3 该系统采用数字式激光传感器检测PM2.5、PM10,并通过异步串行接口将数据上报给处理器,通信波特率为9600bps,上报周期为1.5秒,数据帧内容包括:报文头、指令号、数据(6字节)、校验和及报文尾,具体字段描述如表1-1所示。
王工根据数据报文通信协议,使用C语言编写了对应的数据接收和校验程序,请根据注释要求补全程序。程序段如下:
本题解析:
问题1.1、211×8=2048B=2KB
问题1.2、(1)控制器 (2)视图 (3)模型
问题1.3、
(1)0xAA
(2)0xC0
(3)mPkt[i+2]
(4)mPkt[8]
(5)(uintl 6_t) mPkt[2]|(uintl 6_t) (mPkt[3]<<8)或其等价形式
(6)(uintl 6_t) mPkt[4]|(uintl 6_t) (mPkt[5]<<8)或其等价形式
问题1.1、本题考查嵌入式系统设计的基本概念和代码阅读与编写的能力。
此类题目要求考生认真阅读题目所述嵌入式系统的结构,了解设计过程,根据要求仔细阅读并理解代码,根据代码上下文填入所缺内容。该微处理器系统拥有一块11条地址线、8条数据线的SRAM,要求计算其容量。此题考查嵌入式系统微处理器体系结构的基本概念。
题目说明有8根数据线,表示访问数据一次可以访问8个bit(一个字节),即一个单元放一个字节。有11根地址线,表示编址为0?211-1。
问题1.2、此题考查嵌入式系统软件设计的基本概念和流程。客户端软件开发使用框架形式,采用模型(M)—视图(V)—控制器(C)设计模式。MVC模式使应用程序的输入、处理和输出分开。
使用MVC应用程序被分成三个核心部件:模型(M)、视图(V)、控制器(C),它们各自处理自己的任务。视图是用户看到并与之交互的界面。对老式的Web应用程序来说,视图就是由HTML元素组成的界面,在新式的Web应用程序中,HTML依旧在视图中扮演着重要的角色,但一些新的技术已层出不穷,它们包括Adobe Flash和XHTML,XML/XSL,WML等一些标识语言和Webservices。
如何处理应用程序的界面变得越来越有挑战性。MVC的好处是它能为你的应用程序处理很多不同的视图。模型表示企业数据和业务规则。在MVC的三个部件中,模型拥有最多的处理任务。例如它可能用像EJBs和Cold Fusion Components这样的构件对象来处理数据库。
被模型返回的数据是中立的,就是说模型与数据格式无关,这样一个模型能为多个视图提供数据。由于应用于模型的代码只需写一次就可以被多个视图重用,所以减少了代码的重复性。
控制器接受用户的输入并调用模型和视图去完成用户的需求。所以当单击Web页面中的超链接和发送HTML表单时,控制器本身不输出任何东西和做任何处理。
它只是接收请求并决定调用哪个模型构件去处理请求,然后确定用哪个视图来显示模型处理返回的数据。完整的流程模型如下图所述:
问题1.3、此题考查嵌人式系统底层代码的阅读与理解及编写的能力,结合题目给出的代码分析如下:首先定义数据类型,为了在不同平台之间更方便的移植,嵌入式系统代码编写时经常对数据类型进行重新定义。
题目代码中明确说明了此类定义后,考生在答题时应尽量使用定义后的数据类型声明。
通过上述分析,容易得出各问题答案如下:
(1)判断是否为数据帧的帧头,查题干数据可知帧头标识为0xAA;
(2)判断是否为数据帧的指令号,查题干数据可知指令号为0xC0;
(3)进行CRC计算,根据代码上下文可知为为第2~7字节数据,mPkt[i+2];
(4)进行CRC校验,查题干数据可知CRC校验位为mPkt[8];
(5)考查位操作,根据题干数据可知为数据2左移8位加上数据1 (uintl 6_t) mPkt[2]|(uintl 6_t) (mPkt[3]<<8)或者(uintl 6_t) ((mPkt[3]<<8)|mPkt[2]);
(6)考查位操作,根据题干数据可知为数据4左移8位加上数据3 (uintl 6_t) mPkt[4]|(uintl 6_t) (mPkt[5]<<8)或者(uintl 6_t) ((mPkt[5]<<8)|mPkt[4])。
某公司承接了一个数据处理模块的项目,由沈工负责模块的方案设计,沈工的设计方案如图4-1所示。该数据处理模块以PowerPC处理器为核心,设计了存储器、以太网、温度传感器、调试接口等功能电路。处理器外接FLASH存储器用于存储上电初始化程序和应用程序。
处理器通过I2C接口连接测温电路,监控模块的工作温度。以太网、串口、调试离散量等用于软件调试和状态显示。测温电路选用ADT7461AR芯片,用于测试模块温度。ADT7461AR是一个双通道数字温度计,工作电压3v至5v,具有低/超温报警功能,采用I2C接口实现主机对远程/本地温度数据的采集f采集数据存储在高/低两个数据寄存器中,每个寄存器为16位,高寄存器表示整数值,低寄存器表示小数值。
存储模块采用某公司的FLASH存储芯片。
支持编程、擦除、复位等操作命令。该FLASH芯片的常用命令序列如表4-1所示。表中的地址和数据皆为16进制数。
问题:4.1 ADT7461AR芯片支持两种测温模式,其中第0种模式为二进制模式,用0表示0度,测温范围为0℃?+127℃;第二种模式为偏移二进制模式,用64表示0度,测温范围为-55℃?+150℃,温度数据转换关系如表4-2所示。请在(1)?(4)处写出对应温度的二进制数。
问题:4.2 沈工用C语言实现对FLASH的操作,需按照表4-1中定义的命令序列顺序执行即可。仔细阅读下列代码,请在(1)?(4)处将对应的C语言代码补全。
问题:4.3 该嵌入式系统对处理的性能要求较高,沈工在完成软件设计后,需要对每一个函数的执行性能进行测试,检测其是否满足系统设计的要求。沈工通过PowerPC处理器内部的高精度时钟寄存器(TimeBase)进行计时,该寄存器由高低两个32位的寄存器组成,根据总线频率自动递增,当低32位寄存器递增到0xFFFFFFFF时,向高32位寄存器进位。计数值可以换算成时间值,精确到微秒级。在功能函数functkm1()的执行体前后,进行时间统计,最后计算出该函数的执行时间值,请在(1)?(2)处将对应的C语言代码补全。
本题解析:
问题4.1、(1)0011 0110 0000 0000 (2)0000 0000 0100 0000 (3)0100 0001 0000 0000 (4)0011 0010 0000 0000
问题4.2、(1)0x2AA (2)0x80 (3)offset_addr (4)0x30
问题4.3、(1)tb1.lower-tb0.lower (2)0xFFFFFFFF-tb0.lower+tb1.lower+1
问题4.1、本题考查嵌入式系统中计算机模拟量表示、FLASH设备驱动、有精度计数器等方面的相关知识及应用。计算机模拟量是指变量在一定范围连续变化的量,也就是在一定范围(定义域)内可以取任意值(在值域内)。模拟量输入是指输入为连续变化的物理量。与之相对的是数字量,数字量是分立量,而不是连续变化量,只能取几个分立值,如二进制数字变量只能取两个值。
本题中采用的是ADT7461AR芯片,在工作时的电压信号就属于模拟信号,因为在任何情况下被测温度都不可能发生突跳,所以测得的电压信号无论在时间上还是在数量上都是连续的。而且,这个电压信号在连续变化过程中的任何一个取值都是具体的物理意义,即表示一个相应的温度。芯片采集模拟量输入信号,然后用二进制表示出来,由设备驱动程序通过读取芯片的寄存器,获取温度值。温度值的精度取决于芯片寄存器的位数,精度越高,位数越多,把这个模拟量表示的越细,结果也就越精准。由题干得知,该芯片的采集数据存储在高/低两个数据寄存器中,高寄存器表示整数值,低寄存器表示小数值。
当芯片工作在第一种模式(即二进制模式时),由于测温范围为0℃至+127℃,则高8位寄存器从0到127,表示0℃~+127℃,而低8位寄存器表示小数值,每一位分别表示2-1℃、2-2℃、2-3℃、2-4℃、2-5℃、2-6℃、2-7℃、2-8℃,表示精度为2-8℃。所以+0.25℃高位为0,低位为0100 0000;+50℃高位为0011 0010,低位为0。当芯片工作在第二种模式,即偏移二进制模式时,用64表示0度。由于测温范围为-55℃~+150℃,则高8位寄存器从9(64-55)到214(64+150),表示-55℃~+150℃,而低8位寄存器表示小数值,表示含义和精度同第一种模式。所以-10℃高位为0011 0110,低位为0;+1℃高位为0100 0001,低位为0。
问题4.2、本题中采用的FLASH芯片为NORFLASH,NORFLASH是很常见的一种存储芯片,数据掉电不会丢失。NORFLASH支持ExecuteOnChip,即程序可以直接在FLASH片内执行(这意味着存储在NORFLASH上的程序不需要复制到RAM:就可以直接运行)。
因此,在嵌入式系统中,NORFLASH很适合作为启动程序的存储介质。NORFLASH的读取和RAM很类似(只要能够提供数据的地址,数据总线就能够正确的给出数据),但不可以直接进行写操作。对NORFLASH的写操作需要遵循特定的命令序列,最终由芯片内部的控制单元完成写操作。FLASH一般都分为很多个SECTOR,每个SECTOR包括一定数量的存储单元,对有些大容量的FLASH,还分为不同的BANK,每个BANK包括一定数目的SECTOR。FLASH的擦除操作一般都是以SECTOR、BANK或是整片FLASH为单位的。在对FLASH进行写操作的时候,每个位可以通过编程由1变为0,但不可以由0修改为1。
为了保证写操作的正确性,在执行写操作前,都要执行擦除操作,擦除操作会把FLASH的一个SECTOR、一个BANK或是整片FLASH的值全修改为0xFF,这样写操作就可以正确完成了。Flash芯片一般都支持编程、擦除、复位等操作命令,命令序列可参考芯片厂家提供的用户手册。
本项目中根据芯片手册提供的常用命令序列表,可知SECTOR擦除操作共需要6个周期的总线写操作完成,命令序列如下:将0xAA写到FLASH芯片地址0x555;将0x55写到FLASH芯片地址0x2AA;将0x80写到FLASH芯片地址0x555;将0xAA写到FLASH芯片地址0x555;将0x55写到FLASH芯片地址0x2AA;将0x30写到要擦除的SECTOR对应的地址。
问题4.3、Power Architecture的处理器提供了一个名为Time Base(TB)的计数寄存器,它用来记录系统时间。TB寄存器会以一种依赖于实现的总线频率周期性地增加,这个频率可能不是恒定的。操作系统(OS)要负责确定更新频率是否发生了变化,以及对内部结构进行必要的调整,从而将计数值换算为绝对时间值。一般TB寄存器的计时精度可以达到微妙级。本项目中用一个包含高低两个32位整型数的结构体来存储TB寄存器的值。当低32位寄存器发生溢出时,处理器会自动向高32寄存器加1。
通过插桩的方式测量函数的执行时间时,需要在功能函数fonction1()的执行体前后,分别两次获取TB寄存器的值,最后计算两次的差值,即为该函数的执行时间值。本题中tb0为函数进入时的TB值,tb1为函数退出前的TB值,tb2为tb1和tb0的差值,即函数的执行时间。当tb1的低32位大于等于tb0的低32位时,tb2的高位等于tb1的高位与tb0的高位的差值,tb2的低位等于tb1的低位与tb0的低位的差值。当tb1的低32位小于tb0的低32位时,则需借用高位进行计算。tb2的高位等于tb1高位与tb0高位的差值再减1,tb2的低位等干0xFFFFFFFF-tb0的低位+tb1的低位再加1。
某嵌入式控制软件中,通过采集传感器数值来计算输出控制率,同时为提高数据采集的可靠性,对采集数值使用三余度采集方法进行三个通道的数据采集。
1.三余度数据采集及处理要求:
(1)如果某通道采集值在[-3.0,3.0]v正常范围内,且与任一相邻通道间差值不大于0.5v,则该通道数据满足要求;
(2)如果某通道釆集值超过[-3.0,3.0]v正常范围,或者此通道采集值与其他两个通道的差值均大无0.5v,则该通道数据不满足要求;
(3)如果三通道值均满足要求,则取三通道中差值较小的两通道数据乎均值;
(4)如果三通道值均满足要求,且相邻两数值的差值相等,则取三个采集值的中间值;
(5)如果仅有一个通道数据不满足釆集要求,取满足要求的两个通道数据平均值;
(6)如果大于一个通道数据不满足采集要求,取安全值0v。
2.对计算输出控制率的具体处理算法如下:
(1)如果依据采集数据计算的控制率C1与目前实际控制率C0差值不大于0.01,则使用本周期计算控制率Cdft行输出控制,否则使用目前实际控制率C0输出控制,连续超过范围计数加1,不上报传感器故障;
(2)如果连续3个周期计算的控制率C1与目前实际控制率C0差值大于0.01,则上报传感器三级故障,连续超过范围计数清零,使用目前实际控制率C0输出控制;如果已经连续3个周期控制率差值超过范围,并已上报三级故障,但第4个周期计算的控制率C1与目前实际控制率C0差值不大于0.01,则清除三级故障上报,并使用C1进行输出控制;
(3)如果累计大于等于10个周期计算的控制率C1与目前实际控制率C0,差值大于0.01,则上报传感器二级故障,使用目前实际控制率C0输出控制;
(4)如果累计大于等于100个周期计算的控制率C1目前实际控制率C0,差值大于0.01,则上报传感器一级故障,清除二级故障,并切断输出控制(输出安全值0);
(5)如果低级故障和高级故障同时发生,则按高级故障上报和处理。
问题:3.1 为了测试采集算法,在不考虑测量误差的情况下,根据所设计测试用例的输入填写表3-1中的(1)?(6)空,预期输出结果精度为小数点后保留两位数字。
问题:3.2 白盒测试方法和黑盒测试方法是目前嵌入式软件测试常用的方法。请简述白盒测试方法与黑盒测试方法的概念。同时依据本题说明,指明问题1中设计的测试用例使用了白盒测试方法还是黑盒测试方法。
问题:3.3 为了测试控制率计算算法,在不考虑测量误差的情况下,请完善所设计的测试用例,填写表3-2中的空(1)?(6)。
本题解析:
问题3.1、(1)1.90v (2)1.55v (3)2.70v(4)-2.90v (5)0v (6)0v
问题3.2、白盒测试也称结构测试、逻辑测试或基于程序的测试,这种测试应了解程序的内部构造,并且根据内部构造设计测试用例。黑盒测试又称功能测试、数据驱动测试或基于需求规格说明的测试,这种测试不必了解被测对象的内容情况,而依靠需求规格说明中的功能来设计测试用例。问题1中设计的测试用例使用了黑盒测试方法。
问题3.3、(1)1.454 (2)2 (3)9到98都可以(4)二级故障 (5)0 (6)一级故障
问题3.1、为了测试三余度通道数据采集算法,就要依据题目说明三余度通道数据采集及处理要求中给定的6条设计要求,进行测试用例的设计。首先依据第1条设计说明,采集值正常范围为[-3.0,3.0]v,将输入范围进行等价类划分,划分为无效等价类(超出正常范围)和有效等价类(正常范围),同时在有效等价类中,还存在“任意两通道间差值不大于0.5v的约束。将设计测试用例的范围整理出来后,就可按照软件测试的要求设计测试用例。但是由于本题给出了采集值,只需要根据采集值计算输出即可。
对于序号1、序号2和序号3,因为三个采集值都是正常范围,且任意两通道间差值不大于0.5v,依据第3条和第4条设计说明,采集值应为差值较小的两通道数据的平均值或相邻两数值的差值相等,则取三个采集值的中间值。因为序号1数据差值都为0.0v,所以取三个通道采集值的中间值,故采集值为0.00;序号2取In_U[0]和In_U[2]的平均值,为1.90v;序号3取In_U[0]和In_U[1]的平均值,为l.55v。对于序号4,三个通道采集值是正常范围,但In_U[2]通道与In_U[0]和In_U[1]间差值大于0.5v,依据第2条和第5条设计说明,In_U[2]通道采集值不满足要求,应取满足要求的In_U[0]和In_U[1]两个通道数据的平均值,故采集值为2.70V。
对于序号5,InJJ[1]通道采集值是超出正常范围,In_U[0]和In_U[2]通道在正常范围,这里要注意In_U[0]采集值为边界点,依据第2条和第5条设计说明,In_U[1]通道采集值不满足要求,应取满足要求的In_U[0]和In_U[2]两个通道数据的平均值,故采集值为-2.90v。
对于序号6,三个通道采集值是正常范围,但每个通道采集值的任意两两差值均大于0.5v,依据第2条和第6条设计说明,应取安全值0v,故采集值为0v。对于序号7,两个通道采集值超出正常范围,依据第2条和第6条设计说明应取安全值0v,故采集值为0v。
问题3.2、此题考查白盒测试方法和黑盒测试方法的概念及应用。白盒测试也称结构测试、逻辑测试或基于程序的测试,需了解程序的内部构造,并且根据内部构造设计测试用例。黑盒测试又称功能测试、数据驱动测试或基于需求规格说明的测试,这种测试不必了解被测对象的内容情况,而依靠需求规格说明中的功能来设计测试用例。
由于白盒测试方法与黑盒测试方法的概念定义较多,此题中白盒测试概念中只需给出根据程序内部构造设计测试用例的关键词即可,黑盒测试概念中只需给出依靠相应文档给出的功能设计测试用例即可。问题1中设计的测试用例时,只是根据设计算法,进行功能方面的测试,不需要了解程序的内部构造,按照黑盒测试方法的概念,确定问题1使用了黑盒测试方法。
问题3.3、为了测试控制率计算算法,就要依据题目说明对采集数值计算控制率的具体处理算法中给定的5条设计要求,进行测试用例的设计。此题考查测试用例的设计,不仅包括输入数据的设计,还包括前置条件C比如控制率超差连续计数和累计计数)及预期输出的设计(比如输出控制率和上报故障情况),条件增多,比问题1难度增加。
对于序号1,前置条件中控制率超差连续计数和累计计数都为0,计算控制率与实际控制率误差不超过0.01,依据第1条设计说明,输出控制率为计算控制率1.632,不上报故障。
对于序号2,前置条件中控制率超差连续计数和累计计数都为0,计算控制率与实际控制率误差超过0.01,依据第1条设计说明,输出控制率为实际控制率1.454,不上报故障。
对于序号3,前置条件中控制率超差累计计数为6,计算控制率与实际控制率误差超过0.01,并且上报了三级故障,输出控制率为实际控制率2.369,依据第2条设计说明,确定控制率超差连续计数预期值应该为3,所以前置条件中的控制率超差连续计数只能为2。
对于序号4,前置条件中控制率超差连续计数为1,计算控制率与实际控制率误差超过0.01,并且上报了二级故障,输出控制率为实际控制率1.557,依据第3条、第4条和第5条设计说明,确定控制率超差累计计数预期结果应该为大于等于10且小于等于99的整数,所以前置条件中的控制率超差累计计数为9至98区间中的任意整数,即任意大于等于9且小于等于98的整数。
对于序号5,前置条件中控制率超差连续计数为2并且累计计数为9,计算控制率与实际控制率误差超过0.01,输出控制率为实际控制率2.234,依据第3条和第5条设计说明,确定控制率超差累计计数预期结果应该为10,所以应该上报二级故障。
对于序号6,前置条件中控制率超差连续计数为0并且累计计数为99,计算控制率与实际控制率误差超过0.01,依据第4条和第5条设计说明,确定控制率超差累计计数预期应为100,此时应该上报传感器一级故障,并清除二级故障,同时切断输出控制,即输出安全值0,所以输出控制率为0,上报一级故障。
王工在采用某16位嵌入式CPU进行A/D采集硬件电路设计时,利用8255控制器C口中的PC0输出控制信号,利用PC7读入AD574的状态信号,利用A口和B口读入AD574转换好的12位数据。图2-1为该A/D采集硬件系统设计的部分连接示意图。
其中,AD574各个管脚功能定义如表2-1所述。
AD574的控制功能状态表如表2-2所示。
8255控制器各个管脚及地址控制描述如表2-3所示。
问题:2.1 在该嵌入式系统设计中,AD574是工作在12位转换模式还是8位转换模式?
问题:2.2 图2-1中245为双向缓冲器,在该硬件设计中配置8255控制字时,CPU需要向245进行数据输出(245的A口传输给B口);在获取AD采集数据时CPU需要接收245所传输过来的数据(245的B口传输给A口)。根据硬件设计,描述DR分别为高、低电平时,245双向缓冲器在A、B口之间进行数据传输的方向。
问题:2.3 在该A/D变换中,如果用1/2LSB(最低有效位)来表示量化误差,当该A/D控制器的量程范围为5V时,其量化误差是多大?
问题:2.4 王工根据上述硬件设计,编写对应的数据采集程序,首先需要对8255进行初始化,然后进行数据采集,请根据注释要求补全如下X86汇编程序。
本题解析:
问题2.1、12位
问题2.2、DR=高电平时,A口传向B口;DR=低电平时,B口传向A口。
问题2.3、 5v/(4096*2)=0.61mv。
问题2.4、(1) #C003H (2)#C002H (3)#00H (4)#01H(5)#80H (6)#C000H (7)#C001H (8)#0FH
问题2.1、本题考查嵌入式硬件系统设计和基本的汇编程序编写知识。此类题目要求考生认真阅读题目,对题目中给出的原理图、器件描述等内容进行理解,根据原理图中所包含的硬件模块和原理设计,进行问题回答和程序补全。题目给出了主要器件的管脚功能描述和部分程序。在该嵌入式系统设计中,AD574是工作在12位转换模式还是8位转换模式依赖于AD574周边的管脚电路设计。从题目中已经给出的器件功能描述并结合原理图进行推断。从题目给出的器件描述中可以看出,根据AD574的A0管脚确定12位/8位模式,从原理图可以看出,A0接地,即低电平。结合AD574的功能描述,可以知道该系统设计中AD574工作在12位模式。
问题2.2、图2-1中245为双向缓冲器,在该硬件设计中配置8255控制字时,CPU需要向245进行数据输出(245的A口传输给B口);在获取AD采集数据时CPU需要接收245所传输过来的数据(245的B口传输给A口)。根据硬件设计图可以看出,当DR为高电平时,RD信号是无效的,也就是读信号无效,即此时为写信号有效。在写信号有效情况下,数据传输方向是从处理器向8255方向进行数据传输,即从A口传输给BP。反之如果RD为低电平时,此时RD信号有效,也就是读信号有效,既需要从外部将数据读入到CPU处理器中,即从8255进行数据读取,放到处理器中,所以方向应该是从B口传输到A口。
问题2.3、由于工作在12位,其范围为4096个刻度。另外考虑到采用1/2LSB作为量化误差,所以误差大小即为:5v/(4096*2)=0.61mv。
问题2.4、运行数据采集程序时,首先需要对8255进行初始化,然后进行数据采集。在该程序中,需要先进行8255的工作模式配置,由原理图和8255的工作模式可知,在该配置情况下,必须使得8255的A1A0=11,即工作在寻址控制器模式下,同时保证8255的片选有效,即必须使得A15=A14=1,A13=A12=All=…=A2=0才可以,所以此时需要给DPTR寄存器的地址为#C003H。
在进行数据采集过程中,需要先通过8255的C口进行AD574的转换控制,要对C口操作即需要A1A0=10,再考虑到片选的有效性,需要给DPTR的地址是#C002H。在进行一次数据转换时需要在PCO产生一个上升沿,所以要给C口输出配置为#00H和#01H。当从C口取出状态字后,需要借助C口的最高位STS进行转换完毕的状态判断,因此取出数据存在A寄存器后,需要和#80H进行与操作来判断最高位的完成状态。当判断有有效数据时候,需要分别从8255的A口和B口进行数据的获取,因此需要分别配置A口和B口的地址,依次为#C000H和#C001H。在进行12位数据合并时,只需要通过与操作取出低4位数据,和#OFH进行与操作即可。
【程序1】是关于条件编译的一段程序示例;
【程序2】是一段switch语句应用示例。C语言要求switch之后圆括弧内的“表达式”类型必须是整型或字符型。该程序代码中a与x的对应关系如表5-1所示。表5-1 a与x对应关系表
【程序3】是冒泡排序算法的实现。假设有N个数据存放在数组aa中,用冒泡排序将这N个数从小到大排序。首先,在aa[0]到aa[N..1]的范围内,依次比较两个相邻元素的值,若aa[j]>aa[j+1],则交换aa[j]与aa[j+1],j的值取0,1,2,…,N-2;经过这样一趟冒泡,就把这N个数中最大的数放到aa[N-1]中。接下来对aa[0]到aa[N-2]中的数再进行一趟冒泡,这样就将该范围内的最大值换到aa[N-2]中。依次进行下去,最多只要进行N-1趟冒泡,就可完成排序。如果在某趟冒泡过程中没有交换相邻的值,则说明排序已完成,可以提前结束处理。
【C程序代码1】
【C程序代码2】
【C程序代码3】
问题:5.1 (1)什么是c语言的条件编译?(2)请解释#ifndef的作用。(3)分析【C程序代码1】,写出该段执行后的输出结果。
问题:5.2 完成【C程序代码2】中的(1)?(3)空,将答案写到相应的位置。
问题:5.3 完成【C程序代码3】中的(4)?(6)空,将答案写到相应的位置。
本题解析:
问题5.1、(1)条件编译:C语言中提供控制编译器流程的语句。或C源程序中希望对其中一部分内容只是在满足一定条件时才进行编译,形成目标代码,这种对一部分内容指定编译的条件称为条件编译。
(2)#ifndef的作用:如果Wifndef后面的“宏名”未定义,则编译其体内的程序段;否则编译#else部分的程序段,如果没有#else部分,则当“宏名”己定义时直接跳过#endif。
(3)x=2
问题5.2、(1)x=3 (2)x=1 (3)x=2
问题5.3、(4)&aa[i] (5)N-i-1 (6)!swap或swap==0
问题5.1、本题考查C语言编程方面的基本知识。考查条件编译的概念。
C语言中提供控制编译器流程的语句为条件编译语句,在一般情况下,C源程序中所有的行都参加编译过程,但有时出于对程序代码优化的考虑,希望对其中一部分内容只是在满足一定条件时才进行编译,形成目标代码,这种对一部分内容指定编译的条件称为条件编译。
下面是关于#ifdef语句的使用规则:#ifdef 宏名 程序段1;#else 程序段2;#endif或者#ifdef 宏名 程序段;#endif该语句的作用是,如果#ifdef后面的“宏名”在此前已用#define语句定义,则编译“程序段1”或“程序段”;否则编译“程序段2”。
如果没有#else部分,则当“宏名”未定义时直接跳过#endif。下面是关于#ifndef语句的使用规则:#ifndef 宏名 程序段1;#else 程序段2;#endif或者#ifndef 宏名 程序段;#endif#ifndef语句的功能与#ifdef语句的功能正好相反,如果#ifndef后面的“宏名”未定义,则编译“程序段1”或“程序段”;否则编译“程序段2”。如果没有#else部分,则当“宏名”已定义时直接跳过#endif。
在【C程序代码1】中,由于在执行条件编译语句时,x已定义,所以,执行x=2;语句。最终程序执行结果为:x=2。
问题5.2、在C语言中,选择结构的作用是根据所给的条件是否满足,决定从给定的两个或多个分支中,选择其中的一个分支来执行。c语言中有两种选择结构语句,if语句和swkch语句。使用if语句的嵌套结构实现多分支选择功能时,程序的结构显得不够清晰。因此,C语言专门提供了switch语句。switch语句的一般形式如下:switch(表达式){Case 常量表达式1; 语句1; break;Case 常量表达式2; 语句2; break;……Case 常量表达式n; 语句n; break;Default: 语句n+1; break;}在使用switch语句时有以下要求:1、switch语句后面圆括号内的“表达式”的值和case后面的“常量表达式”的值,都必须是整型或字符型的,不允许是实数。2、在case后的各常量表达式的值不能相同,否则会出现错误。在本题中变量a是实数,所以在switch语句要进行转换:Switch ((int)a)。根据题意,a取整后的值为0、1、2时,0<a
试卷分类:高级信息系统项目管理师
练习次数:0次
试卷分类:高级系统架构设计师
练习次数:0次
试卷分类:中级系统集成项目管理工程师
练习次数:0次
试卷分类:中级信息系统监理师
练习次数:0次
试卷分类:中级软件设计师
练习次数:0次
试卷分类:高级网络规划设计师
练习次数:0次
试卷分类:高级网络规划设计师
练习次数:0次
试卷分类:高级网络规划设计师
练习次数:0次
试卷分类:中级网络工程师
练习次数:0次
试卷分类:中级网络工程师
练习次数:0次