1、计算机水平考试中级嵌入式系统设计师 2011年下半年下午真题及答案解析(总分:81.00,做题时间:90 分钟)一、试题一(总题数:1,分数:15.00)阅读以下关于某嵌入式系统设计方案的叙述。说明某公司承接了开发周期为 6个月的某机载嵌入式系统软件的研制任务。该机载嵌入式系统硬件由数据处理模块、大容量模块、信号处理模块、FC 网络交换模块和电源模块组成,如图 1-1所示。数据处理模块和大容量模块的处理器为 PowerPC7447,数据处理模块主要对机载数据进行处理,完成数据融合;大容量模块主要存储系统数据,同时也有数据处理的能力;信号处理模块的处理器为专用的数字信号处理器 DSP,完成雷达数
2、据处理,并将处理后的数据发送给数据处理模块;FC 网络交换模块为已开发的模块,本次不需要开发软件,主要负责系统的数据交换;电源模块主要负责给其他模块供电,电源模块上没有软件。PowerPC7447和 DSP是 32位处理器,内存按字节编址。PowerPC7447 以大端方式( big_endian)存储数据,DSP以小端方式(little endian)存储数据。(分数:15.00)(1).在数据处理模块 1中,需要使用 A/D变换器对外部电源模块的电压进行检测。当前数据处理模块中的A/p变换器为 10位,当 A/D变换器的输入模拟电压最大为 5.115V时,A/D 输出为 3FFH。通过配置
3、 A/D变换器的中断寄存器及比较寄存器(比较寄存器的值是用来和 A/D转换结果进行比较),可以将 A/D变换器配置为输入电压大于一定值时产生中断,也可以配置为输入电压小于一定值时产生中断,通过此种方式向系统报警。请回答以下三个问题。(1)此 A/D变换器的量化间隔为多少 mV?(量化间隔为 A/D变换器最低有效位 1位所代表的模拟电压值)(2)如果规定下限阈值为 4.092V,要使用中断检测这个电压,此时 A/D变换器的比较寄存器应配置为多少?(3)如果采用查询方式实现电源电压超限报警功能,程序如何判断 A/D变换器完成了单次数据转换?(分数:5.00)_(2).李工负责该系统软件的研发。在软
4、件策划过程中,为了加快软件的开发,确保进度,李工将软件分解为若干软件配置项,每个软件配置项指定一人开发。每个配置项的开发过程包括:软件需求分析、软件概要设计、软件详细设计、软件编码、软件单元测试和部件级测试六个阶段。李工的做法符合软件工程的要求吗?为什么?(分数:5.00)_(3).田工负责编写信号处理模块与数据处理模块的通信程序,约定好的数据组织方式如表 1-1所示。表 1-1网络数据结构数据域 A(1字节) 数据域 B(4字节) 数据域 C(2字节) 数据域 D(16字节)以下是信号处理模块端的一段程序:unsigned int msgid=Ox01;/表示从信号处理模块发送到数据处理模块
5、 2的消息 IDtypedef struct FCSNDData_struct unsigned char A;unsigned int B;unsigned short C;unsigned char D16; FCSND DATA;FCSND_DATA sendData;FillfcData( /接收到的消息 IDtypedef struct FCRCV_Data _struct unsigned char A;unsigned int B;unsigned short C;unsigned char D16; FCRCV_DATA;FCRCV_DATA recvData;recvfc(
6、(msgid,long s=0;p=for(j=0;ji;j+)s+=pj;return s;long Sum=sum(3,1,2,3);C代码 2static int pent;void*MyMemcpy(void*dest, const void*src, int n)char*pDest=(char*)dest;char*pSrc=(char*)src;for(int i=0; in; i+) *(pDest +i)=*(pSrc+i);return dest;C代码 3node *fun(node*head, int index)node *ptr1,*ptr2;int i=0:ptr
7、1=head;ptr2=head;if( head=NULL | head-next=NULL )return ptr1;while (iindex)(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=hea
8、d;temp3=temp1-next;temp1-next=NULL;while (temp3-next !=NULL)temp2=temp3;temp3=temp3-next;(4) ;temp1=temp2;temp3-next=temp1;return (5) ;(分数:21.00)(1).执行 C代码 1后,Sum 的值应为多少?请用十进制表示。(分数:7.00)_(2).请问 C代码 2中 static的作用是什么?const 的作用是什么?王工自己编写的内存拷贝函数安全吗?如存在缺陷,请指出缺陷在哪里。(分数:7.00)_(3).仔细阅读并分析 C代码 3,填补其中的空(1)(5)
9、。(分数:7.00)_计算机水平考试中级嵌入式系统设计师 2011年下半年下午真题答案解析(总分:81.00,做题时间:90 分钟)一、试题一(总题数:1,分数:15.00)阅读以下关于某嵌入式系统设计方案的叙述。说明某公司承接了开发周期为 6个月的某机载嵌入式系统软件的研制任务。该机载嵌入式系统硬件由数据处理模块、大容量模块、信号处理模块、FC 网络交换模块和电源模块组成,如图 1-1所示。数据处理模块和大容量模块的处理器为 PowerPC7447,数据处理模块主要对机载数据进行处理,完成数据融合;大容量模块主要存储系统数据,同时也有数据处理的能力;信号处理模块的处理器为专用的数字信号处理器
10、 DSP,完成雷达数据处理,并将处理后的数据发送给数据处理模块;FC 网络交换模块为已开发的模块,本次不需要开发软件,主要负责系统的数据交换;电源模块主要负责给其他模块供电,电源模块上没有软件。PowerPC7447和 DSP是 32位处理器,内存按字节编址。PowerPC7447 以大端方式( big_endian)存储数据,DSP以小端方式(little endian)存储数据。(分数:15.00)(1).在数据处理模块 1中,需要使用 A/D变换器对外部电源模块的电压进行检测。当前数据处理模块中的A/p变换器为 10位,当 A/D变换器的输入模拟电压最大为 5.115V时,A/D 输出为
11、 3FFH。通过配置 A/D变换器的中断寄存器及比较寄存器(比较寄存器的值是用来和 A/D转换结果进行比较),可以将 A/D变换器配置为输入电压大于一定值时产生中断,也可以配置为输入电压小于一定值时产生中断,通过此种方式向系统报警。请回答以下三个问题。(1)此 A/D变换器的量化间隔为多少 mV?(量化间隔为 A/D变换器最低有效位 1位所代表的模拟电压值)(2)如果规定下限阈值为 4.092V,要使用中断检测这个电压,此时 A/D变换器的比较寄存器应配置为多少?(3)如果采用查询方式实现电源电压超限报警功能,程序如何判断 A/D变换器完成了单次数据转换?(分数:5.00)_正确答案:(1)S
12、mV(2)Ox332,或 818(3)通过查询状态寄存器的对应状态位判断)解析:解析 本题考查嵌入式系统设计基础知识和软件工程知识的应用,要开发完成一项嵌入式系统是一个较为复杂工程,涉及软件和硬件基础知识。A/D变换器的量化间隔为 A/D变换器最低有效位所代表的是模拟电压值,当前 A/D变换器的模拟电压最大为 5.115V,表示 A/D输出的最大值为 3FFH,因此,A/D 变换器的量化间隔为 5.115V/3FFH=5mV。根据 A/D变换器的量化间隔,可以根据需要控制的模拟电压来计算出对应的数字值。按照题意,如果当前的阈值为 4.092V,则可以计算出要产生中断时候配置的 A/D变换器的比
13、较寄存器的值为 4.092V/5mV即818或者 Ox332。一般嵌入式系统设计中,对于外部 A/D变化报警事件的处理,可以采用查询方式,也可以采用中断方式。当采用查询方式来检查电源电压是否超过一定阈值或者低于一定阈值的事件时,需要首先设置 A/D变换的比较寄存器的阈值,然后开启对应的控制字,最后应用程序通过不断查询状态寄存器中对应的标志位来判断是否有对应的事件发生。(2).李工负责该系统软件的研发。在软件策划过程中,为了加快软件的开发,确保进度,李工将软件分解为若干软件配置项,每个软件配置项指定一人开发。每个配置项的开发过程包括:软件需求分析、软件概要设计、软件详细设计、软件编码、软件单元测
14、试和部件级测试六个阶段。李工的做法符合软件工程的要求吗?为什么?(分数:5.00)_正确答案:(李工的安排不合理。软件开发和软件测试不能为同一个人。一般情况下,每个软件配置项的软件需求分析、软件设计与编码、软件测试的人员需要分开,不能由一人全部完成,以确保软件的质量。)解析:解析 按软件工程的要求,开发过程分为软件策划、软件需求分析、软件概要设计、软件详细设计、软件编码、软件测试(单元级、部件级、系统级)、验收交付等阶段。一般情况下,软件可以分解为若干软件配置项,由不同的人员完成,但对于同一软件配置项,软件开发和软件测试必须不能为同一个人,即不允许自己测试自己开发的软件;对于重要的软件,每个软
15、件配置项的软件需求分析、软件设计与编码、软件测试的人员需要分开,不能由一人全部完成,以确保软件的质量。因此,李工的安排不合理,必须在软件策划中,将各阶段的人员分开,否则,软件开发计划和软件配置管理计划在评审时将不能通过。(3).田工负责编写信号处理模块与数据处理模块的通信程序,约定好的数据组织方式如表 1-1所示。表 1-1网络数据结构数据域 A(1字节) 数据域 B(4字节) 数据域 C(2字节) 数据域 D(16字节)以下是信号处理模块端的一段程序:unsigned int msgid=Ox01;/表示从信号处理模块发送到数据处理模块 2的消息 IDtypedef struct FCSND
16、Data_struct unsigned char A;unsigned int B;unsigned short C;unsigned char D16; FCSND DATA;FCSND_DATA sendData;FillfcData( /接收到的消息 IDtypedef 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;ji
17、;j+)s+=pj;return s;long Sum=sum(3,1,2,3);C代码 2static int pent;void*MyMemcpy(void*dest, const void*src, int n)char*pDest=(char*)dest;char*pSrc=(char*)src;for(int i=0; in; i+) *(pDest +i)=*(pSrc+i);return dest;C代码 3node *fun(node*head, int index)node *ptr1,*ptr2;int i=0:ptr1=head;ptr2=head;if( head=NU
18、LL | head-next=NULL )return ptr1;while (iindex)(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-nex
19、t=NULL;while (temp3-next !=NULL)temp2=temp3;temp3=temp3-next;(4) ;temp1=temp2;temp3-next=temp1;return (5) ;(分数:21.00)(1).执行 C代码 1后,Sum 的值应为多少?请用十进制表示。(分数:7.00)_正确答案:(Sum=6)解析:解析 本题考查嵌入式 C语言编程基础知识。可变参数函数的应用在嵌入式 C程序设计中应用非常广泛。在 X86平台下,参数在堆栈中的存放是按照由底向上进行存储的。因此,在该程序中,sum 函数的第一个参数表示的是在该参数后面还包含有几个参数。在程序体中,
20、使用第一个参数进行参数访问控制,参数的获取方式按照数组方法进行获取。因此,C 代码1执行后,Sum 的值为 6。(2).请问 C代码 2中 static的作用是什么?const 的作用是什么?王工自己编写的内存拷贝函数安全吗?如存在缺陷,请指出缺陷在哪里。(分数:7.00)_正确答案:(1) static 的作用:是将变量修饰成静态变量,静态变量的存储地址在整个程序的运行执行期间均保留,不会被别的变量占据。2) const的作用:是用于冻结一个变量,使其值在程序中不能被进一步改变。3)不安全,有缺陷。4)应对形参的有效性进行检查,应判形参 dest、src 指针是否为空,形参 n是否大于 0,
21、还应保证 dest所指向的内存空间不越界。)解析:解析 在程序设计中,static 变量和 const变量的应用非常广泛。static 变量表示将变量修饰为静态变量,其含义是指其对应的存储空间在整个程序的运行过程中都保持不变,不会像堆栈那样被重复使用。static 即可以用来修饰局部变量,也可以修饰全局变量。一旦变量定义为是 const,则其对应的值不能再被修改。在程序运行中,此变量的值就一直维持在其初始化时候的值。王工编写的这段程序不安全,存在严重的安全漏洞,具体的缺陷包括:(1)对于指针参数的有效性没有进行任何判断,如果指针为 NULL,这样访问存在严重的安全问题。(2)参数 n的有效性也
22、没有进行判断,如果参数 n对应的空间超过 src所包含的空间,则函数得到的结果和期待的结果会有所偏差。同样,如果 n对应的空间超过 dest所包含的地址空间,则会造成程序的混乱,会将内存冲掉,可能导致灾难性后果。(3).仔细阅读并分析 C代码 3,填补其中的空(1)(5)。(分数:7.00)_正确答案:(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作为临时变量进行链表翻转。