嵌入式软件开发面试笔试题_第1页
嵌入式软件开发面试笔试题_第2页
嵌入式软件开发面试笔试题_第3页
嵌入式软件开发面试笔试题_第4页
嵌入式软件开发面试笔试题_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

嵌入式软件笔试<2#<{><2#<1><1><2#f<J>V <Jw叫• •卜<|>Vr3w VChapterl语法类<2# <i><2# <i><i#<2# <1><t><2#frjwrjwrjwrywrjw<J>rjwrjwrjwrjwrjwrjwrjwrjwrjwrjw rjwrjwg1.volatile作用?应用场合举3例volatile修饰的变量表示这个变量町能会被意想不到的改变,对该变量的操作将不作优化,用到该变量时都从这个变量的原始地址读取,而不是用保存在寄存器里的备份。Volatile常用在:.硬件寄存器(如:状态寄存器)。.中断程序中会访问到的非自动变量(Non-autoniaticvariables)o.多线程应用中几个任务共享的变量2.一个参数既可以是const还可以是volatile吗?解释为什么©是的。比如只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。3•—个指针可以是volatile吗?解释为什么。是的。比如一个中断服务子程序修该一个指向一个buffer的指针时。4.用变量a给出下面的定义a)—个整型数b)—个指向整型数的指针c)一个指向指针的指针,它指向的指针是指向一个整型数d)一个有10个整型数的数组e)一个有10个指针的数组,该指针是指向一个整型数的f)一个指向有10个整型数数组的指针g)—个指向函数的指针,该函数有一个整型参数并返回一个整型数h)—个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数inta;//Anintegerint*a;//Apointertoanintegerint**a;//Apointertoapointertoanintegerinta[10];//Anarrayof10integersint*(a[10]);//Anarrayof10pointerstointegersint(*a)[10];//Apointertoanarrayof10integersint(*a)(int);//Apointertoafunctionathattakesanintegerargumentandreturnsanintegerint(*a[10])(int);//Anarrayof10pointerstofunctionsthattakeanintegerargumentandreturnaninteger5•什么是存储机制里的大、小端模式?试举例说明人端模式(big-edian):MSE存放在最低端的地址上。举例,双字节数0x1234以big-endian的方式存在起始地址0x00002000中:|data|<—address|0xl2|<-0x00002000|0x34|<-0x00002001在Big-Endian中,对于bit序列中的序号编排方式如下(以双字节数0x8B8A为例):bit|01234567|89101112131415MSB LSBval|10001011|10001010|=0x8B8A小端模式(little-endian):LSE存放在最低端的地址上。举例,双字节数0x1234以httle-enduui的方式存在起始地址0x00002000中:|data|<—address|0x34|<-0x00002000|0xl2|<-0x00002001在Little-Endian中,对于bit序列中的序号编排和Big-Endiaii刚好相反,其方式如下(以双字节数Ox8B8A为例):bit|15141312111098|76543210MSB LSBval|10001011|10001010|=0x8B8A写一段用来判断内存存储方式是大端还是小段的代码。联合体union的存放顺序是所有成员都从低地址开始存放,利用该特性就可以轻松地获得了CPU对内存采用Little-endiaii还是Big-endian模式读写。代码如下:mtcheckCPUendianQ{union{unsignedmta;unsignedcharb;}c;c.a=1;return(c.b==1);/*iemin1:little-endian,returnO:big-endian*/定义一个返回值是指向函数的指针且有一个指向函数的指针作参数的函数。通用形式如下:typedefint(*P)(); // 定义一个函数指针P类型Pftinction(mt(*p)()); //定义一个函数返回值P类型,且定义一个指向函数的指针p作参数用预处理指^define声明一个常数,用以表明1年中有多少秒(忽略闰年问题)幷defineSECONDS_PER_YEAR(60*60*24*365)UL//UL怎么个用法?你暂不要加写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个。存defineMIN(A.B)((A)<=(B)?(A):(E))关键字static的作用是什么?两个作用:局部变量被声明为static则这一函数调用结束后该变量值保持不变。外部变量被声明为static表明它是一个本地全局变量。该变量只能在该文件内被访问,不能被其它文件访问。关键字const有什么含意?声明一个变量为只读。下面的声明都是什么意思?1)constmta;2)mtconsta;3)constiiit*a;4)mt*consta;5)mtconst*consta;1,2—样a为只读整形变量;3指向一个只读整形变量的指针;4指向整形的只读指针;5指向只读整形的只读指针。C语言实现设置一绝对地址为0x1234的整型变量的值为0xaa55°int*p;p=(iiit*)0x1234;//把整型数0x1234强制转换(typecast〉为一指针*p=Oxaa55;找出下面一段ISR的问题。—iiitenuptdoublecompute_area(doubleradius){doublearea=PI*radius*radius;printf(H\iiArea=%f\area);returnaiea;}1)ISR不能传递参数。)ISR不能有返回值。)ISR应该短且有效率,在ISR中做浮点运算不明智。.下面的代码输出是什么?为什么?voidfdo(void){unsignedinta=6;intb=-20;(a+b>6)?puts(H>6H):puts(H<=6”);}输出>6,原因是当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型。-20成了一个非常人的正数。〃此题的输出确实是这样,但单纯输出a+b时结果又是-14很怪异迷惑 !16.评价下面的代码片断:unsignedintzero=0;unsignedintcompzero=OxFFFF;如杲碰巧mt型是16位则上述代码没有问题,否则上面的代码不正确。应写成:unsignedmtcompzeio=~0;17・下面代码执行后a,b,c的值各是多少?inta=5,b=7,c;c=a+-H-b; //c= (a++)+ba=6,b=7,c=12. //吾已试,结果确如此Typedef和#(^门皿的区别define在预编译的时候处理作机械的字符替换。Typedef在编译的时候处理,并不是作简单的字符替换。而是如同定义变量一样声明一个类型。然后用它去定义这种类型的变量。比如下面的例子:存definedPSstnicts*typedefstnicts*tPS;以上两句都是定义dPS和tPS为一个指向结构s的指针。typedef更好。比如:dPSpl,p2;tPSp3,p4;第一句扩展为structs*pl,p2;这条代码定义pl为指向结构的指针,p2为一个实际的结构体。第二句定义p3和p4为指向结构体s的指针。/>V r4wV r4w •,、叫・Chapter2编程类<£>/rjwrjwrfwrywrjwrjwrjwrjwrfwrjwrjwrjwrjwrjwrjw rjwrjw/在字符串中找出所有与给定字符相同字符的位置。Sinclude<stdio・h>chars[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==O)printf(^No%cfound\n,,»given);}intmain(void){search_char('o');return0;/* E */将一个字符串自身逆序.Sinclude<stdio・h>SdefineLEX12intmain(void){intm,i;chartemp;chars[LEM]二〃hellotiger";m二(LENT)/2;printf(^%s\n/z,s);for(i=0;i<m;i++){temp二s[i];s[i]二s[LEN-2-i];s[LEN-2-i]二temp;printf(“$s\n",s);return0;/* E */链表的基本操作及链表自身逆序。/* chainoperatefromDataStrueture */Sinclude<malloc・h>Sinclude<stdio・h>Sinclude<stdlib・h>typedefintDataType;typedefstruetNode{DataTypedata;struet Node*next;}SLNode;// initiatevoidListInitiate(SLNode**head){exit(l);if((*head=(SLNode*)malloc(sizeof(SLNode)))==NULL)elseprintf(〃0K\n〃);exit(l);(*head)-〉next二NULL;}// lengthcalintListL^ngth(SLNode*head){SLNode*p=head;intsize=0;while(p->next!二NULL){p二p_>next;size++;}returnsize;}// insertanodeintListlnsert(SLNode*head,inti,DataTypex){SLNode*p,*q;intj;p=head;j二T;while((p->next!二NULL)&&(j〈(i-l))){p=p~>next;j++;}辻(j!二(i-l)) {printf("Positionerror\nz,);return0;辻((q二(SLNode*)malloc(sizeof(SLNode)))二二NULL)exit(1);q->data=x;q一>next二p~>next;p_>next二q;return1;}// deleteanodeintListD^lete(SLNod己*head,inti,DataType*x){SLNode*p,*s;intj;p二head;j二T;while((p~>next!=NULL)&&(p->next->next!二NULL)&& ){p二p_>next;j++;}if(j!=i-l){printf(z,Positionerror\n,z);return0;}s=p->next;*x=s~>data;p->next=p">next一>next;free(s);:return1;}// datagetintListG^t(SLNode*head,inti,DataType*x){SLNode*p;intj;p二head;j=-l;while((p~>next!=NULL)&&(j〈i)){p二p_>next;j++;}辻(j!二i){printf("Positionerror\n,z);return0;}*x=p->data;:return1;}// D^stroyachainvoidDestroy(SLNode**head){SLNode*p,*pl;p二*head;while(p!=NULL){pl=P;p二p_>next;free(pl);}*head二NULL;}// converseachainvoidconverse(SLNode*head)SLNode*p,*q;p=head~>next;head一>n己xt二NULL;while(p!=NULL){q二P;p=p~>next;q~>next二head">next;head">next二q;// compositeoperationintmain(void){SLNode*head;inti,x;Listlnitiate(&head);for(i=0;i<10;i++){if(Listlnsert(h^ad,i,i)二二0){printf("Error\n,z);return1;}if(ListD己lete(head,0,&x)二二0) //chain,position,dataaddress{printf("Error\nz,);return1;}if(Listinsert(head,0,100)=0){printf("Error\nz,);return1;}converse(head);for(i=0;i<ListLength(head);i++) {if(ListGet(head,i,&x)二二0) //chain,position,dataaddress{printf("Error'n");return1;}elseprintf(〃玄d",x);}printfC\n*);Destroy(&head);return0;}/* e ♦/写一个二分査找算法。Sinclude<stdio・h>#definesize10intg[size]={0,1,2,3,4,5,6,7,8,9};intsearch(intx){intlow=0;inthigh二sizeT;intmid;while(low<=high){mid=(low+high)/2;if(g[mid]==x)returnmid;elseif(g[mid]<x)low=mid+l;elseif(g[mid]>x)high二mid-1;}return一1;}//——intmain(void){printf(z,%d\n,z,search(7));:return0;}/* E */计算一个字节里(byte)里面有多少bit被置1.Sinclude<stdio・h>intcal_bit(chara){inti,j二0;for(i=0;i<8;i++){if(G&OxOl)=0x01)j++;a=a»l;}returnj;//_intmain(void){printf(z,%d\n/z,cal_bit(255));return0;}/* E */6.字符串转换为整数,比如“1234”转换成1234.^include〈stdio.h>charstr[6]二〃12345";intstring_to_int(chars[]){inti;intsum二0;for(i=0;s[i]!=\0‘;i++)sum二sum*10+s[i]-'0’;returnsum;intmain(void){printf(/z%d\n,z,string_to_int(str));:return0;}/* E */7.整数转换为字符串,比如1234转换成“1234”.^include〈stdio.h>Sinclude<math.h>#defineLEX4charstr[]二"“;char*int_to_string(intgiven){inti;inttemp;for(i=0;i<LEN;i++){temp二given/pow(10,LENT-i); //从最高位开始given=given%((int)pow(10,LEN~l~i));//intmustbeonbothsideof‘%’str[i]=temp+'0’;}returnstr;intmain(void){printf(”%s\n〃,int_to_string(9876));return0;}/* E */8.C语言实现插入排序算法(从大到小,从小到大).#include<stdio.h>

