1、嵌入式系统设计师-24 及答案解析(总分:36.00,做题时间:90 分钟)一、试题一(总题数:1,分数:15.00)阅读以下关于某嵌入式处理器和 8255的叙述。 说明 图 1为使用某嵌入式处理器和 8255对打印机进行控制的电路图,其中 8255的中断请求 PC3接到处理器的中断请求输入端 上,打印机的数据口接在 8255的 PAOPA7 上,打印机的输出电平 接在8255的 PC6上。 为了使用嵌入式处理器对打印机进行控制,在程序设计时,需要将 8255的 PA口设置为工作方式 1:PB口设置在工作方式 0,配置为输入;PC 口的 PCO、PC1、PC2、PC3 和 PC4定义为输出。
2、为了在打印机输出为低电平时通过 8255的 PC3产生有效的中断请求信号 INTRA,必须使得 A口的中断请求使能 INTE-1,实际上就是通过 C口的按位复位操作将 PC6置 1,整个程序分为四部分:依次是 8255的初始化,嵌入式处理器的中断初始化,嵌入式处理器的主程序和打印字符的中断处理程序。其中 8255的端口配置功能如表 1所示。嵌入式处理器的中断使能控制字含义如表 2所示,该处理器的典型汇编指令如表 3所示。 (分数:15.00)(1).根据图 1所示,通过嵌入式处理器访问 8255的 PA口、PB 口和 PC口对应的地址分别是什么?(请用十六进制描述) 对应的地址: PA口:_
3、PB口:_ PC口:_(分数:5.00)_(2).在嵌入式处理器的汇编语言中,最简单的指令寻址方式为立即寻址和直接寻址,请回答下面两个汇编语言语句所描述的含义,将答案填写在答题纸的对应栏中。 MOV A, #3AH:_ MOV R4, 3AH:_(分数:5.00)_(3).以下汇编程序用于打印机输出控制,请将下面汇编程序的空白处补充完整,并将解答填入对应栏中。 8255的 A口工作在方式 1输出,初始化程序: INTI55:MOV DPTR, #8003H MOV A, 10100 010B MOVX DPTR,A ;配置 A口在工作方式 1、B 口在工作方式 0 MOV A, 0000110
4、1B MOVX DPTR,A ;将 PC6口置位 嵌入式处理器的中断初始化程序: INT031: MOV IE,_:开总中断及所有五个中断源用十六进制表示 ANL TCON,#OFEH;规定 INTO下降沿低电平产生中断请求 嵌入式处理器主程序: (打印存储单元 20H开始向后的内容,中断处理程序中每次从 20H中取到需要打印的存储单元地址,直到遇到存储单元里面内容不是 OAH为止) ORG 0100H MOV RO,#20H ;取打印缓冲区地址 MOV DPTR, #8000H MOV A,_ ;取打印字符 INC RO MOV 20H, RO MOVX DPTR,A ;输出打印 当字符打印
5、结束会产生一次中断,中断服务程序如下: ORG 1300H PRINTER:PUSH PSW :压栈操作 PUSH Acc PUSH RO PUSH DPH PUSH DPL MOV RO,_ ;用十六进制表示 MOV DPTR, #8000H MOVX A,RO ;取打印字符 MOVX DPTR,A ;输出打印 INC RO MOV 20H,RO ;将需要取打印内容的地址放置到 20H单元 CJNE A,#OAH, NEXT ANL IE,_ ;关 INTO中断,用十六进制表示 NEXT:POP DPL POP DPH POP _ POP Acc POP PSW RETI(分数:5.00)_
6、二、试题二(总题数:1,分数:21.00)阅读以下关于 C语言及 C代码的叙述。 说明 在开发某嵌入式系统时,设计人员根据系统要求,分别编写了如下三部分程序,其中: C代码 1 是李工为了在嵌入式平台上开发一段可变参数函数,在 X86平台上实现的一个参数个数可变函数实例。 C代码 2 是王工在编写软件时,自己编写的内存拷贝函数。 C代码 3 是赵工编写的一段数据处理的程序,其中 fun0的含义为从已创建的一个单向链表中查找倒数第 index个结点。他的设计思路为:首先创建两个指针 ptr1,ptr2,并且都指向链表头,然后 ptr1向前走 index步,这样 ptr1和 ptr2之间就间隔 i
7、ndex个结点,然后 ptr1和 ptr2同时向前步进,当 ptr1到达最后一个结点时,ptr2 就是倒数第 index个结点了。ReverseList()为赵工编写的对已有单向链表进行逆序重排的函数。 C代码 1 long sum (int i,) int*p,j; long s=0; p= for(j=0;ji;j+) s+=pj; return s; long Sum=sum(3,1,2,3); C代码 2 static int pent; void*MyMemcpy(void*dest, const void*src, int n) char*pDest=(char*)dest; ch
8、ar*pSrc=(char*)src; for(int i=0; in; 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 ) return ptr1; while (iindex) _; if (ptrl=NULL) return head; i+; while (ptr1-next !=NULL) ptr1=ptr1-next;
9、 _; return_; 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-next=NULL; while (temp3-next !=NULL) temp2=temp3; temp3=temp3-next; _; temp1=temp2; temp3-next=temp1; return_; (分数:21.0
10、0)(1).执行 C代码 1后,Sum 的值应为多少?请用十进制表示。(分数:7.00)_(2).请问 C代码 2中 static的作用是什么?const 的作用是什么?王工自己编写的内存拷贝函数安全吗?如存在缺陷,请指出缺陷在哪里。(分数:7.00)_(3).仔细阅读并分析 C代码 3,填补其中的空白处。(分数:7.00)_嵌入式系统设计师-24 答案解析(总分:36.00,做题时间:90 分钟)一、试题一(总题数:1,分数:15.00)阅读以下关于某嵌入式处理器和 8255的叙述。 说明 图 1为使用某嵌入式处理器和 8255对打印机进行控制的电路图,其中 8255的中断请求 PC3接到处
11、理器的中断请求输入端 上,打印机的数据口接在 8255的 PAOPA7 上,打印机的输出电平 接在8255的 PC6上。 为了使用嵌入式处理器对打印机进行控制,在程序设计时,需要将 8255的 PA口设置为工作方式 1:PB口设置在工作方式 0,配置为输入;PC 口的 PCO、PC1、PC2、PC3 和 PC4定义为输出。 为了在打印机输出为低电平时通过 8255的 PC3产生有效的中断请求信号 INTRA,必须使得 A口的中断请求使能 INTE-1,实际上就是通过 C口的按位复位操作将 PC6置 1,整个程序分为四部分:依次是 8255的初始化,嵌入式处理器的中断初始化,嵌入式处理器的主程序
12、和打印字符的中断处理程序。其中 8255的端口配置功能如表 1所示。嵌入式处理器的中断使能控制字含义如表 2所示,该处理器的典型汇编指令如表 3所示。 (分数:15.00)(1).根据图 1所示,通过嵌入式处理器访问 8255的 PA口、PB 口和 PC口对应的地址分别是什么?(请用十六进制描述) 对应的地址: PA口:_ PB口:_ PC口:_(分数:5.00)_正确答案:()解析:8000H 8001H 8002H 解析 本题考查嵌入式处理器硬件及汇编语言相关知识。 从题中给出的电路图中可以看出,8255 控制芯片的 CS信号的有效电平为低电平。其对应的 CS由嵌入式处理器地址线中的 A1
13、5A2 通过“或门”进行控制,从这里可以看出,要使得 8255的片选信号 CS有效,必须使得 A15为 1,A14A2 都为 0。 由题中表 1提供的端口访问控制表及电路图可知,如果要访问 8255的 PA口,必须使得 A1、AO 都为0,PB 口访问时 Al为 0、A0 为 1,PC 口访问时 A1为 1,A0 为 0。 因此,结合 8255的片选信号 CS控制,以及 A1、A0 对于端口访问的控制,即可得到使用嵌入式处理器进行 8255的 PA、PB、PC 口访问时的地址。(2).在嵌入式处理器的汇编语言中,最简单的指令寻址方式为立即寻址和直接寻址,请回答下面两个汇编语言语句所描述的含义,
14、将答案填写在答题纸的对应栏中。 MOV A, #3AH:_ MOV R4, 3AH:_(分数:5.00)_正确答案:()解析:将 3AH立即数传送到 A中 将 3AH存储单元的内容传送到 R4中解析 立即数的传送指令和直接寻址指令是两种最基本的汇编指令。其中立即数的表示是在进制数前加#号。(3).以下汇编程序用于打印机输出控制,请将下面汇编程序的空白处补充完整,并将解答填入对应栏中。 8255的 A口工作在方式 1输出,初始化程序: INTI55:MOV DPTR, #8003H MOV A, 10100 010B MOVX DPTR,A ;配置 A口在工作方式 1、B 口在工作方式 0 MO
15、V A, 00001101B MOVX DPTR,A ;将 PC6口置位 嵌入式处理器的中断初始化程序: INT031: MOV IE,_:开总中断及所有五个中断源用十六进制表示 ANL TCON,#OFEH;规定 INTO下降沿低电平产生中断请求 嵌入式处理器主程序: (打印存储单元 20H开始向后的内容,中断处理程序中每次从 20H中取到需要打印的存储单元地址,直到遇到存储单元里面内容不是 OAH为止) ORG 0100H MOV RO,#20H ;取打印缓冲区地址 MOV DPTR, #8000H MOV A,_ ;取打印字符 INC RO MOV 20H, RO MOVX DPTR,A
16、 ;输出打印 当字符打印结束会产生一次中断,中断服务程序如下: ORG 1300H PRINTER:PUSH PSW :压栈操作 PUSH Acc PUSH RO PUSH DPH PUSH DPL MOV RO,_ ;用十六进制表示 MOV DPTR, #8000H MOVX A,RO ;取打印字符 MOVX DPTR,A ;输出打印 INC RO MOV 20H,RO ;将需要取打印内容的地址放置到 20H单元 CJNE A,#OAH, NEXT ANL IE,_ ;关 INTO中断,用十六进制表示 NEXT:POP DPL POP DPH POP _ POP Acc POP PSW RE
17、TI(分数:5.00)_正确答案:()解析:#09FH RO 20H #09EH RO 解析 由表 2知道,对于中断使能控制的访问也就是设置该寄存器的对应位为 1或者 0,为 1表示开启对应的中断控制,为 0表示关闭对应的中断控制,按照对应的各个位来进行立即数配置即可进行各个中断的控制。 程序中的第 2空处是表示使用寄存器寻址方式获取数据。第 3空处于中断程序的服务程序中,需要重复从20H中获取待打印的内容,使用直接寻址方式。第 4空是指使用“与指令”关闭对应的中断位。第 5空处为与入栈相对应的出栈操作。二、试题二(总题数:1,分数:21.00)阅读以下关于 C语言及 C代码的叙述。 说明 在
18、开发某嵌入式系统时,设计人员根据系统要求,分别编写了如下三部分程序,其中: C代码 1 是李工为了在嵌入式平台上开发一段可变参数函数,在 X86平台上实现的一个参数个数可变函数实例。 C代码 2 是王工在编写软件时,自己编写的内存拷贝函数。 C代码 3 是赵工编写的一段数据处理的程序,其中 fun0的含义为从已创建的一个单向链表中查找倒数第 index个结点。他的设计思路为:首先创建两个指针 ptr1,ptr2,并且都指向链表头,然后 ptr1向前走 index步,这样 ptr1和 ptr2之间就间隔 index个结点,然后 ptr1和 ptr2同时向前步进,当 ptr1到达最后一个结点时,p
19、tr2 就是倒数第 index个结点了。ReverseList()为赵工编写的对已有单向链表进行逆序重排的函数。 C代码 1 long sum (int i,) int*p,j; long s=0; p= for(j=0;ji;j+) s+=pj; return s; long Sum=sum(3,1,2,3); 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; in; i+) *(pD
20、est +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 ) return ptr1; while (iindex) _; if (ptrl=NULL) return head; i+; while (ptr1-next !=NULL) ptr1=ptr1-next; _; return_; node* ReverseList (node *head) n
21、ode *temp1=NULL; node *temp2=NULL; node *temp3=NULL; if (head-next=NULL) | (head=NULL) return head; temp1=head; temp3=temp1-next; temp1-next=NULL; while (temp3-next !=NULL) temp2=temp3; temp3=temp3-next; _; temp1=temp2; temp3-next=temp1; return_; (分数:21.00)(1).执行 C代码 1后,Sum 的值应为多少?请用十进制表示。(分数:7.00)_
22、正确答案:()解析:Sum=6 解析 本题考查嵌入式 C语言编程基础知识。 可变参数函数的应用在嵌入式 C程序设计中应用非常广泛。在 X86平台下,参数在堆栈中的存放是按照由底向上进行存储的。因此,在该程序中,sum 函数的第一个参数表示的是在该参数后面还包含有几个参数。在程序体中,使用第一个参数进行参数访问控制,参数的获取方式按照数组方法进行获取。因此,C 代码1执行后,Sum 的值为 6。(2).请问 C代码 2中 static的作用是什么?const 的作用是什么?王工自己编写的内存拷贝函数安全吗?如存在缺陷,请指出缺陷在哪里。(分数:7.00)_正确答案:()解析:1) static
23、的作用:是将变量修饰成静态变量,静态变量的存储地址在整个程序的运行执行期间均保留,不会被别的变量占据。 2) const的作用:是用于冻结一个变量,使其值在程序中不能被进一步改变。 3)不安全,有缺陷。 4)应对形参的有效性进行检查,应判形参 dest、src 指针是否为空,形参 n是否大于 0,还应保证 dest所指向的内存空间不越界。 解析 在程序设计中,static 变量和 const变量的应用非常广泛。static变量表示将变量修饰为静态变量,其含义是指其对应的存储空间在整个程序的运行过程中都保持不变,不会像堆栈那样被重复使用。static 即可以用来修饰局部变量,也可以修饰全局变量。
24、 一旦变量定义为是 const,则其对应的值不能再被修改。在程序运行中,此变量的值就一直维持在其初始化时候的值。 王工编写的这段程序不安全,存在严重的安全漏洞,具体的缺陷包括: (1)对于指针参数的有效性没有进行任何判断,如果指针为 NULL,这样访问存在严重的安全问题。 (2)参数 n的有效性也没有进行判断,如果参数 n对应的空间超过 src所包含的空间,则函数得到的结果和期待的结果会有所偏差。同样,如果 n对应的空间超过 dest所包含的地址空间,则会造成程序的混乱,会将内存冲掉,可能导致灾难性后果。(3).仔细阅读并分析 C代码 3,填补其中的空白处。(分数:7.00)_正确答案:()解
25、析:ptr1=ptr1-next ptr2=ptr2-next ptr2 temp2-next=temp1 temp3 解析 在单向链表中,对某元素的后继元素的访问只能通过结点中的 next指针项来获取。按照题目要求,首先创建两个指针 ptr1,ptr2,并且都指向链表头,然后 ptr1向前走 index步,这样 ptr1和ptr2之间就间隔 index个结点,然后 ptr1和 ptr2同时向前步进,当 ptr1到达最后一个结点时,ptr2 就是倒数第 index个结点了。因此,对于第 index个结点的查找,只需要移动 ptr1和 ptr2,最后 ptr2返回的为倒数第 index个结点。 在逆序排列中,将 temp3移动到链表尾部,使用 temp2作为临时变量进行链表翻转。