问答题 试题五(共15分)   阅读以下关于嵌入式C语言编程方面的问题,回答问题1至问题3,将答案填入答题纸的对应栏内。 【说明】 嵌入式C语言编程中常涉及位运算、宏定义的问题,以及大端方式(Big-endian)、小端方式(Little-endian)的访问问题。
问答题 【问题1】 (4分)   嵌入式系统中常要求用户对变量或寄存器进行位操作。下面的两个函数分别为设置和清除变量a的第5位。请使用下面的宏定义BIT5按要求对变量a进行相应的处理。在函数set _bit5中,用位或赋值操作(|=)设置变量a的第5位,在函数clear bits中,用位与赋值操作(&=)清除变量a的第5位。   #define BIT5(0x01<<5)   static int a; void set bit5(void) { ①;/*设置变量a的第5位*/ } void clear_bit5(void) { ②;/*清除变量a的第5位*/ }
【正确答案】①a|=BIT5 ②a&=~BIT5
【答案解析】
问答题 【问题2】 (5分) 图5-1所示代码的设计意图是计算1~100各数的平方。该段代码运行后,没有得到应有的结果,请说明出错原因,将答案填入答题纸的对应栏内。 图5-2是在不改变宏定义的情况下,对程序进行修改。请完成该段代码,将答案填入答题纸的对应栏内。
【正确答案】出错原因: 在宏定义中,参数a 使用两次,而在引用宏时,使用了i++,从而导致出错。 ①i ②i++ 或 i=i+1 或 ++i 或 i+=1
【答案解析】
问答题 【问题3】(6分) 某嵌入式处理器工作在大端方式(Big-endian)下,其中unsigned int为32位,unsigned short为16位,unsigned char为8位。仔细阅读并分析下面的C语言代码,写出其打印输出的结果,将答案填入答题纸的对应栏内。 #include“stdio.h” #include“stdlib.h” void *MEM ADDR; void mem_test(void) { unsigned int *pint_addr=NULL; unsigned short *pshort_addr=NULL; unsigned char *pchar_addr=NULL; MEM_ADDR=(void*)malloc(sizeof(int)); pint_addr=“(unsigned int*)MEM_ADDR; pshort_addr=(unsigned short *)MEM_ADDR; pchar_addr=(unsigned char *)MEM ADDR; *pint_addr=0x12345678; printf(“0x%x,0x%x\n”,*pshort_addr,*pchar_addr); /*第一次输出*/ Pshort_addr++; *pshort_addr=0x5555; printf(“0x%x,0x%x\n”,*pint_addr,*pchar_addr); /*第二次输出*/ Pchar_addr++; *pchar_addr“0xAA; printf(“0x%x,0x%x\n”,*pint_addr,*pshort_addr); /*第三次输出*/ }
【正确答案】第一次输出:0x1234,0x12 第二次输出:0x12345555,0x12 第三次输出:0x12aa5555,0x55555
【答案解析】