SdefineLEN5inta[LEN]二{7,4,8,4,5};voidinsertion_sort(void){inti,j,key;for(j=l;j<LEN;j++){printf("%d,%d,%d,%d,%d\n〃,a[0],a[l],a[2],a[3],a[4]);key二a[j];i=j-l;while((i>=0)&&(a[i]>key)){ //a[i]>key从小到人;a[i]<key从大到小a[i+l]二a[i];i—;}a[i+l]=key;}printf(,z%d,%d,%d,%d,%d\n",a[0],a[l],a[2],a[3],a[4]);intmain(void){insertion_sort();return0;}/* E */9.C语言实现冒泡排序算法(从大到小,从小到大)#include<stdio.h>SdefineLEN5inta[LEN]={5,4,3,2,1};voidbubblersort(void){inti,j,flag二1;inttemp;for(i=l;(i<LEN)&&(flag==l);i++){flag=0;//a[j]>a[j+l]从小到大;a//a[j]>a[j+l]从小到大;a[j]<a[j+l]从大到小⑷);if(a[j]>a[j+l]){flagFl;temp=a[j];a[j]=a[j+l]:a[j+l]=temp;}}printf(,z%d,%d,%d,%d,%d\n",a[0],a[l],a[2],a[3],}}intmain(void)bubble^sort();r己turn0;/* E */在一个字符串中找一个字符串计算一个数的阶乘递归实现:intfactorial(intn){if(n==0)return1;else{intrecurse=factorial(n-1);intresult=n*recurse;returnresult;}}循环实现:intfactorial(intn){intresult=1;while(n>0){result=result*n;n=n-1;}returnresult;}12•用嵌套循环求"00的素数#include<stdio.h>intmain(void){inti,j;for(i=1;i<=100;i++){for(j=2;j<i;j++)if(i%j=0)break;if(j==i)printf(,f%d\n,fzi);}return0;}严 E */13-打印菱形图案voidDamond(mtL,chaich)intnjk、i;fbr(n=1;n<=L/2+l;n++)fbr(j=OJ<L/2+l-nJ++)prmtf(HH);fbr(k=1;k<=2*n-1:k++)pnntf(”%c”,ch);prmtf(n\nn);}fbr(i=L-n+1;i>=1;i-)pnntf(HM);fbi(k=1;k<=2*i-l;k++)pnntfC%c”,ch);prmtf(n\nn);14.删除一个字符串中的指定字符。Sinclude<stdio.h>voiddel_char(char*p,charch)char*pch;while(*p!='\0'){if(*p==ch){for(pch=p;*pch!=,\0,;pch++)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论