1、2010年下半年软件水平考试(中级)嵌入式系统设计师下午(应用技术)试题真题试卷及答案与解析 一、试题一 0 阅读以下关于某嵌入式系统设计方案的叙述。 说明 某公司承接了开发周期为 6个月的某机载嵌入式系统软件的研制任务。该机载嵌入式系统硬件由数据处理模块、大容量模块、信号处理模块、 FC网络交换模块和电源模块组成,如图 1-1所示。数据处理模块和大容量模块的处理器为 PowerPC7447,数据处理模块主要对机载数据进行处理,完成数据融合;大容量模块主要存储系统数据,同时也有数据处理的能力;信号处理模块的 处理器为专用的数字信号处理器 DSP,完成雷达数据处理,并将处理后的数据发送给数据处理
2、模块; FC网络交换模块为已开发的模块,本次不需要开发软件,主要负责系统的数据交换;电源模块主要负责给其他模块供电,电源模块上没有软件。 PowerPC7447和 DSP是 32位处理器,内存按字节编址。 PowerPC7447以大端方式 ( big_endian)存储数据, DSP以小端方式 (little endian)存储数据。1 在数据处理模块 1中,需要使用 A/D变换器对外部电源模块的电压进行检测。当前数据处理模块中的 A/p变换器为 10位,当 A/D变换器的输入模拟电压最大为5.115V时, A/D输出为 3FFH。 通过配置 A/D变换器的中断寄存器及比较寄存器 (比较寄存器
3、的值是用来和 A/D转换结果进行比较 ),可以将 A/D变换器配置为输入电压大于一定值时产生中断,也可以配置为输入电压小于一定值时产生中断,通过此种方式向系统报警。 请回答以下三个问题。 (1)此 A/D变换器的量化间隔为多少 mV?(量化间隔为 A/D变换器最低有效位 1位所代表的模拟电压值 ) (2)如果规定下限阈值为 4.092V,要使用中断检测这个 电压,此时 A/D变换器的比较寄存器应配置为多少 ? (3)如果采用查询方式实现电源电压超限报警功能,程序如何判断 A/D变换器完成了单次数据转换 ? 2 李工负责该系统软件的研发。在软件策划过程中,为了加快软件的开发,确保进度,李工将软件
4、分解为若干软件配置项,每个软件配置项指定一人开发。每个配置项的开发过程包括:软件需求分析、软件概要设计、软件详细设计、软件编码、软件单元测试和部件级测试六个阶段。李工的做法符合软件工程的要求吗 ?为什么 ? 3 田工负责编写信号处理模块与数据处理模块的通信程序,约定好的数 据组织方式如表 1-1所示。 以下是信号处理模块端的一段程序: unsigned int msgid=Ox01;/表示从信号处理模块发送到数据处理模块 2的消息 ID typedef struct FCSND Data_struct unsigned char A; unsigned int B; unsigned shor
5、t C; unsigned char D16; FCSND DATA; FCSND_DATA sendData; FillfcData( /接收到的消息ID typedef struct FCRCV_Data _struct unsigned char A; unsigned int B; unsigned short C; unsigned char D16; FCRCV_DATA; FCRCV_DATA recvData; recvfc( (msgid , long s=0; p= for(j=0;j i;j+) s+=pj; return s; long Sum=sum(3,1,2,3)
6、; C代码 2 static int pent; void*MyMemcpy(void*dest, const void*src, int n) char*pDest=(char*)dest; char*pSrc=(char*)src; for(int i=0; i n; i+) *(pDest +i)=*(pSrc+i); return dest; C代码 3 node *fun(node*head, int index) node *ptr1,*ptr2; int i=0: ptr1=head; ptr2=head; if( head=NULL | head- next=NULL ) re
7、turn ptr1; while (i index) (1) ; if (ptrl=NULL) return head; i+; while (ptr1- next !=NULL) ptr1=ptr1- next; (2) ; return (3) ; node* ReverseList (node *head) node *temp1=NULL; node *temp2=NULL; node *temp3=NULL; if (head- next=NULL) | (head=NULL) return head; temp1=head; temp3=temp1- next; temp1- ne
8、xt=NULL; while (temp3- next !=NULL) temp2=temp3; temp3=temp3- next; (4) ; temp1=temp2; temp3- next=temp1; return (5) ; 14 执行 C代码 1后, Sum的值应为多少 ?请用十进制表示。 15 请问 C代码 2中 static的作用是什么 ?const的作用是什么 ?王工自己编写的内存拷贝函数安全吗 ?如存在缺陷,请指出缺陷在哪里。 16 仔细阅读并分析 C代码 3,填补其中的空 (1) (5)。 2010年下半年软件水平考试(中级)嵌入式系统设计师下午(应用技术)试题真题试卷
9、答案与解析 一、试题一 1 【正确答案】 (1)SmV (2)Ox332,或 818 (3)通过查询状态寄存器的对应状态位判断 【试题解析】 本题考查嵌入式系统设计基础知识和软件工程知识的应用,要开发完成一项嵌入式系统是一个较为复杂工程,涉及软件和硬件基础知识。 A/D变换器的量化间隔为 A/D变换器最低有效位所代表的是模拟电压值,当前A/D变换器的模拟电压最大为 5.115V,表示 A/D输出的最大值为 3FFH,因此,A/D变换器的量化间隔为 5.115V/3FFH=5mV。 根据 A/D变换器的量化间隔,可以根据需要控制的模拟电压来计算出对应的数字值。按照题意,如果当 前的阈值为 4.0
10、92V,则可以计算出要产生中断时候配置的 A/D变换器的比较寄存器的值为 4.092V/5mV即 818或者 Ox332。 一般嵌入式系统设计中,对于外部 A/D变化报警事件的处理,可以采用查询方式,也可以采用中断方式。当采用查询方式来检查电源电压是否超过一定阈值或者低于一定阈值的事件时,需要首先设置 A/D变换的比较寄存器的阈值,然后开启对应的控制字,最后应用程序通过不断查询状态寄存器中对应的标志位来判断是否有对应的事件发生。 2 【正确答案】 李工的安排不合理。 软件开发和软件测试 不能为同一个人。 一般情况下,每个软件配置项的软件需求分析、软件设计与编码、软件测试的人员需要分开,不能由一
11、人全部完成,以确保软件的质量。 【试题解析】 按软件工程的要求,开发过程分为软件策划、软件需求分析、软件概要设计、软件详细设计、软件编码、软件测试 (单元级、部件级、系统级 )、验收交付等阶段。一般情况下,软件可以分解为若干软件配置项,由不同的人员完成,但对于同一软件配置项,软件开发和软件测试必须不能为同一个人,即不允许自己测试自己开发的软件;对于重要的软件,每个软件配置项的软件需求分析、软件 设计与编码、软件测试的人员需要分开,不能由一人全部完成,以确保软件的质量。 因此,李工的安排不合理,必须在软件策划中,将各阶段的人员分开,否则,软件开发计划和软件配置管理计划在评审时将不能通过。 3 【
12、正确答案】 有问题。 (1)数据结构定义有边界对齐问题; (2)接收和发送端的处理程序没有对大小端转换进行处理。 【试题解析】 本题中,田工在发送和接收消息时采用的数据类型为 FCSND- DATA和 FCRCV_DATA,数据类型中有字符型、整型、短整型、字符数组;而发送端为信号处理 模块,其处理器为专用的数字信号处理器 DSP。接收端为数据处理模块,其处理器为 PowerPC7447。在嵌入式系统中, C语言的编译器在专用的信号处理器 DSP和 PowerPC7447很可能不同,不同的编译器对数据有边界的对齐处理会有不同的方式,不一定采用表 1-1规定的组织方式。可能的情况是: (1)两者
13、都不是表 1-1规定的内存组织方式; (2)信号处理模块数据可能与数据处理模块的内存组织方式不同。 解决办法为在数据结构设计中只用字符型和字符数组,不同其他类型数据。 另外,题干中已经明确: PowerPC7447和 DSP是 32位处理器,内存按字节编址。 PowerPC7447以大端方式 (big_endian)存储数据, DSP以小端方式(little_endian)存储数据。因此,需要对大小端转换进行处理,在发送端或接收端都可以,而本题明显没进行大小端转换处理。 二、试题二 4 【正确答案】 (1) 8000H (2) 8001H (3) 8002H 【试题解析】 本题考查嵌入式处理器
14、硬件及汇编语言相关知识。 从题中给出的电路图中可以看出, 8255控制芯片的 CS信号的有效电平为 低电平。其对应的 CS由嵌入式处理器地址线中的 A15 A2通过 “或门 ”进行控制,从这里可以看出,要使得 8255的片选信号 CS有效,必须使得 A15为 1, A14 A2都为 0。 由题中表 2-1提供的端口访问控制表及电路图可知,如果要访问 8255的 PA口,必须使得 A1、 AO都为 0, PB口访问时 Al为 0、 A0为 1, PC口访问时 A1为 1,A0为 0。 因此,结合 8255的片选信号 CS控制,以及 A1、 A0对于端口访问的控制,即可得到使用嵌入式处理器进行 8
15、255的 PA、 PB、 PC口访问时的地址。 5 【正确答案 】 (1)将 3AH立即数传送到 A中 (2)将 3AH存储单元的内容传送到R4中 【试题解析】 立即数的传送指令和直接寻址指令是两种最基本的汇编指令。其中立即数的表示是在进制数前加 #号。 6 【正确答案】 (1)#09FH (2)RO (3) 20H (4) #09EH (5) RO 【试题解析】 由表 2-2知道,对于中断使能控制的访问也就是设置该寄存器的对应位为 1或者 0,为 1表示开启对应的中断控制,为 0表示关闭对应的中断控制,按照对应的各个位来进行立即数配置即可进 行各个中断的控制。 程序中的空 (2)处是表示使用
16、寄存器寻址方式获取数据。空 (3)处于中断程序的服务程序中,需要重复从 20H中获取待打印的内容,使用直接寻址方式。空 (4)是指使用 “与指令 ”关闭对应的中断位。空 (5)处为与入栈相对应的出栈操作。 三、试题三 7 【正确答案】 (1)条件覆盖是指设计足够的测试用例,使得被测程序每一个判定中的每个条件的所有可能结果至少出现一次。 (2)路径覆盖是指设计足够的测试用例,使得被测程序中每条路径至少执行一次。 【试题解析】 本题考查软件测试的基本知识。 条件覆盖是指设计足够的测试用例,使得被测程序每一个判定中的每个条件的所有可能结果至少出现一次。 路径覆盖是指设计足够的测试用例,使得被测程序中
17、每条路径至少执行一次。 8 【正确答案】 (路径覆盖 ) 【试题解析】 在结构测试中,根据覆盖目标的不同,可以分为语句覆盖、条件覆盖、判定覆盖 (分支覆盖 )和路径覆盖等。 语句覆盖的含义是设计足够的测试用例,使得被测程序每一条语句至少被执行一次。 判定覆盖 (分支覆盖 )的含义是设计足够的测试用例,运行被测程序,使得程序中每个判定的取真分支 和取假分支至少执行一次。 其中,路径覆盖是最强的覆盖准则。 9 【正确答案】 ) (2) (3) (4) (5) 其中,第 (1)、 (2)题的答案顺序可互换,第 (4)、 (5)题的答案顺序可互换。 【试题解析】 为判定覆盖选取测试用例情形:对第一个判
18、定选取测试用例组 I和II,当用 I覆盖判定的 T分支时,不会走到第二个分支;当用 II覆盖判定的 F分支时,第二个判定需要另取一个测试用例组覆盖其 T分支,此时取测试用例组 III或 IV即可。 为条件覆盖选取测试用例情形:取测试用例组 I、 III和 IV,就可以覆盖所有 4个条件的取值。 为路径覆盖选取测试用例情形:总共三条路径,需要三个测试用例,可选使各路径为 T的测试用例。 I、 II、 III或 I、 II、 IV均可。 四、试题四 10 【正确答案】 (1)单级、或单级中断系统 (2)设备 C,设备 B,设备 A。 【试题解析】 本题考查中断处理相关知识的应用。 根据计算机系统对
19、中断处理的策略不同。可分为单级中断系统和多级中断系统。 单级中断系统是中断结构中最基本的形式。在单级中断系统中,所有的中断源都属于同一级,所有中断源触发排成一 行。其优先次序是离 CPU近的优先权高。当响应某一中断请求时,执行该中断源的中断服务程序。在此过程中,不允许其他中断源再打断中断服务子程序。即使优先权比它高的中断源也不能再打断。只有该中断服务程序执行完毕之后,才能响应其他中断。 多级中断系统是指计算机系统中有相当多的中断源,根据各中断条件的轻重缓急程度不同而分成若干级别,每一中断级分配给一个优先权。一般说来,优先级高的中断级可以打断优先权低的中断服务程序,以程序嵌套方式进行工作。根据系
20、统的配置不同,多级中断可分为一维多级中断和二维多级中断。 本项 目中王工设计的系统属于单级中断系统,设备 A、设备 B、设备 C的中断优先级按照从高到低的次序排列为设备 C设备 B设备 A。 11 【正确答案】 (1)CPU关中断 (2)保存中断现场 (3)执行中断处理程序 (4)恢复现场 (5)开中断 【试题解析】 如果系统设计时不允许中断嵌套,当系统产生中断后, CPU响应中断的流程如下: a) CPU检查响应中断的条件是否满足; b)如果 CPU响应中断,则 CPU先先中断; c)保存中断现场,为了使中断处理程序不影响主程序的运行,要把发生中断时的任 务上下文现场保存起来,当中断处理完成
21、返回主程序时, CPU能够恢复主程序在中断前的状态,保证主程序的正确运行。 a)分析中断原因,根据中断向量得到中断处理程序入口地址; b)执行中断处理程序; c)退出中断,恢复现场; d)开中断, CPU继续执行。 如果系统设计时允许中断嵌套,那么 CPU响应中断的流程比上述流程复杂一些。 12 【正确答案】 (1)TA=3TDC+TS+Ta+TR (2)TB=2TDC+TS+Tb+TR (3)TC=TDC+TS+Tc+TR (4)f=1/T 【试题解析】 当设备 A、设备 B、设备 C同时发出中断请求时,处理器按照优先级依次处理每个设备的中断请求。中断查询链中每个设备的延迟时间为 TDC,设
22、备 A经过 3个延迟,设备 B经过 2个延迟,设备 C经过 1个延迟,加上保存现场和恢复现场的时间,以及每个设备的中断服务程序时间,所以三个设备的中断处理时间分别为: TA=3TDC+TS+Ta+TR TB=2TDC+TS+Tb+TR TC=TDC+TS+Tc+TR 如果处理三个设备所需要的总时间为 T,那么本系统所设计的中断极限频率f=1/T。 13 【正确答案】 (1)用户进程或应用程序 (2)设备无关的系统软件或设备管理程序 (3)设备驱动程序 (4)中断处理程序 【试题解析】 嵌入式系统中多用 I/O设备管理软件来管理外设。为了实现对硬件的抽象,提供统一的 API接口, I/O设备管理
23、软件一般分层设计。 硬件之上为中断处理程序,负责处理与设备相关的各种异步事件,如发送完成、接收完成、总线错误等;上面一层为设备相关的驱动程序,负责设置硬件设备的寄存器,包括初始化、启动、关闭硬件设备,以及进行状态检查等工作;再上一层为设备无关的系统软件, 即设备管理程序,实现对设备进行命名、保护、阻塞、缓存、分配等功能;最上面一层是应用程序,进行 10调用。 五、试题五 14 【正确答案】 Sum=6 【试题解析】 本题考查嵌入式 C语言编程基础知识。 可变参数函数的应用在嵌入式 C程序设计中应用非常广泛。在 X86平台下,参数在堆栈中的存放是按照由底向上进行存储的。因此,在该程序中, sum
24、函数的第一个参数表示的是在该参数后面还包含有几个参数。在程序体中,使用第一个参数进行参数访问控制,参数的获取方式按照数组方法进行获取。因此, C代码 1执行后, Sum的值为 6。 15 【正确答案】 1) static的作用:是将变量修饰成静态变量,静态变量的存储地址在整个程序的运行执行期间均保留,不会被别的变量占据。 2) const的作用:是用于冻结一个变量,使其值在程序中不能被进一步改变。 3)不安全,有缺陷。 4)应对形参的有效性进行检查,应判形参 dest、 src指针是否为空,形参 n是否大于 0,还应保证 dest所指向的内存空间不越界。 【试题解析】 在程序设计中, stat
25、ic变量和 const变量的应用非常广泛。 static变量表示将变 量修饰为静态变量,其含义是指其对应的存储空间在整个程序的运行过程中都保持不变,不会像堆栈那样被重复使用。 static即可以用来修饰局部变量,也可以修饰全局变量。 一旦变量定义为是 const,则其对应的值不能再被修改。在程序运行中,此变量的值就一直维持在其初始化时候的值。 王工编写的这段程序不安全,存在严重的安全漏洞,具体的缺陷包括: (1)对于指针参数的有效性没有进行任何判断,如果指针为 NULL,这样访问存在严重的安全问题。 (2)参数 n的有效性也没有进行判断,如果参数 n对应的空间超 过 src所包含的空间,则函数
26、得到的结果和期待的结果会有所偏差。同样,如果 n对应的空间超过dest所包含的地址空间,则会造成程序的混乱,会将内存冲掉,可能导致灾难性后果。 16 【正确答案】 (1)ptr1=ptr1- next (2)ptr2=ptr2- next (3)ptr2 (4)temp2- next=temp1 (5)temp3 【试题解析】 在单向链表中,对某元素的后继元素的访问只能通过结点中的 next指针项来获取。按照题目要求,首先创建两个指针 ptr1, ptr2,并且都指向链表头,然 后 ptr1向前走 index步,这样 ptr1和 ptr2之间就间隔 index个结点,然后ptr1和 ptr2同时向前步进,当 ptr1到达最后一个结点时, ptr2就是倒数第 index个结点了。因此,对于第 index个结点的查找,只需要移动 ptr1和 ptr2,最后ptr2返回的为倒数第 index个结点。 在逆序排列中,将 temp3移动到链表尾部,使用 temp2作为临时变量进行链表翻转。