ATM自动取款机系统是一个由终端机、ATM系统、数据库组成的应用系统,具有提取现金、查询账户余额、修改密码及转账等功能。
ATM自动取款机系统用例图如图1所示。
ATM自动取款机系统功能组成如图2所示。
1、根据ATM自动取款机系统功能和系统用例图,完成图3所示的ATM自动取款机系统的系统状态图,将系统状态图中的(1)~(6)补充完整。
2、ATM自动取款机系统取款用例描述用户取款的过程。其事件流如下:
(1)基本流 a.用户输入取款金额; b.系统验证输入金额是否符合输入要求; c.系统验证用户账户余额; d.系统显示用户账户余额; e.用户确认取款金额; f.系统要求点钞机出钞; g.系统更新并保存账户信息。
(2)备选流 a.如果输入金额不符合输入数字格式要求,给出提示,退出; b.如果输入金额超出最大取款金额,给出提示,退出; c.如果用户没有确认,给出提示,退出。
根据上述ATM:自动取款机系统取款用例描述,请完成取款功能的流程图。
3、ATM自动取款机系统是与银行服务器联网的网络系统,由于系统涉及个人和企事业单位的财产安全,要求网络通信安全可靠,因此通信过程要采取消息加解密、身份认证、消息鉴别和访问控制等信息安全措施。
(1)请简要解释下列术语的基本概念。 a.对称密钥 b.公开密钥 c.访问控制 d.消息鉴别
(2)以下几种常见的加密算法哪些属于对称加密算法?哪些属于非对称加密算法?a.DES b.RSA c.AES d.IDEA e.PGP f.DSA g.椭圆曲线DSA
1、(1)取款(2)选择修改密码(3)选择继续服务 (4)选择转账(5)转账(6)输入密码
本题考查软件设计中的状态图、流程图以及信息安全方面概念和基本知识。
本题要求考生认真阅读题目的描述,根据ATM自动取款机系统用例图和ATM自动取款机系统功能图了解ATM自动取款机系统工作过程,结合软件设计中的状态图和流程图的绘制要求,完成相关问题。 由ATM自动取款机系统用例图和ATM自动取款机系统功能图可知,其工作过程如下: 当客户将银行卡插入ATM机后,ATM机会要求输入密码,如果密码不正确,则需要重新输入;如果密码正确,则进入主菜单,选择不同的服务类型。服务类型有取款、修改密码、查询余额、转账等功能。
2、完整的ATM自动取款机系统的系统状态图如图4所示。
该问题的描述部分已经给出了ATM自动取款机系统的取款过程的事件,流程图只需要根据实际取款的工作次序排序即可。正确的流程如下: a)用户输入取款金额; b)系统验证输入金额是否符合输入要求; c)判断格式要求,如果满足要求,则继续;否则,转结束; d)系统验证用户账户余额; e)系统显示用户账户余额; f)判断实际取款金额是否超出最大取款金额,若不大于,则继续;否则,给出超出最大金额提示后,转结束; g)用户确认取款金额; h)如果用户没有确认,时间超时,则给出超时提示,转结束: i)系统要求点钞机出钞; j)系统更新并保存账户信息; k)结束。
3、(1)a.对称密钥:对称密钥加密又叫专用密钥加密,即发送和接收数据的双方必须使用相同的密钥对明文进行加密和解密运算。 b.公开密钥:公开密钥也称为非对称密钥,每个人都有一对唯一对应的密钥:公开密钥(简称公钥)和私人密钥(私钥),公钥对外公开,私钥由个人秘密保存;用其中一把密钥加密,就只能用另一把密钥解密。 c.访问控制:按用户身份及其所归属的某项定义组来限制用户对某些信息项的访问,或限制对某些控制功能的使用的一种技术。 d.消息鉴别:利用鉴别函数产生一个鉴别符,接收者通过鉴别符能够检验和证实消息的合法性、真实性和完整性。这是一个证实收到的消息来自可信的原点且未被篡改的过程。
(2)对称加密算法:DES、AES、IDEA 非对称加密算法:RSA、PGP、DSA、椭圆曲线DSA
在嵌入式系统设计中,李工使用某嵌入式处理器和对应的以太网芯进行带有网络功能的单板实现,该电路中还包含DDR、Flash等存储芯片和相应的外围控制芯片。
图1为所选用嵌入式处理器的存储模块存储地址总线变换示意图,
图2为以太网芯片外围设计的相关原理示意图,
图3为用户在该嵌入式单板系统上实现内部嵌入式Web服务器的流程示意图。
在该嵌入式处理器的存储系统设计中,嵌入式处理器内部包含SA[25:0](从高到低)共26根系统地址总线,外部使用22根数据线和外部存储设备进行连接。 嵌入式处理器和以太网芯片之间的交互接口为:MII(Media Independent Interface)接口,包含数据线和控制线。数据线分为收发两个方向:其中RXD[3:0]为并行数据接收线,RXCLK为对应的时钟线;TXD[3:0]为并行数据发送线,TXCLK为对应的时钟线。
MDIO和MDC为控制线,通过其进行以太网芯片的配置。以太网芯片的最大通信频率由其外围的晶振频率和收发数据线的并行数目决定。 在嵌入式系统设计中,嵌入式处理器和以太网芯片之间可以设计为一对多的方式,每个以太网控制器都有一个PHYID,该PHYID依赖于以太网芯片周边的电路设计。在图2的设计中,该以太网芯片的PHYID由图中的PHYID[4:0]五个管脚来定。
对于该以太网芯片而言,PHYID[4:0]在启动时是作为。PHYID选择控制使用,在启动后是作为其他指示功能使用。PHYID的最大值是31(五位),最小是0,由PHYID[4:0]从高位到低位决定,对应管脚为高电平时对应的值为1,低电平时对应的值为0。
1、如图1所示,用户可以通过寄存器将存储总线变换方式配置为字节模式(8位模式),半字模式(16位模式)或者字模式(32位模式)中的任何一种,不同模式下,所使用到的地址线不同。 在图2中的,①、②、和③分别对应的地址线连接应该依次是______。 A SA2-SA23, SA1-SA22, SA0-SA21 B SA0-SA21, SA2-SA23, SA1-SA22 C SA1-SA22, SA2-SA23, SA0-SA21 D SA0-SA21, SA1-SA22, SA2-SA23 根据图2的网络部分相关电路设计,可以知道该嵌入式处理器的网络通信中,最大通信频率是______Mbps。 A.10000 B.1000 C.100 D.10 如果该网络芯片工作在100Mbps,那么在图2的设计中,RXCLK的工作频率应该是______Mbps.根据图2的电路和题目说明,在该电路中,以太网芯片的PHYID应该是______。
2、在图3中,为了实现嵌入式Web服务器和对应的请求流程,李工设计了该流程示意图,根据网络通信的过程,从下面选项中选择合适的处理过程,填充图3中的空(1)~(4)。 空(1)~(4)备选答案: A.创建TCP socket套接字 B.关闭socket套接字 C.accept尝试建立TCP连接 D.HTTP服务 E.数据发送处理 F.数据接收处理 G.bind绑定套接字 H.本地其他服务处理 I.listen侦听客户套接字 J.创建UDP socket套接字
某嵌入式刹车控制软件,应用于汽车刹车控制器,该软件需求如下:
1.模式选择:采集模式控制离散量信号In_D1并通过模式识别信号灯显示软件当前工作模式。在信号In_D1为低电平时进入正常工作模式(模式识别信号灯为绿色),为高电平时进入维护模式(模式识别信号灯为红色)。软件在正常工作模式下仅进行刹车控制和记录刹车次数,在维护模式下仅进行中央控制器指令响应;
2.刹车控制:采用定时中断机制,以5ms为周期采集来自驻车器发出的模拟量信号In_A1以及来自刹车踏板发出的模拟量信号In_A2,并向刹车执行组件发送模拟量信号Out_A1进行刹车控制;
3.记录刹车次数:在Out_A1大于4V时,读出非易失存储器NVRAM中保存的刹车次数记录进行加1操作,然后保存至非易失存储器NVRAM中;
4.响应中央控制器指令:接收来自中央控制器的串行口指令字In_S1,回送串行口响应字Out_S1。当接收的指令字错误时,软件直接丢弃该命令字,不进行任何响应。 指令字及响应字说明如表1所示。表1 指令字和响应字
1、请简述本软件串行输入接口测试的测试策略及测试内容。针对表1中“读取刹车次数指令”进行鲁棒性测试时应考虑哪些情况?
2、某测试人员设计了表2所示的操作步骤对模式选择功能进行测试(表中END表示用例到此结束)。
为进一步提高刹车控制软件的安全性,在需求中增加了设计约束:软件在单次运行过程中,若进入正常工作模式,则不得再进入维护模式。请参照表2的测试用例完成表3,用于测试该设计约束。
3、本项目在开发过程中通过测试发现了17个错误,后期独立测试发现了31个软件错误,在实际使用中用户反馈了2个错误。请计算缺陷探测率(DDP)。
1、测试策略包括测试正常和异常指令的响应。 测试内容包括读取刹车次数和清除刹车次数两种指令。 对“读取刹车次数指令”鲁棒性测试时应考虑输入接口帧头错误、指令码错误、帧长错误、帧尾错误以及整个指令长度超过4字节的情况。
2、
3、DDP=(17+31)/(17+31+2)=96%
1、本题考查软件测试的一些基本概念及依据需求进行测试用例设计的能力。 此题目要求考生认真阅读题目所给的说明,了解刹车控制软件的工作流程,结合软件测试的一些基本概念,在刹车控制软件中进行实际应用。 本问题主要考查测试的基本概念,对所有的测试而言,都必须进行正常测试和异常测试,在本题中对测试对象实例化为串行输入接口。串行输入接口在本题的需求描述中,根据表1内容,负责接收读取刹车次数和清除刹车次数两种指令,故测试内容为此两种指令。对“读取刹车次数指令”进行鲁棒性测试时应考虑的情况,其实也是接口鲁棒性测试概念的一个实例化,对接口的数据包而言,至少应该包括帧头错误、数据长度错误、数据错误、校验和错误、校验码错误以、帧尾错误以及其他防止指令错误手段的错误等。对本题的实例化而言,具体包括帧头错误、指令码错误、帧长错误、帧尾错误以及整个指令长度超过4字节的情况。
2、如果不考虑约束,软件工作状态从组合的角度来说,表2的测试顺序完全符合要求。但是许多软件在实际使用中,由于真实情况的限制,不能从理论的情况进行组合,对一些条件必须要进行约束。比如本题中,在单次进入正常工作模式后,就不能进入维护模式,因为维护模式是一种检修模式,不能在正常工作中进行检修,所以必须保证在正常工作模式下,对维护模式命令不响应。所以此题的前提条件应该为“上电前置In_D1为高电平,给测试环境上电,模式识别信号灯为红色”,即在上电后首先让工作模式为维护模式;然后再发送进入正常工作模式命令,灯变绿,进入工作模式;最后在正常工作模式下,发送进入维护模式命令,此时软件应该不响应,灯继续为绿色,表示在工作模式,完成带约束条件的状态转换测试。如果继续表2的测试前提条件,不管发送什么命令,灯一直不会变化,就无法判断是软件问题还是测试设备问题,无法完成测试。
3、此题是一个简单的测试概念,缺陷探测率(DDP)=测试发现的软件问题/软件总的发现问题,对本题而言,缺陷探测率(DDP)=(17+31)/(17+31+2)=96%。
某公司承接了某嵌入式系统的研制任务。该嵌入式系统由数据处理模块、系统管理模块、FC网络交换模块和智能电源模块组成,系统组成如图1所示。数据处理模块处理系统的应用任务;系统管理模块除了处理系统的应用任务外,还负责管理整个嵌入式系统;FC网络交换模块采用消息机制,支持广播和组播,主要负责系统的数据交换;智能电源模块负责给其他模块供电,该模块根据系统命令可以给其他模块供电或停止供电。
1、该系统的软件大部分是用C语言编程的,编程人员经常会使用运算符,请按优先级由高到低的次序,重新排序下面的运算符:%, =, image.png=, &&。
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、智能电源模块首先进行系统初始化,初始化后各设备就可使用,再根据系统初始配置表对嵌入式系统的其他模块供电。智能电源模块通常完成两件事情:
一、周期性地查询本模块温度、各路电流(给各模块供电的)以及电源模块的供电是否异常,如果异常,则进行异常处理,并报系统管理模块,由系统管理模块进行决策;
二、进入中断处理程序,处理系统管理模块的各种命令,如果系统管理模块命令关机下电,则智能电源模块对所有模块(也包括自己)进行下电处理
图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语言运算符优先级表(由上至下,优先级依次递减)。
综上所述,本题中运算符优先级由高到低的次序为: %, image.png=, &&, =
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所示。
阅读以下关于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)
【程序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
某水电站根据安全监控的需要决定采用嵌入式工控微机进行实时多任务安全监测。该系统有32路模拟量输入、96路开关量、16路脉冲量输入和水位落差量输入,产生显示信息、报警信号、监测报表和水位传感器控制信号等输出。该水电站安全监测系统具有以下几个特点:对各种模拟量、开关量、脉冲量、水位落差量等数据量的监测,事实上只是周期性地重复执行相应的各个任务模块。
监视的对象比较固定,系统硬件的规模相对固定不变。尽可能允许把所有软件都固化在EPROM中。人机交互作用的内容固定,即由操作人员通过键盘去调用此系统中所存入的相应应用程序,不会去修改应用程序。基于以上安全监测系统的特点,该水电站技术研发部门准备选用现有的工业控制机系统及现成的各种模板等硬件,由本部门的开发人员自行开发软件。
所开发的软件主要包括:应用程序,即按各类输入/输出量的采集、处理、显示、报警和制表等功能分别作为若干任务块,由这些任务组成应用程序。多任务嵌入式实时操作系统,用来协调各任务的资源分配与管理,管理任务之间的联系与多任务操作。
[问题1]根据以上安全监测系统的特点,技术研发人员郭工程师提出了一个自行编制简化“多任务嵌入式实时操作系统”的方案,以适应于协调管理硬件资源和监测对象的实际需求,其中只保留了标准的多任务实时操作系统的核心功能,例如CPU管理、中断管理和外设管理等。请在200字以内简要说明郭工程师提出的简化的“多任务嵌入式实时操作系统”可能具有哪些优点。
[问题2]设计简化的多任务嵌入式实时操作系统时,由于多个任务均可能要求占用CPU这个关键资源,因此CPU的任务管理是一个非常重要的设计内容。在该嵌入式实时操作系统中,作为占用资源的基本单位,任务总共有五个状态,分别是休眠状态、就绪状态、运行状态、等待状态和延时等待状态。在任何时候,一个任务只会处于其中的某一个状态。请根据图6-8中已给出的信息将(1)~(5)空缺处填写完整。
[问题3]在该水电站安全监测系统中,数据采集任务(Collect_task)把所采集的数据送入一单缓冲区,计算任务(Calculate_task)从该单缓冲区中取出数据进行计算。以下是利用信号量机制实现两个任务共享单缓冲区的C语言形式化描述程序。请将程序代码中(6)~(9)空缺处以及(10)空缺处的内容填写完整。int sr=0'int (6) :main(){cobeginCollect_task();Calculate_task();coend}Collect_task(){ While(采集工作未完成){ 采集一个数据, P(se), 将数据送入缓冲区中: (7) ,}}Calculate_task(){While(计算工作未完成){(8) ,从缓冲区中取出数据:(9)进行数据计算送入缓冲区中,}}如果以上程序中“int sf=0;”语句不小心被改写成“ints{=-1;”,那么系统运行时将会进入(10)状态。
问题1:①可加快该操作系统的开发周期,并使其更易于维护,②减少操作系统占有内存的容量,便于固化,③减少操作系统的运行开销(例如CPU占用时间),④可提高系统的实时性能和快速响应能力;⑤可提高系统的资源利用率和性价比等
这是一道要求读者根据实际应用环境分析多任务嵌入式实时操作系统的特点的综合理解题。
本题的解答思路如下:(1)嵌入式实时系统(RTOS)是指能够在指定的时间内完成系统功能和对内部或外部、同步或异步时间做出响应的系统,它还具有在事先定义的时间范围内识别和处理离散事件的能力,系统能够处理和存储控制系统所需要的大量数据。实时操作系统的主要功能是多任务、可抢占的任务调度、中断管理、存储管理、时钟管理、外部设备管理以及文件系统等。
(2)由试题中关键信息“只保留了标准的多任务实时操作系统的核心功能,例如CPU管理、中断管理和外设管理等”可直接理解简化的多任务嵌入式实时操作系统中“简化”一词的涵义。“简化”可加快该操作系统的开发周期,并使其更易于维护。
(3)由题干关键信息“对各种模拟量、开关量、脉冲量、水位落差量等数据量的监测,事实上只是周期性地重复执行相应的各个任务模块”可知,系统中有着相对较多的简单输入量,另外由于“监视的对象比较固定,系统硬件的规模相对固定不变”,因此,采用简化多任务实时操作系统是可行的。
(4)采用简化的实时操作系统比标准多用户实时操作系统(MROS)所需占用的主存空间容量小,更符合题干中“尽可能允许把所有软件都固化在EPROM中”的要求。
(5)另外,采用简化的实时操作系统具有可提高系统的实时性能和快速响应能力,可减少操作系统的运行开销(例如CPU可更快运行任务,更快响应中断),提高系统的资源利用率和性价比等。
问题2:(1)等待状态(2)就绪状态(3)休眠状态(4)延时等待(5)运行状态
这是一道要求读者根据实际应用环境分析嵌入式实时操作系统任务状态转换的综合理解题。
本题的分析思路如下:①任务是相应任务块程序关于某数据集合的可并发的一次运行活动,即任务通常作为占有资源的最基本单位。在本案例的实时操作系统中,任务总共有五个状态,分别是休眠状态、就绪状态、运行状态、等待状态和延时等待状态。而且试题中已给定“在任何时候,一个任务只会处于其中的某一个状态”。
②其中,休眠状态指任务还没有初始化,或任务的执行已经结束,实际上对操作系统来说,该任务是不存在的。就绪状态是指任务已经具备了运行的条件,但是由于CPU正忙,正在运行其他的任务,因此暂时不能运行的状态。
③运行状态表示此任务正在占有CPU,并在CPU上运行。处于就绪状态的任务只要把CPU控制权分配给它(任务调度),它就能够立刻执行。等待状态是指任务因为正在等待某种事件的发生而暂时不能运行。例如,它正在等待某个I/O操作的完成,或者它同某个任务之间存在着同步关系,正在等待该任务给它发信号。此时,即使CPU已经空闲了下来,它也还是不能运行。处于等待状态的任务可以被某些系统调用或事件激发而转到就绪状态。当一个任务运行过程中需要等待某个事件或更高优先级的任务占用CPU时,将由运行状态转移到等待状态。
由此可判断(1)空缺处填写的内容是“等待状态”,(2)空缺处填写的内容是“就绪状态”,(5)空缺处填写的内容是“运行状态”。
④处于运行状态的任务如暂时不需要占用CPU资源,则可直接进入休眠状态;而当操作系统唤醒某一处于休眠状态的任务时,该任务将进入就绪状态,因此(3)空缺处可填入“休眠状态”等内容。
⑤由图6-8中“延时时间到”以及(2)空缺处填写的内容是“就绪状态”、(5)空缺处填写的内容是“运行状态”可推理出,(4)空缺处可填人“延时等待”这一状态。
⑥图6-14给出了一个完整的简化实时操作系统的任务状态转换图。
问题3:se=1(7)V(sf)(8)P(sf)(9)V(se)(10)死锁
这是一道要求读者掌握信号量操作机制的程序分析题。
本题的解答思路如下:①在本试题中,数据采集任务(Collect_task)和计算任务(Calculate_task)共用一个单缓冲区。数据采集任务(Collect_task)采集到一个数据后,只有当缓冲区为空时,才能将数据送入该单缓冲区存放,否则应等待单缓冲区腾空。当单缓冲区中有数据时,计算任务 (Calculate task)才能从缓冲区中取出数据进行计算,否则也应等待。
②本试题信号量操作机制的实质是一个典型的生产者——消费者操作问题,即需要使用两个任务间同步算法解决问题。
③本试题中应设置两个信号量,其中一个信号量来表示缓冲区中是否有可供计算的数据,其初值为0。程序代码中“int sf=0;”语句正是对该信号量的定义。
④实现两个任务间同步算法时,还需定义另一个信号量来表示单缓冲区中有无空位置存放新的数据,其初值为1。数据采集任务(Collect_task)程序代码中已给出“P(se),”语句,间接说明另一个信号量的标识是“se”。因此(6)空缺处所填写的内容是“se=1”。
⑤当数据采集任务(Collect_task)将数据送入单缓冲区中时,应使用“V(sf),”语句唤醒原处于等待状态的计算任务(Calculate_task)。因此(7)空缺处所填写的内容是“V(sf);”语句。
⑥由于计算任务(Calculate_task)需要等待单缓冲区中有数据时,才能从缓冲区中取出数据进行计算,也就是说,单缓冲区中没有数据时,计算任务(Calculate_task)应处于等待状态。因此(8)空缺处实现此功能语句的语句是“P(sf);”。
⑦当计算任务(Calculate_task)从缓冲区中取出数据时,单缓冲区的空间被腾空,此时允许将新数据存人该单缓冲区,即单缓冲区的使用权限将交付给数据采集任务(Collect _task因此(9)空缺处需填入语句“V(se);”实现此功能。
⑧当信号量sf的初始值为-1时,假设计算任务(Calculate_task)先被调度执行,它执行P(sf)操作时,使sf的值变为-2,计算任务(Calculate_task)进入阻塞状态。假设此时发生了一次时钟中断,数据采集任务(Collect_task)被调度执行,它顺利通过了P(se)操作,并使se的值变为o,接着在执行V(sf)操作,并使sf的值变为-1,假设满足“While(采集工作未完成)”判断条件,P(se)操作将再次执行,并使se的值变为-1,数据采集任务 (Collect_task)也进入阻塞状态。这样一来,两个任务都在等待对方释放信号量,就成为了一种死锁状态。
使用在汽车、飞机中的嵌入式软件,由于直接影响人的生命及财产安全,测试要求更为严格。语句覆盖、判定覆盖、条件覆盖和MC/DC覆盖是通常对这类软件的要求。
以下是一段C语言代码,请仔细阅读,并回答相关问题:int logicTest(int x, int y){int magic=0;if(x>0 && y>0) {magic=x+y+10;}else{magic=x+y-10;}if(magic image.png 0){magic=0;}return magic;}
问题1:请根据测试要求,简要说明语句覆盖、判定覆盖、条件覆盖和MC/DC覆盖的含义。
问题2:画出以上代码的流程图。
问题3:请根据[说明]中的C语言代码,计算满足MC/DC覆盖要求的用例数量及条件取值范围
问题1:
问题2:
问题3:用例数量:3个;条件取值范围:(x>0 and y<=0)、(x<=0 and y>0)及(x>0 and y>0)
本问题考查MC/DC覆盖率判定的综合运用。MC/DC与代码中的逻辑运算有关。
本题代码中的逻辑运算为x>0 &&y>0。根据MC/DC的定义,MC/DC覆盖要求每个条件的取值都有覆盖,每个判定值都有覆盖且每个条件都能独立影响判定结果。对于a&&b这样的逻辑运算,真值表如下。
对测试用例1和测试用例2,条件a不变,因为条件b的不同而导致结果的不同,因此条件b独立影响判定的结果。
对测试用例2和测试用例3,因为条件b不变,条件a的不同而导致结果的不同,因此条件a独立影响判定的结果。
综合以上,对逻辑运算a&&b应产生三个测试用例,包括:(True,False)、(True,True)、(False,True)。
所以本题用例数量:3个;条件取值范围:(x>0 and y<=0)、(x<=0 and y>0)及(x>0 and y>0)。
在开发某嵌入式系统时,设计人员根据系统要求,分别编写了相关程序,其中:
[程序1] 是李工编写的一个数据交换子程序。
[程序2] 是赵工编写的一段利用递归方法判别链表表示的两个数据结构是否相等的程序,若相等则返回值为1,否则返回为0。判别的准则是若两个链表的首指针相等,则相等;否则进行内部元素比较,元素中的itemid表示后面联合体un的有效性,itemid为0时,联合体un里面的data项有效,否则联合体un中的link项有效。
[程序1]#includeimage.pngstdio.h>swap(int x,int y) {int t;t=x;x=y;y=t;}main17 {int a, b;a=3;b=4;swap (a,b);printf("%d, %d\n", a, b);}
[程序2]typedef struct Item {int itemid;union {char data;struct Item *link;} un;struct Item *nextItem;} ItemNode;int EqualItem(ItemNode *x, ItemNode *y) {int res;if x==y) return 1;if (12) {if (13) {if (x->itemid==0) {res=14;}else {res=15}if (res) {return 16}}}return 0;}
问题1:执行[程序1]后,打印出来的a=3,b=4;并没有完成数据交换,请指出李工的问题?并改正程序错误。
问题2:仔细阅读并分析[程序2]中的C语言代码,完成其中(1)~(5)空白填空。
问题3:李工编写某嵌入式软件时,遇到了一些问题,请帮助李工解答下面2个问题。
(1)李工在编译时,程序没有通过编译,经检查程序后将文件头的#include image.pngfilename.h>改为#include "filename.h"后编译通过,请问#includeimage.pngfilename.h>和#include "filename.h"的区别是什么?
(2)李工在编写一段c++程序时,需要调用一段已编译的C语言函数,为什么要加extern "C"?
问题1:李工的问题:形参不能作为函数的输出参数使用。
对应的swap函数修改如下:swap (int *x, int *y){int t;t=*x;*x=*y;*y=t;}调用时修改为swap(&a,&b)本题考查嵌入式C/C++编程知识与应用。函数swap采用值传递,虽然将形参x和y交换了,但是并不影响到实参,所以执行[程序1]后,打印出来的a=3,b=4;并没有完成数据交换。将值传递改成指针传递就可以了。对应的swap函数应修改如下:swap (int *x, int *y){int t;t=*x;*x=*y;*y=t;}调用时应修改为swap(&a,&b)
问题2:(1)x!=NULL&&y!=NULL
(2)x->itemid==y->itemid
(3)x->un.data==y->un.data
(4)EqualItem(x->un.link, y->un.link);
(5)EqualItem(x->nextItem, y->nextItem);
该段C语言程序是一段利用递归方法判别链表表示的两个数据结构是否相等的程序,若相等则返回值为1,否则返回为0。判别的准则是若两个链表的首指针相等,则相等;否则进行内部元素比较,元素中的itemid表示后面联合体un的有效性,itemid为0时,联合体un里面的data项有效,否则联合体un中的link项有效。
该程序具体如下:如果x==y,则返回1,表示断定两个数据实际指向是同一地方,当然相等;如果x和y都不为空则继续,否则返回0;如果x->itemid==y->itemid,则继续,否则返回0;如果x->itemid==0,则若x->un.data==y->un.data,res=1,否则res=0;如果x->itemid不等于0,联合体un中的link项有效,递归调用EqualItem(x->un.link, y->un.link),继续判断;如果res=1,也就是x->un.data=y->un.data,则递归调用EqualItem(x->nextItem, y->nextItem),判断下一级链表;如果res=0,也就是x->un.data不等与y->un.data,则即可断定两个数据不相等,返回为0。
问题3:(1)对于#include<filename.h>,编译器从工程指定路径搜索filename.h;对于#include "filename.h",编译器从当前路径和工程指定路径搜索filename.h;
(2)C++语言支持函数重载,C语言不支持函数重载,函数被C++编译后在库中的名字与C语言不同。C++提供了C连接交换指定符号extern "C"来解决名字匹配问题。
本题考查考生对预处理指令include的正确理解。
对于#include<filename.h>来说,编译器会从工程指定路径搜索filename.h wen件;对于#include "filename.h"来说,编译器会从当前路径和工程指定路径搜索filename.h wen件。C++语言支持函数重载,C语言不支持函数重载,函数被C++编译后在库中的名字与C语言不同。为了C++程序中能够调用C程序,就需要C++提供C连接交换指定符号extern "C"来解决名字匹配问题。
某公司承接了一个控制系统的项目,由王工负责系统的方案设计。王工的设计方案如图1所示。该方案是基于VME总线的多机并行处理系统,由主控制模块作为VME总线的主设备,即总线控制器,负责整个系统的控制与管理;3个数据处理模块作为从设备,负责数据处理与计算;1个I/O模块也作为从设备,负责系统与外部接口之间的高速数据通信。同时,为了简化设计,该系统5个模块均采用同一款VME协议芯片,实现内总线和VME总线的连接。
该系统中每个模块的相关信息见表1所示。
1、王工设计采用共享存储器方式,进行多机之间的通信。VME共享存储器的地址空间映射,分为输出窗口和输入窗口两部分。输出窗口实现处理器本地地址空间到VME总线地址空间的映射,输入窗口实现VME总线地址空间到处理器本地地址空间的映射。 输出窗口空间设置说明:为了每个模块能访问到其他4个模块,在每个模块的处理器本地地址空间中开辟5M空间,映射到VME总线上的5M地址空间。映射关系见表2。
输入窗口空间设置说明:每个模块分配1M的VME地址空间,并将这1M空间映射到处理器本地RAM区域中,专门用于VME通信数据缓冲区。映射关系见表3。
VME总线驱动中,按照上述方式对寄存器进行设置,实现了VME总线共享存储器工作方式,将对其他模块的操作转化为对处理器本地地址空间访问操作相似的读写操作,并且都采用总线远程写,总线本地读的方式。
数据处理模块1发送消息到数据处理模块2,它们之间采用1M数据缓冲区的第一个32位作为握手标志。则数据处理模块1访问标志区的总线地址为______,数据处理模块2访问标志区的总线地址为______。 I/O模块向主控制模块发送控制命令,它们之间采用1M数据缓冲区偏移0x100处作为命令缓冲区。则I/O模块访问命令区的总线地址为______,主控制模块访问命令区的总线地址为______。
2、如表1所示,该系统中采用的处理器有大端和小端两种工作模式。王工设计VME总线上传输的数据全部采用小端方式,那么当处理器通过VME总线发送数据时,需要根据自己的工作模式,对数据进行必要的转换,以符合协议要求。 当I/O模块向主控制模块发送控制命令0xAABBCCDD,那么它写入V=ME总线的实际数据是______,当主控制模块向数据处理模块3和I/O模块发送控制命令0x12345678,那么它写入VME总线的实际数据是______和______。
3、为了提高数据通信的性能,在进行大数据量通信时,王工设计采用DMA的方式。DMA通信方式能够满足高速VME设备的需求,也有利于发挥CPU效率。该VME协议芯片有两种DMA工作方式:一种是直接方式(Direct mode),一种是链方式(Linked list mode)。
在直接方式下,在每次数据传输前,需要驱动程序对DMA控制寄存器进行设置,然后进行DMA传输,并等待传输完成,或者异常错误。直接方式是一种软件和硬件同步工作方式。在链方式下,驱动程序只需要设置命令包。
在通信过程中,硬件根据命令包的内容完成传输,并根据链中的下一个命令包,继续传输,直到所有命令包完成或者异常错误。链方式是一种软件和硬件异步工作的方式。 图2是DMA直接方式的流程图,请补全流程图。
1、0xD020'0000 0x00F0'0000 0xD000'0100 0x00F0'0100
2、0xAABBCCDD 0x78563412 0x78563412
3、(1)设置DMA目的地址或(2) (2)设置传输长度或(1) (3)设置DMA传输启动位DMA是否正常终止
1、本题考查嵌入式系统中计算机总线、存储、DMA等相关知识及应用。 该系统是基于VME总线的多机并行处理系统,采用共享存储器方式进行多机之间的通信,定义了5MB的VME空间,用于主控制模块等5个模块之间的VME通信。 VME总线的共享存储器方式,通过地址空间映射来实现,分为输出窗口和输入窗口两部分。输出窗口实现处理器本地地址空间到VME总线地址空间的映射,本系统中每个模块配置了相同的5MB的处理器输出窗口地址空间(0xD000' 0000~0xD04F' FFFF),用于映射到VME总线上的5MB地址空间(0x0000' 0000~0x004F' FFFF)。输入窗口实现VME总线地址空间到处理器本地地址空间的映射。本系统中按照模块顺序,每个模块将1M的VME地址空间,映射到处理器本地RAM区域中(0x00F0' 0000~0x00FF' FFFF),专门用于VME通信数据缓冲区。整个系统的映射关系图3所示。
由于所有驱动都采用总线远程写方式,数据处理模块1要访问数据处理模块2的通信缓冲区,访问的基地址就是数据处理模块2内存缓存区对应的VME总线地址,即VME总线0x0020' 0000,该地址对应数据处理模块1的本地地址,则为0xD020' 0000。由于所有驱动都采用总线本地读的方式,所以数据处理模块2访问的基地址为本地存储器地址,即0x00F0' 0000。具体的地址空间再由基地址加上指定的偏移即可。 同理,I/O模块要访问主控制模块的通信缓存区,访问的基地址就是主控制模块内存缓存区对应的VME总线地址,即VME总线0x0000' 0000,该地址对应I/O模块的本地地址,则为0xD000' 0000。主控制模块访问的基地址为本地存储器地址,即0x00F0' 0000。具体的地址空间再由基地址加上指定的偏移即可。
2、数据在计算机中表示时,有大端和小端两种格式。大端模式是指数据的高位保存在内存的低地址中,而数据的低位保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理,地址由小向大增加,而数据从高位往低位放。小端模式是指数据的高位保存在内存的高地址中,而数据的低位保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低,与用户的逻辑方法一致。 例如,数字0x12345678在内存中的表示形式为:
1.大端模式:低地址------>高地址0x12|0x34|0x56|0x78
2.小端模式:低地址------>高地址0x78|0x56|0x34|0x12
从软件处理的角度上,不同端模式的处理器进行数据传递时必须要考虑端模式的不同。如进行网络数据传递时,必须要考虑端模式的转换。其中互联网使用的网络字节顺序采用大端模式进行编址,而主机字节顺序则根据处理器的不同而不同,如PowerPC处理器使用大端模式,而Pentium处理器使用小端模式。大端模式处理器的字节序到网络字节序不需要转换;而小端模式处理器的字节序到网络字节必须要进行转换。
在该系统中,VME总线上传输的数据全部采用小端方式,但主控制模块、数据处理模块1、数据处理模块2、数据处理模块3均采用大端方式处理器,因此发送到VME总线上的数据要进行大端到小端模式的转换,而从VME总线上接收的数据,要进行小端到大端模式的转换,但I/O模块由于采用的是小端模式的处理器,则不需要进行转换。
3、DMA(Direct Memory Access, 直接内存存取)是所有计算机的重要特色,它允许不同速度的硬件装置来传输数据,而不需要依赖于CPU的大量负载。DMA传输将数据从一个地址空间复制到另外一个地址空间。当CPU初始化这个传输动作,传输过程则由DMA控制器来实行和完成,如图4所示。典型的例子就是移动一个外部内存的区块到芯片内部更快的内存区。这样的操作并没有让处理器工作拖延,反而可以被重新安排去处理其他的工作。DMA传输对于高效能嵌入式系统是很重要的。 在实现DMA传输时,由DMA控制器直接掌控总线,因此,存在着一个总线控制权转移问题。即DMA传输前,CPU要把总线控制权交给DMA控制器,而在结束DMA
传输后,DMA控制器应立即把总线控制权再交回给CPU。一个完整的DMA传输过程必须经过DMA请求、DMA响应、DMA传输、DMA结束4个步骤。
(1)DMA请求 CPU对DMA控制器初始化,并提供要传送的数据的起始位置、目的地址和数据长度。并向I/O设备发出启动操作命令,I/O设备提出DMA请求。
(2)DMA响应 DMA控制器对DMA请求判别优先级及屏蔽,向总线裁决逻辑提出总线请求。当CPU执行完当前总线周期即可释放总线控制权。此时,总线裁决逻辑输出总线应答,表示DMA已经响应,通过DMA控制器通知I/O设备开始DMA传输。
(3)DMA传输 DMA控制器获得总线控制权后,CPU即刻挂起或只执行内部操作,由DMA控制器输出读写命令,直接控制RAM与I/O设备进行DMA传输。 在DMA控制器的控制下,在存储器和外部设备之间直接进行数据传送,在传送过程中不需要中央处理器的参与。
(4)DMA结束 当完成规定的成批数据传送后,DMA控制器即释放总线控制权,并向I/O设备发出结束信号。当I/O设备收到结束信号后,一方面停止I/O设备的工作,另一方面向CPU提出中断请求,使CPU从不介入的状态解脱,并执行一段检查本次DMA传输操作正确性的代码。最后带着本次操作结果及状态继续执行原来的程序。
由此可见,DMA传输方式无需CPU直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为RAM与I/O设备开辟一条直接传送数据的通路,使CPU的效率大为提高。
在某四轴飞行器系统设计中,利用惯性测量单元(IMU)、PID电机控制、2.4G无线遥控通信和高速空心直流电机驱动等技术来实现一个简易的嵌入式四轴飞行器方案。整个系统的设计包括飞控板和遥控板两部分,两者之间采用2.4G无线模块进行数据传输。飞控板采用高速单片机STM32作为处理器,采用含有三轴陀螺仪、三轴加速度计的运动传感器MPU16050作为惯性测量单元,通过2.4G无线模块和遥控板进行通信,最终根据PID控制算法以PWM方式驱动空心电机来控制目标。
图1为李工设计的系统总体框图。
飞控板和遥控板的核心处理器都采用STM32 F103。飞控系统的惯性测量单元采用MPU6050测量传感器,MPU6050使用IIC接口,时钟引脚SCL、数据引脚SDA和数据中断引脚分别接到STM32的对应管脚,图2为该部分原理图。遥控板采用STM32单片机进行设计,使用AD对摇杆模拟数据进行采集,采用NRF2401无线模块进行通信,图3为该部分原理图。 李工所设计的系统软件同样包含飞控板和遥控板两部分,飞控板软件的设计主要包括无线数据的接收、自身姿态的实时计算、电机PID增量的计算和PWM的电机驱动。遥控板主控制器软件通过ADC外设对摇杆数据进行采集,把采集到的数据通过2.4G无线通信模块发送至飞控板。
图4为飞控系统的软件流程示意图。
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次的倍数,则需要采集电池电压,并通过无线模块把电池电压发送给遥控板。
某综合化智能空气净化器设计以微处理器为核心,包含各种传感器和控制器,具有检测环境空气参数(包含温湿度、可燃气体、细颗粒物等),空气净化、加湿、除湿、加热和杀菌等功能,并能通过移动客户端对其进行远程控制。图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]image.pngimage.png8)|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])。
王工在采用某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.三余度数据采集及处理要求:
(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,上报一级故障。
某公司承接了一个数据处理模块的项目,由沈工负责模块的方案设计,沈工的设计方案如图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。
某直升机的显示控制计算机是其座舱显控系统的核心部件,将来自飞行员的参数和控制命令与载机的飞行参数信息进行融合处理后,在显示器上显示。该显示控制计算机由一个显示控制单元和一个输入输出单元组成,它们之间通过双口RAM进行数据交换,如图4-1所示。
显示控制单元采用Freescale公司的PowerPC8270高性能、低功耗32位处理器,并设计有系统FLASH存储器、用户FLASH存储器、SDRAM存储器。CPU内部宾成存储器控制器,提供地址译码、数据处理周期访问时序、SDRAM时钟等功能。输入输出单元采用Ti公司的DSP F2812高性能、低功耗16位处理器,采用AF.INC429总线用于接收导航计算机、大气数据计算机等外部设备的数据。
ARINC429解算程序严格遵循ARINC429规范,其通用字格式如表4-1所示,字长32Bit,不用的数据位填“0”。当接收到ARINC429数据后,首先判断状态位,只有在状态和标号正确的情况下,才进一步根据分辨率等进行解算数据的含义。
问题:1 系统FLASH存储器的存储容量是8MB,用于存储CPU模块引导程序、BIT测试程序,FLASH在板编程程序,网口操作系统,用户程序。系统FLASH地址分配在存储空间的高端,地址空间为(1)~OxFFFFFFFF。用户FLASH存储器的存储容量是为(2),用于记录数据的存储。FLASH地址分配在存储空间的高端,地址空间为0x78000000?0x7BFFFFFF。SDRAM的存储容量是256MB,用于运行操作系统和应用软件,地址空间位于存储器的低端0x00000000~3)。请完成(1)~(3)填空。
问题:2 根据ARINC429数据的标号(D8-D1)可知该数据为高度表数据。根据系统定义,高度表数据的分辨率为0.1米,即D9为1表示0.1米,D10为1表示0.2米,D11为1表示0.4米,依此类推。若接收数据帧中D28-D9位是0000.0000.0111.1101.0000,则当前的高度是(1)米。若当前的高度是100米,则数据帧中D28-D9位应为(2)。请完成(1)和(2)填空。
问题:3 显示控制单元和输入输出单元通过双口交换信息,两个处理器上的软件采用相同定义的结构体来定义双口单元,方便交换信息。以下是双口结构体定义:typedef struct{char ctrlWord; /*通道工作方式控制字*/char head; /*F1FO 控制头指针*/char tail; /*FIFO 控制尾指针*/short fifo[32] ; /*FIFO 缓冲区*/}SPM_CHAN_RX429; /*ARINC429 接收通道定义*/为了避免由于不同的编译环境对上述数据结构产生不同的编译结果,建议对上述数据结构通过设置紧缩属性(packed属性),强迫编译器采用字节对齐方式,在该模式下,SPM_CHAN_RX429结构体占用(1)字节的存储空间。ARINC429接收通道设计为由一个首尾相连的FIFO数组形成的环形队列。输入输出单元根据头指针向环形队列写入数据,头指针始终指向下一个要写入的位置,并且限制写入数据最多为31个,即队尾与队首之间至少保留一个元素的空间。显示控制单元根据尾指针从环形队列读取数据,尾指针始终指向下一个要读取的位置。初始化环形队列的C语言为:typedef struct{char ctrlWord; /*通道工作方式控制字*/char head; /*F1FO 控制头指针*/char tail; /*FIFO 控制尾指针*/short fifo[32] ; /*FIFO 缓冲区*/}SPM_CHAN_RX429; /*ARINC429 接收通道定义*/SPM_CHAN_RX429 *pBuf;pBuf= (SPM_CHAN_RX429 *) ADDR_3RAM_PPC; /*双口地址的宏定义*/ pBuf->ctrlWord=0;pBuf->head=O; pBuf->tail=O;判断队列为空的C语言为(2)。判断队列为满的C语言为(3)。;请完成(1)~(3)填空。
问题1:(1)0xFF800000 (2)64MB(3)0x0FFFFFFF
问题2:(1)200(2)0000.0000.0011.1110.1000
问题3:(1)67 (2)pBuf->head == pBuf->tail(3)pBuf->tail == (pBuf->head + 1)%32
问题1:计算机的内存出处容量的计量单位是字节,系统FLASH存储器的存储容量是8MB,二进制表示为0x800000,地址分配在存储空间的高端,地址空间为0Xff800000-0xFFFFFFFF。用户FLASH的地址空间为0x78000000-0x7BFFFFFF,存储容量是0x40000000,也即64MB。SDRAM的存储容量是256MB,二进制表示为0x10000000,地址分配在存储空间的低端,地址空间为0x00000000-0x0FFFFFFF。
问题2:基本的二进制和十进制的换算。
问题3:本题中由于是采取强制编译器按照字节对齐方式,因此该模式下,char正好字节对齐,short占用两个字节,共1+1+1+32*2=67B。环形队列是一个首位相连的FIFO数据结构,为了判断空和满,长度为n的环形队列会只存n-1个数据,空出一个不存(题中也是只存31个),其头指针指向第一个节点,尾指针指向最后一个节点的下一个节点,因此队列为空的时候头指针和尾指针相等。队列满的时候尾指针+1=头指针,实际使用时,考虑循环队列会转回0,要进行取模操作。
在某嵌入式系统设计中,使用8片RAM进行64KRAM的外部存储器扩展,如图所示。该CPU有16根地址线,8根数据线,在设计中,利用CPU的作为访问控制信号,该访问控制信号低电平有效。另外,R/W作为读写命令信号(高电平为读,低电平为写)。8片8Kx8位的RAM芯片与CPU相连,RAM芯片的片选内部为上拉电阻到电源,各个RAM芯片的片选信号和74138译码器的输出相连,译码器的地址选择端连接到CPU的A13,A14,A15地址线上。
问题1:根据上图所示,写出RAM0,RAM1和RAM7的地址范围(请用16进制进行表示)。RAM0: (1)RAM1: (2)RAM7: (3)若CPU操作的地址总线为A800H,结合上图所示的示意图,CPU访问的是哪个RAM存储器 ?(4) ?。
问题2:如果运行时发现不论往哪片RAM写入数据后,以C000H为起始地址的存储芯片都有与其相同的数据,假设芯片与译码器可靠工作,则说明:
(1)RAM0~RAM7中______的片选输入端总是处于低电平。
(2)如果有问题的存储芯片的片选输入端总是处于低电平,以下可能原因中描述不正确的是______。A.该存储芯片的CS端与存储芯片的端错连或短路B.该存储芯片的CS端与CPU的端错连或短路C.该存储芯片的CS端与地线错连或短路D.该存储芯片的CS端悬空
问题3:根据连接图,若出现地址线A15与CPU断线,并搭接到高电平上,下面描述中正确的是______。(该题为多选题)A.此时存储器只能寻址A15=1的地址空间B.此时存储器只能寻址总共64KB空间的高32KB地址空间C.此时访问64KB空间的高32KB地址空间时会错误地访问到低32KB地址空间D.此时访问64KB空间的低32KB地址空间时会错误地访问到高32KB地址空间
问题1:(1)0000H-1FFFH (2)2000H-3FFFH(3)E000H-FFFFH (4)RAM5
在该嵌入式系统设计中,使用8片RAM进行64KRAM的外部存储器扩展。该CPU共有16根地址线,8根数据线。在设计中,各个RAM的片选信号依次连接在74LS138的八位输出信号上,74LS138的地址选择线连接在CPU的地址线A15,A14,A13上,因此,对8个RAM的选择依赖于CPU的地址线A15,A14和A13的电平。
根据74LS138可知,对于RAM0~RAM7的8个RAM而言,依次对应的A15,A14,A13的值为000,001,010,011,100,101,110,111。
同时,由于每个RAM的空间大小为8K,占据的地址线为A0~A12,因此,可以知道各个RAM的地址范围依次是:RAM0:0000H-1FFFHRAM1:2000H-3FFFHRAM2:4000H-5FFFHRAM3:6000H-7FFFHRAM4:8000H-9FFFHRAM5:A000H-BFFFHRAM6:C000H-DFFFHRAM7:E000H-FFFFH
问题2:(1)RAM6(2)D
由上题可知,对应C000H地址的片选为RAM6,也就是说RAM6一直处于被选通状态。从原理图中的连接情况可以看出,CS片选只有一直是低电平状态下才可以有效。
从原理图中可以看出,WE以及MREQ信号都是低电平有效,同时由题目中知道,该管脚为片内上拉到电源,因此如果该CS一直有效,可能潜在的原因包括与WE信号或者MREQ信号接错,或者是直接与地短接。
问题3:ABD
如果A15与CPU断开,并且接到高电平,则说明A15一直为高,那么A15,A14,A13取值的可能范围为100,101,110,111。也就是说,此时存储器的寻址范围只能是A15=1的存储地址空间,与之前的8片RAM相比,现在只能寻址到4片RAM,因此先前的64KB空间中只能寻址到高32KB的地址空间。同时,由于高位A15一直为1,因此,如果按照用户期望访问总共64KB空间的低32KB空间时,会错误的访问到高32KB地址空间。
某飞行器供油阀控制软件通过控制左右两边的油箱BL、BR向左右发动机EL、ER供油,既要保证飞行器的正常飞行,又要保证飞行器的平衡,该软件主要完成的功能如下:
(1)无故障情况下,控制左油箱Bl向左发动机BL供油,右油箱EL向右发动机BR供油,不上报故障;
(2)当左油箱BL故障时,控制右油箱BR分别向左、右发动机EL和ER供汩,并上报二级故障——左油箱故障;
(3)当右油箱BR故障时,控制左油箱BL分别向左、右发动机EL和ER供汩,并上报二级故障——右油箱故障;
(4)当左发动机EL故障时,根据左右油箱的剩油量决定(如果左右油箱剩油量之差大于等于50升,则使用剩油量多的油箱供油,否则同侧优先供油)左油箱BL还是右油箱BR向右发动机Er供油,并上报一级故障——左发动机故障;
(5)当右发动机ER故障时,根据左右油箱的剩油量决定(如果左右油箱剩油量之差大于等于50升,则使用剩油量多的油箱供油,否则同侧优先供油)左油箱BL.还是右油箱BR向左发动机El供油,并上报一级故障——右发动机故障;
(6)当一个油箱和一个发动机同时故障时,则无故障的油箱为无故障发动机供油,并上报一级故障——故障油箱和发动机所处位置;
(7)当两个油箱或两个发动机同时故障或存在更多故障时,则应进行双发断油控制,并上报特级故障——两侧油箱或两侧发动机故障;
(8)故障级别从低到高依次为二级故障、一级故障和特级故障,如果低级故障和高级故障同时发生,则只上报最高级别故障。
问题:1 在嵌入式软件测试中,一般采用的测试方法有白盒测试、黑盒测试和灰盒测试方法,白盒测试方法中需要基于(1)进行测试;根据本题给定的条件,最恰当的测试方法应选择(2)。
问题:2 覆盖率是度量测试完整性的一个手段,也是度量测试有效性的一个手段。在嵌入式软件白盒测试过程中,通常以语句覆盖率、分支覆盖率和MC/DC覆盖率作为度量指标。在实现第6条功能时,设计人员对部分功能采用了下列算法:if((BL==故障)&&(EL==故障)){BR供油ER;BL断油;EL断油;}请指出对上述算法达到100%语句覆盖、100%分支(DC)覆盖和100%MC/DC覆盖所需的最少测试用例数目。请完成表3-1中的(1)?(3)填空。
问题:3 为了测试此软件功能,测试人员设计了表3-2所示的测试用例,请填写该表中的空(1)?(9)。
问题1:(1)软件源代码(2)黑盒
问题2:(1)1(2)2(3)3
问题3:(1)BR (2)BL (3)BR(4)BL(5)BL(6)BL(7)BR (8)故障 (9)特级故障
问题1:白盒测试是针对源代码进行结构测试;黑盒测试不必了解源代码结构,直接针对功能测试;灰盒测试是二者综合,根据题目给出的描述,都是功能性的,与代码无关,是黑盒。
问题2:语句覆盖是对每条语句都执行一遍,题中,只要1个测试用例即可;DC测试是分支覆盖,又称为判定覆盖,是使代码中每个判断条件的真和假分支都至少执行一次,题中只有一个if判断,两个用例即可满足;MC/DC是修正判定条件覆盖,实际就是条件覆盖,要求代码中每个判断里的每一个条件的真和假都覆盖到,题中共两个条件,共4种组合,但是由于短路计算原理,对于与逻辑判断,当第一个条件为F时,整个表达式为F,无需管第二个条件,因此只需要TF TT FX(即第二个条件不限)三个用例即可。
[说明]在开发某嵌入式系统时,设计人员根据系统要求,分别编写了如下程序,其中:
[程序1]:实现两个变量的值的互换;
[程序2]:完成某功能的C语言程序;
[程序3]和[程序4]:是P、V操作的形式化定义,设S为信号量。在多道程序系统中,进程是并发执行的。这些进程间存在着不同的相互制约关系,主要表现为同步和互斥两个方面。信号量是解决进程间同步与互斥的有效方法。 [程序1] void swap (int n1, int n2) { int tmp=n1; n1=n2; n2=tmp; [程序2] #include image.pngstdio.h> int fun (int n) { int f0=0, f1=1, f, i; if (n==0) return 0; if (n==1) return 1; for(i=2j; iimage.png=n; i++) { f=f0+f1; f0=f1; f1=f; } return f; } void main12 {int n=5; printf ("fun(%d)=%d\n", n, fun(n)); n=7; printf ("fun(%d)=%d\n", n, fun(n)); n=9; printf ("fun(%d)=%d\n", n, fun(n)); } [程序3] P操作的形式化定义:P (S) { ______; if(______){ 阻塞该进程;将该进程插入信号量S的等待队列; } } [程序4]V操作的形式化定义:V(S) { ______; if(______){ 从信号量S的等待队列中取出队首进程;将其插入就绪队列; } }
1、执行[程序1]后,没有能够实现两个变量值的交换,为什么?请修改上述函数,实现两个变量值的交换,要求函数无返回值,形式为:void swap(...)。
2、请问[程序2]运行结果是什么?
3、请简述什么是临界资源?什么是临界区? 请完成[程序3]和[程序4]的形式化定义。
1、两个变量不能交换值的原因:因为函数是传值的,函数形参值的交换,并不影响到实参的值的变化。
正确的函数编写如下(下面只是范例,变量名称不作要求):void swap (int *pn1, int *pn2) { int tmp=*pn1; *pn1=*pn2; *pn2=tmp; }
2、第一次输出:fun(5)=5 第二次输出:fun(7)=13 第三次输出:fun(9)=34
3、临界资源:一次只能使一个进程访问的资源称为临界资源。临界区:进程中访问临界资源的那段代码称为临界区。 (1)S-- (2)S<0 (3)S++ (4)S<=0
1、本题考查嵌入式C/C++语言编程基础知识。
函数swap采用值传递,虽然将形参n1和n2交换了,但是并不影响到实参,所以执行[程序1]后,实参变量并没有完成数据交换。将值传递改成指针传递就可以了。
对应的swap函数应修改如下: swap (int *pn1, int *pn2) { int tmp; tmp=*pn1; *pn1=*pn2; *pn2=tmp; }
2、当n=5时,初始:f0=0,f1=1;for循环计算如下:i=2: f=0+1=1; f0=1; f1=1; i=3: f=1+1=2; f0=1; f1=2; i=4: f=1+2=3; f0=2; f1=3; i=5: f=2+3=5; f0=3; f1=5; 所以,调用fun(5),得到返回值5;同理,可计算出fun(7)=13; fun(9)=34。
3、在多道程序系统中,进程是并发执行的,这些进程之间存在着不同的相互制约关系。进程之间的这种制约关系来源于并发进程的合作以及对资源的共享。
进程在运行过程中,一般会与其他进程共享资源,而有些资源的使用具有排他性。系统中的多个进程可以共享系统的各种资源,然而其中许多资源一次只能为一个进程所使用,通常把一次仅允许一个进程使用的资源称为临界资源。许多物理设备都属于临界资源,如打印机、绘图机等。除物理设备外,还有许多变量、数据等都可由若干进程所共享,它们也属于临界资源。进程中访问临界资源的那段代码称为临界区,也称为临界段。
访问临界资源应遵循如下原则:①空闲让进(或有空即进):当没有进程处于临界区时,可以允许一个请求进入临界区的进程立即进入自己的临界区;②忙则等待(或无空则等):当已有进程进入其临界区时,其他试图进入临界区的进程必须等待;③有限等待:对要求访问临界资源的进程,应保证能在有限时间内进入自己的临界区;④让权等待:当进程不能进入自己的临界区时,应释放处理机。
信号量是荷兰著名的计算机科学家Dijkstra于1965年提出的一个同步机制,其基本思想是在多个相互合作的进程之间使用简单的信号来同步。
在操作系统中,信号量是表示资源的实体,除信号量的初值外,信号量的值仅能由P操作(又称Wait操作)和V操作(又称Signal操作)改变。
设S为一个信号量,P(S)执行时主要完成:先执行S=S-1;若S≥0则进程继续运行;若S<0则阻塞改进程,并将它插入该信号量的等待队列中。
V(S)执行时主要完成:先执行S=S+1;若S>0则进程继续执行;若S≤0则从该信号量等待队列中移出第一个进程,使其变为就绪状态并插入就绪队列,然后再返回原进程继续执行。
P、V操作的形式化描述如下:P(S) { S --; IF(S<0){ 阻塞该进程; 将该进程插入信号量s的等待队列; } } V(S) { S++; IF(S<=0) { 从信号量S的等待队列中取出队首进程; 将其插入就绪队列; } }
某嵌入式系统中,存在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、
3、
1、本题考查软件测试的一些基本概念和通过代码审查查找软件缺陷以及设计测试用例的能力。
此题目要求考生认真阅读题目所给的软件设计说明信息和软件代码,熟悉结构体数据类型和不同代码覆盖率的要求,结合软件测试的一些基本概念,在此嵌入式软件中进行实际应用。
控制流程图分析是一个静态的分析过程,它提供静态的度量标准技术,一般主要运用在白盒测试的方法中。控制流图是McCabe复杂度计算的基础,McCabe度量标准是将软件的流程图转化为有向图,然后以图论的知识和计算方法来衡量软件的质量。McCabe复杂度包括圈复杂度(Cyclomatic complexity)、基本复杂度、模块涉及复杂度、设计复杂度和集成复杂度等。
在软件测试的概念里,圈复杂度“用来衡量一个模块判定结构的复杂程度,数量上表现为独立线性路径条数,即合理的预防错误所需测试的最少路径条数,圈复杂度大说明程序代码可能质量低且难于测试和维护,根据经验,程序的可能错误和高的圈复杂度有着很大关系”。圈复杂度大说明程序代码的判断逻辑复杂,可能质量低且难于测试和维护。程序的可能错误和高的圈复杂度有着很大关系。
嵌入式软件中通常使用圈复杂度来衡量程序的可维护性,一般要求圈复杂度不大于10。函数num_of_passer。的流程图如图1所示。
有以下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覆盖。
某公司承接了一个数据采集与处理系统的项目,由刘工负责系统的方案设计,刘工的设计方案如图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所示。
双口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。
某舰载综合处理系统由若干数据处理模块、10处理模块、信号处理模块、图形处理模块、大容量处理模块和电源模块组成,各处理模块通过CAN总线连接,如图1-1所示。
为了提高综合处理系统的处理速度,主要处理模块都设计为多个处理器。其中,数据处理模块有
串行RapidlO协议即SRIO通信协议,构建了3层的协议体系。如图1-3所示,分别是物理层、传输层、逻辑层。物理层定义了硬件接口的电器特性,并包括链路控制、初级流量控制和低级错误管理等功能;传输层负责进行寻址和路由信息管理;逻辑层定义了服务类型和包交换的格式。逻辑层定义了数据包的格式,同时支持两种操作方式,分别是直接IO/DMA方式和消息传递方式。
直接IO/DMA是一种常用的数据传输方式,发送端需要知道被访问设备的存储空间地址映射,被访问端的操作基本由硬件实现。直接I0/DMA下,发起一次传输操作,需要有效数据、目标器件ID、数据长度、数据在被访问设备存储空间的地址以及包优先级等;同时,所有构成的包的长度为32bit的整数倍;若包长度不能满足要求,则添加附加位进行弥补。消息传递方式不要求发送节点知道目的节点的地址空间映射,当数据到达目的节点时,会根据邮箱号确定消息存储位置。在消息传递模式下进行数据传输时,除了有效载荷外还需要提供目的节点的ID、数据长度、包优先级和邮箱号等。
问题:1 可执行程序有严格的格式,一般分为text段、data段和bss段,请解释各段存放的内容,并将答案填写在(1)~(3)中。陈工程师写了一段图形图像相关的程序,在程序中他定义了一个大数组,如下所示:char arrMap[1024*1024];void main(void){...}请问此数组位于内存哪个位置(即在那个段中)?
问题:2 RapidlO逻辑层中直接IO/DMA和消息传递这两种传输方式的主要差异如表1-1所示。请完成表中的内容,将表1-1中的(1)~(5)答案填写在对应栏中。
问题:3 在IO处理模块等多个模块上,都采用中断方式处理输入输出。在中断处过程包括关中断、保存断点、识别中断源等一系列步骤,如图1-4所示,请完成其中的填空。
问题1:(1)text段:存放程序代码; (2)data段:存放有初值的全局变量和常量 (3)bss段:存放未被初始化的全局变量 (4)该数组是未初始化的全局变量,因此存放在bss段中。
问题2:(1)可以(2)不需要 (3)通过邮箱号间接寻址(4)读/写(5)无
问题3:(1)识别中断源 (2)设置新的屏蔽字 (3)执行中断服务程序主体 (4)关中断
某智能农业基地需要实时监控各个蔬菜大棚的温湿度,李工开发了一款温湿度监测仪,硬件系统设计部分如图2-1所示。
李工采用STM32作为主控处理器,利用TS-FTM01传感器进行温度和湿度采集,采用GSM/GPRS/GPS三合一模块来实现温湿度采集数据的上报。TF-FTM01传感器和主处理器之间采用RS485总线进行通信。在系统设计中,使用STM32处理器实现对多个TF-FTM01传感器的数据读取。
GSM/GPRS/GPS三合一模块可以实现自我定位,并把采集到的温湿度数据进行上报,该模块和STM32处理器之间采用RS232进行数据通信。TS-FTM01传感器使用RS485通信机制,每个传感器的RS485通信地址可以通过如图2-2所示的拨码开关进行配置。拨码开关一共有6位,实现对TS-FTM01传感器地址的编码。STM32处理器具有通用同步异步收发器(USART),USART利用分数波特率发生器提供宽范围的波特率选择。
STM32处理器的波特比率寄存器USART桞RR的定义如图2-3和表2-1所示。
问题:1 RS232和RS485都属于串行通信总线,以下关于串行通信、RS232、RS485的叙述中,正确的是(1)、(2)、(3)、(4)。请将答案填写在对应栏中。A.RS232支持全双工通信,只允许一对一通信B.RS232采用差分传输方式进行数据信号的传输C.RS232传输距离远,传输距离最远可达上千米D.RS485—般采用两线制进行半双工通信,允许一对多通信E.RS485采用差分传输方式,抗干扰能力强,传输距离远F.在进行嵌入式开发时,常采用RS485作为调试串口使用G.RS232典型的连接器包括DB9和DB25,仅使用三线也可进行基本逍信
问题:2 STM32处理器具有通用同步异步收发器(USART),USART利用分数波特率发生器提供宽范围的波特率选择。波特率的计算公式为:
其中,fck为给外设的时钟,USARTDIV是一个无符号数,其值设置在USART_BRR寄存器中。假设给外设提供的时钟频率fck=72MHz,GSM/GPRS/GPS三合一模块所需的波特率为115200,则USARTDIV的值应为(1),USART_BRR寄存器的十木进制值应为⑵。请完成其中的填空,将答案填写在对应栏中。
问题:3 RS485总线使用特制的RS485芯片,最大支持节点数可达128个以上。该系统的RS485总线上最多可以支持(1)个TS-FTM01传感器?请完成其中的填空,将答案填写在对应栏中。
问题:4 基于图2-1所示的硬件设计,需要实现某地点的温湿度数据的定时上报功能。该功能要求以T为周期读取RS485总线上16个TS-FTM01传感器(地址编码为0~15)的温湿度数据,通过GPS获取当前的位置信息,然后通过GSM网络把温湿度数据和定位信息发送到固定的手机号码上。
需要特别指出的是,在图2-1所示的硬件设计中未使用专用的RS485芯片,STM32端的RS485总线是通过GPIO45和GPIO46两根G310口线模拟出的,即通过两根GPIO口线的高低电平变化来模拟RS485数据传输协议”基于上述硬件和软件设计,请从以下选项中选择正确的操作,把图2-4所示的软件流程补充完整,将流程图2-4中的(1)-(3)的答案填写在对应栏。A.设置GPIO45为输入模式,设置GPIO46为输出模式B.设置GPIO45和GPIO46为输入模式C.设置GPIO45为输出模式,设置GPIO46为输入模式D.设置GPIO45和GPIO46为输出模式E.addr>16F.addr>=16本方案利用低速串行总线遍历读取16个传感器的温湿度数据及GPS的定位信息,并通过GSM实现数据上报。该执行过程需要消耗一定的时间,导致现有的算法流程并不能精确实现以T为周期进行温湿度数据的采集和上报。为了修正该问题,需要把图2-4所示流程中的步骤(4)调整到步骤(5)后执行。请完成其中的填空,将答案填写在对应栏中。
问题1:(1)-(4):A D E G
问题2:(1)39.0625 (2)0x271
问题3:(1)64
问题4:(1)D(2)B(3)F(4)(m)(5)(c)
问题1:RS232和RS485特点RS232支持全双工通信,但只支持一对一的单站通信,典型的连接器包括DB9和DB25,仅使用三线也可以进行基本通信。RS485支持一点对多点的双向通信,有二线与四线两种方式,采用二线制可实现真正的一对多半双工通信,采用差分传输方式,抗干扰能力强。
问题2:根据波特率公式
已知外设提供的时钟频率fck=72MHZ,GSM/GPRS/GPS三合一模块所需的波特率为115200,代入公式可得115200=72MHZ/16*USARTDIV,可得USARTDIV=39.0625,注意MHZ单位换算。根据图2-3和表2-1对寄存器USART_BRR的功能描述,寄存器的4-15位对应USARTDIV的整数部分,0-3位对应USARTDIV的小数部分,由上面求出的值,可知本题中,USARTDIV整数部分为39,对应USART_BRR的4-15位十六进制就是0x27;USARTDIV的小数部分为0.0625,则寄存器USART_BRR的0-3位十六进制为0x1,组合可知为0x271.
问题3:根据图2-2所示,TS-FTM01传感器地址采用6位拨码开关进行编码,意味着该传感器的地址编码范围为0-63(最大2^6=64个)。在RS485通信机制中采用地址编码来区分不同的RS485设备。因此,该系统中可以支持的TS-FTM01传感器数目为64.
问题4:RS485采用二线制进行半双工通信,本题要求用两根GPIO口线来模拟二线制的RS485总线,通过两根GPIO口线上的信号的高低来模拟RS485的差分信号,本题并未考察RS485时序,只对半双工通信概念进行考察。因此,在利用模拟的RS485总线进行数据发送时,总线处于写状态,要把这两根GPIO口线配置成输出模式;当处理器通过RS485总线实现了数据发送后,要立即把RS485总线的状态从写状态切换到读状态,以便接收传感器的应答信息,实现半双工通信,因此此时应该把这两根GPIO口线配置为输入模式。根据题目要求,要实现16个TS-FTM01传感器(地址编码为0-15)的温湿度数据读取,采用循环方式依次读取,根据软件流程图,addr地址从0开始处理,因此循环结束条件应为addr>=16.
需要周期性的进行温湿度数据的采集和上报,周期T由硬件定时器来实现,为了实现精确定时,需要在一次定时时刻到后立即触发下一个周期的定时开始,但图2-4所示的软件流程是一次定时时刻到后,先进行16个传感器的读取,然后再触发下一个周期的定时开始,导致实际的采集间隔为预设的周期T加上读取16个传感器温湿度数据所需的时间。为了修正这个问题,需要在定时时间到后立即触发下一个定时周期,然后再进行温湿度数据的读取和上报。因此要把步骤m中的重置定时器操作提到步骤c定时超时后立即执行。
企业根据利润提成发放奖金。利润低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成15%;利润在20万到40万之间时,高于20万元的部分,可提成20%;40万到60万之间时高于40万元的部分,可提成25%;60万到100万之间时,高于60万元的部分,可提成30%;高于100万元时,高于100万元的部分可提成35%o已知企业本年度12个月的月利润存储在数组profit中,程序要求根据月利润计算月奖金并存储到数组bonus中,然后计算并返回该企业的年度总利润total_profito该程序的实现如下:
【程序】int calculate_bonus(const int profit[ ], int bonus[ ]){int n=12;int i=0;int sum_profit=0;int bonus1,bonus2,bonus4,bonus6,bonuslO;bonus1=100000*0.1;bonus2=bonus1+100000*0.15;bonus4=bonus2+200000*0.2;bonus6=bonus4+200000*0.25; bonusl0=bonus6+400000*0.3;for (i=0;iimage.pngn; i++){if (profit[i]image.png=100000)(1);else if(profit[i]image.png=200000)(2);else if(profit[i]image.png=400000)(3);else if(profit[i]image.png=600000)(4);else if(profit[i]image.png=1000000)(5) ;else(6) ;}/*以下代码计算年度总利润*/i=0;while(iimage.pngn)sum_profit += profit[++i];return sum_profit;}
问题:1 在程序中,使用关键字const修饰输入参数profit,请将这样修饰的作用写到(1)处。如果程序中bonus数组也使用const修饰,是否正确,并给出解释,请将答案写到(2)处。
问题:2 分析程序中的计算年度总利润的代码,指出错误的一行代码,将错误代码写到(1)处;然后用一条语句实现正确代码,将正确代码写到(2)处。
问题:3 根据题意分析程序,完成程序中的(1)~(6),每个空行只能写一行代码,即用一条语句来描述,将答案写到相应的位置。
问题1:(1)限定变量,不允许被修改(2)不正确,因为该数组需要被修改。
问题2:(1)sum_profit += profit[++i]; (2)sum_profit += profit[i++];
问题3:(1)bonus[i]=profit[i]*0.1
(2)bonus[i]=bonus1+(profit[i]-100000)*0.15
(3)bonus[i]=bonus2+(profit[i]-200000)*0.20
(4)bonus[i]=bonus4+(profit[i]-400000)*0.25
(5)bonus[i]=bonus6+(profit[i]-600000)*0.30
(6)bonus[i]=bonus10+(profit[i]-1000000)*0.35
问题1:const修饰的数据类型是常类型,只能读不能写。
问题2:根据题意,1月到12月的利润分别保存在profit[0]到profit[11]之中,所以年度总利润应该是这12个元素相加,下标从0到11,题中的sum_profit += profit[++i]是从1加到12,因为是先i++再计算。
问题3:根据题意,企业员工在1月到12月创造的利润分别保存在profit[0]到profit[11]中,作为计算每个月奖金的输入,用const修饰,在函数执行期间不能改变。而根据利润计算出的每个月的奖金则作为输出数组保存在bonus[0]到bonus[11]中。根据题目计算方法,前半部分为计算1到12月的奖金,并且是分段计算,逻辑十分简单。
王工在实验室负责自动电梯模拟控制系统的设计,自动电梯模拟控制系统需要完成电梯运行控制算法、输入界面和输出界面三项主要任务。系统结构图如图1所示。
根据电梯运行的流程,把电梯划分为停止状态、运行状态、开门状态和关门状态4种控制状态。停止状态是指电梯在没有任何请求的情况下静止状态,而不是指电梯在运行过程中开门前的停顿状况,本题忽略停顿状况,把电梯从运行状态直接迁移为开门状态。电梯根据控制状态的迁移规则进行状态迁移,系统初始时,电梯处于停止状态。
问题1:电梯根据控制状态的迁移规则进行迁移,其状态迁移图如图2所示。
请根据下面状态转移的条件,完成状态迁移图。可供选择的状态转移条件:a.其他楼层有呼叫请求;b.无呼叫请求;c.乘客进入电梯或等待一段时间后;d.到达请求楼层;e.电梯所在楼层有呼叫请求。
问题2:电梯运行处理程序的流程图如图3所示。请完成该流程图。
问题3:系统采用多级优先级中断结构,如图4所示。它要求CPU在执行完当前指令时转而对中断请求进行服务。设备A连接于最高优先级,设备B次之,设备C又次之。IRQx为中断请求信号,INTx为CPU发出的中断响应信号。
现假设:TDC为硬件中断周期时间;TM为一个指令执行周期时间;TA、TB、TC分别为A、B、C的中断服务程序执行时间;TS、TR为保护现场和恢复现场所需的时间。图5是中断处理过程示意图。
当三个设备同时发出中断请求时,依次处理设备A、B、C的时间是多少?这种结构下中断饱和时间是多少?
问题1:(1)其他楼层有呼叫请求,或a; (2)到达请求楼层,或d;(3)乘客进入电梯或等待一段时间后,或c; (4)无呼叫请求,或b;(5)电梯所在楼层有呼叫请求,或e;(6)其他楼层有呼叫请求,或a。
问题2:(1)改变状态为开门 (2)当前层上移一层 (3)改变状态为开门 (4)改变状态为向下 (5)改变状态为向上
电梯各个状态的处理过程是,根据电梯状态,调用相应的控制状态的处理程序来控制电梯的运行。图3为电梯运行状态的处理流程图。当进入电梯运行状态后,首先判断当前电梯的运行方向。
程序处理逻辑如下:
1.当电梯向上运行时:
(1)若当前层有内部请求,或外部有向上请求,或外部有向上和向下请求,则改变状态为开门,返回;否则,转(2);
(2)若当前层上方有内外请求,则当前层上移一层,返回;否则,转(3);
(3)若当前层有外部向下请求,则改变状态为开门状态,返回;否则,转(4);
(4)若当前层下方有内外请求,则改变状态为向下,返回。
2.当电梯向下运行时:
(1)若当前层有内部请求,或外部有向下请求,或外部有向上和向下请求,则改变状态为开门,返回;否则,转(2);
(2)若当前层下方有内外请求,则当前层下移一层,返回;否则,转(3);
(3)若当前层有外部向上请求,则改变状态为开门状态,返回;否则,转(4);
(4)若当前层上方有内外请求,则改变状态为向上,返回。
问题3:tA=TM+TDC+TS+TA+TR; tB=TDC+TS+TB+TR; tC=TDC+TS+TC+TR;
中断饱和时间为:T=tA+tB+tC或T=TM+3TDC+3TS+TA+TB+TC+3TR该问题是一个关于多级中断的问题,题中现假设TDC为硬件中断周期时间,TM为一个指令执行周期时间,TA、TB、TC分别为A、B、C的中断服务程序执行时间,TS、TR为保护现场和恢复现场所需的时间。
当三个设备同时发出中断请求时,依次处理设备A、B、C的时间分别为: tA=TM+TDC+TS+TA+TR; tB=TDC+TS+TB+TR; tC=TDC+TS+TC+TR;
注意,TM只执行1次。这种结构下中断饱和时间是:T=tA+tB+tC=TM+3TDC+3TS+TA+TB+TC+3TR
您目前分数偏低,基础较薄弱,建议加强练习。