嵌入式软件笔试/************************Chapter1语法类***********************/1.volatile作用?应用场合举3例volatile修饰的变量表示这个变量可能会被意想不到的改变,对该变量的操作将不作优化,用到该变量时都从这个变量的原始地址读取,而不是用保存在寄存器里的备份。Volatile常用在:1).硬件寄存器(如:状态寄存器)。2).中断程序中会访问到的非自动变量(Non-automaticvariables)。3).多线程应用中几个任务共享的变量2.一个参数既可以是const还可以是volatile吗?解释为什么。是的。比如只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。3.一个指针可以是volatile吗?解释为什么。是的。比如一个中断服务子程序修该一个指向一个buffer的指针时。4.用变量a给出下面的定义a)一个整型数b)一个指向整型数的指针c)一个指向指针的指针,它指向的指针是指向一个整型数d)一个有10个整型数的数组e)一个有10个指针的数组,该指针是指向一个整型数的f)一个指向有10个整型数数组的指针g)一个指向函数的指针,该函数有一个整型参数并返回一个整型数h)一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数a)inta;//Anintegerb)int*a;//Apointertoanintegerc)int**a;//Apointertoapointertoanintegerd)inta[10];//Anarrayof10integerse)int*(a[10]);//Anarrayof10pointerstointegersf)int(*a)[10];//Apointertoanarrayof10integersg)int(*a)(int);//Apointertoafunctionathattakesanintegerargumentandreturnsanintegerh)int(*a[10])(int);//Anarrayof10pointerstofunctionsthattakeanintegerargumentandreturnaninteger5.什么是存储机制里的大、小端模式?试举例说明大端模式(big-edian):MSB存放在最低端的地址上。举例,双字节数0x1234以big-endian的方式存在起始地址0x00002000中:|data|--address|0x12|--0x00002000|0x34|--0x00002001在Big-Endian中,对于bit序列中的序号编排方式如下(以双字节数0x8B8A为例):bit|01234567|89101112131415MSB----------------------------------LSBval|10001011|10001010|=0x8B8A小端模式(little-endian):LSB存放在最低端的地址上。举例,双字节数0x1234以little-endian的方式存在起始地址0x00002000中:|data|--address|0x34|--0x00002000|0x12|--0x00002001在Little-Endian中,对于bit序列中的序号编排和Big-Endian刚好相反,其方式如下(以双字节数0x8B8A为例):bit|15141312111098|76543210MSB-----------------------------------LSBval|10001011|10001010|=0x8B8A6.写一段用来判断内存存储方式是大端还是小段的代码。联合体union的存放顺序是所有成员都从低地址开始存放,利用该特性就可以轻松地获得了CPU对内存采用Little-endian还是Big-endian模式读写。代码如下:intcheckCPUendian(){union{unsignedinta;unsignedcharb;}c;c.a=1;return(c.b==1);}/*return1:little-endian,return0:big-endian*/7.定义一个返回值是指向函数的指针且有一个指向函数的指针作参数的函数。通用形式如下:typedefint(*P)();//定义一个函数指针P类型Pfunction(int(*p)());//定义一个函数返回值P类型,且定义一个指向函数的指针p作参数8.用预处理指令#define声明一个常数,用以表明1年中有多少秒(忽略闰年问题)#defineSECONDS_PER_YEAR(60*60*24*365)UL//UL怎么个用法?你暂不要加9.写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个。#defineMIN(A,B)((A)=(B)?(A):(B))10.关键字static的作用是什么?两个作用:1)局部变量被声明为static则这一函数调用结束后该变量值保持不变。2)外部变量被声明为static表明它是一个本地全局变量。该变量只能在该文件内被访问,不能被其它文件访问。11.关键字const有什么含意?声明一个变量为只读。12.下面的声明都是什么意思?1)constinta;2)intconsta;3)constint*a;4)int*consta;5)intconst*consta;1,2一样a为只读整形变量;3指向一个只读整形变量的指针;4指向整形的只读指针;5指向只读整形的只读指针。13.C语言实现设置一绝对地址为0x1234的整型变量的值为0xaa55。int*p;p=(int*)0x1234;//把整型数0x1234强制转换(typecast)为一指针*p=0xaa55;14.找出下面一段ISR的问题。__interruptdoublecompute_area(doubleradius){doublearea=PI*radius*radius;printf(\nArea=%f,area);returnarea;}1)ISR不能传递参数。2)ISR不能有返回值。3)ISR应该短且有效率,在ISR中做浮点运算不明智。15.下面的代码输出是什么?为什么?voidfoo(void){unsignedinta=6;intb=-20;(a+b6)?puts(6):puts(=6);}输出6,原因是当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型。-20成了一个非常大的正数。//此题的输出确实是这样,但单纯输出a+b时结果又是-14很怪异迷惑~~~~~~!16.评价下面的代码片断:unsignedintzero=0;unsignedintcompzero=0xFFFF;如果碰巧int型是16位则上述代码没有问题,否则上面的代码不正确。应写成:unsignedintcompzero=~0;17.下面代码执行后a,b,c的值各是多少?inta=5,b=7,c;c=a+++b;//c=(a++)+ba=6,b=7,c=12.//吾已试,结果确如此18.Typedef和#define的区别#define在预编译的时候处理作机械的字符替换。Typedef在编译的时候处理,并不是作简单的字符替换。而是如同定义变量一样声明一个类型。然后用它去定义这种类型的变量。比如下面的例子:#definedPSstructs*typedefstructs*tPS;以上两句都是定义dPS和tPS为一个指向结构s的指针。typedef更好。比如:dPSp1,p2;tPSp3,p4;第一句扩展为structs*p1,p2;这条代码定义p1为指向结构的指针,p2为一个实际的结构体。第二句定义p3和p4为指向结构体s的指针。/************************Chapter2编程类***********************/1.在字符串中找出所有与给定字符相同字符的位置。#includestdio.hchars[6]=hello;voidsearch_char(chargiven){inti=0,j=0;while(s[i]!='\0'){if(s[i]==given){printf(location=%d\n,i);j++;}i++;}if(j==0)printf(No%cfound\n,given);}intmain(void){search_char('o');return0;}/*-----E----*/2.将一个字符串自身逆序.#includestdio.h#defineLEN12intmain(void){intm,i;chartemp;chars[LEN]=hellotiger;m=(LEN-1)/2;printf(%s\n,s);for(i=0;im;i++){temp=s[i];s[i]=s[LEN-2-i];s[LEN-2-i]=temp;}printf(%s\n,s);return0;}/*-------E------*/3.链表的基本操作及链表自身逆序。/*----chainoperatefromDataStructure---*/#includemalloc.h#includestdio.h#includestdlib.htypedefintDataType;typedefstructNode{DataTypedata;structNode*next;}SLNode;//----initiatevoidListInitiate(SLNode**head){if((*head=(SLNode*)malloc(sizeof(SLNode)))==NULL)exit(1);elseprintf(OK\n);(*head)-next=NULL;}//----lengthcalintListLength(SLNode*head){SLNode*p=head;intsize=0;while(p-next!=NULL){p=p-next;size++;}returnsize;}//----insertanodeintListInsert(SLNode*head,inti,DataTypex){SLNode*p,*q;intj;p=head;j=-1;while((p-next!=NULL)&&(j(i-1))){p=p-next;j++;}if(j!=(i-1)){printf(Positionerror\n);return0;}if((q=(SLNode*)malloc(sizeof(SLNode)))==NULL)exit(1);q-data=x;q-next=p-next;p-next=q;return1;}//----deleteanodeintListDelete(SLNode*head,inti,DataType*x){SLNode*p,*s;intj;p=head;j=-1;while((p-next!=NULL)&&(p-next-next!=NULL)&&(ji-1)){p=p-next;j++;}if(j!=i-1){printf(Positionerror\n);return0;}s=p-next;*x=s-data;p-next=p-next-next;free(s);return1;}//-----datagetintListGet(SLNode*head,inti,DataType*x){SLNode*p;intj;p=head;j=-1;while((p-next!=NULL)&&(ji)){p=p-next;j++;}if(j!=i){printf(Positionerror\n);return0;}*x=p-data;return