版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
凹凸笔试题目(嵌入式软件开发)2007-02-07EmbeddedSoftwareDesignEngineer读程序段,回答下列问题intmain(intargc,char*argv[]){intc=9,d=0;c=c++%5;d=c;printf("d=%d\n",d);return0;}写出程序输出在一个可移植的系统中这种表达式能否存在风险?why?#include"stdio.h"inta=0;intb;staticcharc;intmain(intargc,char*argv[]){chard=4;staticshorte;a++;b=100;c=(char)++a;e=(++d)++;printf("a=%d,b=%d,c=%d,d=%d,e=%d",a,b,c,d,e);return0;}a)写出程序输出b)编译器假如安排各个变量(a,b,c,d)section),最好用图形方式描绘。
在存中的布局
(eg.
stack,heap,data
section,bss2中止是嵌入式系统中重要的构成部分,这致使了很多编译开发商供给一种扩展:让标准
C支持中止,产生了一个新的重点字
__interrupt
。下边的代码就使用了
__interrupt
重点字去定义了一其中止服务子程序(ISR),请议论以下这段代码。__interruptdoublecompute_area(doubleradius){doublearea=PI*radius*radius;printf("nArea=%f",area);returnarea;}3C/C++基础知识问题a)重点字volatile
在编译时有什么含义
?并给出三个不同使用处景的例子
(能够伪代码或许文字描绘)。b)C语言中static重点字的详细作用有哪些?请问下边三种变量申明有何差别?请给出详细含义intconst*p;int*constp;intconst*constp;嵌入式系统有关问题a)对于整形变量A=0x12345678,
请画出在
littleendian
及
bigendian
的方式下在存中是怎样储存的。b)在ARM系统中,函数调用的时候,参数是经过哪一种方式传达的c)中止(interrupt,如键盘中止)与异样(exception,如除零异样
?)有何差别
?设周期性任务P1,P2,P3的周期为T1,T2,T3分别为100,150,400;履行时间分别为20,40,100。请设计一种调动算法进行任务调动,知足任务履行周期及任务周期。优先级反转问题在嵌入式系统中是一中严重的问题,一定给与足够重视。第一请解说优先级反转问题b)好多RTOS供给优先级继承策略(Priorityinheritance)和优先级天花板策略(Priorityceilings)用来解决优先级反转问题,请议论这两种策略。参照答案
:15存在风险,因为c=c++%5;这个表达式对
c有两次改正,行为不决义,
c的值不确立inta=0;//datasectionintb;//datasectionstaticcharc;//BSSintmain(intargc,char*argv[]){chard=4;staticshorte;a++;
//stack//BSSb=100;c=(char)++a;e=(++d)++;printf("a=%d,b=%d,c=%d,d=%d,e=%d",a,b,c,d,e);return0;}a=2,b=100,c=2,d=6,e=52a)ISR不可以返回一个值;b)ISR不可以传达参数;浮点一般都是不行重入的;d)printf函数有重入和性能上的问题。3a)用volatile重点字定义变量,相当于告诉编译器,这个变量的值会随时发生变化,每次使用时都需要去存里从头读取它的值,其实不要任意针对它作优化。建议使用volatile变量的场所:并行设施的硬件存放器一其中止服务子程序中会接见到的非自动变量(全局变量)多线程应用中被几个任务共享的变量在函数体,一个被申明为静态的变量在这一函数被调用过程中保持其值不变。在模块(但在函数体外),一个被申明为静态的变量能够被模块所用函数接见,但不可以被模块外其余函数接见。它是一个当地的全局变量。在模块,一个被申明为静态的函数只可被这一模块的其余函数调用。那就是,这个函数被限制在申明它的模块的当地围使用。static全局变量与一般的全局变量有什么差别:static全局变量只初使化一次,防备在其他文件单元中被引用;static局部变量和一般局部变量有什么差别:static局部变量只被初始化一次,下一次依据前一次结果值;static
函数与一般函数有什么差别:
static
函数在存中只有一份,一般函数在每个被调用中保持一份拷贝一个指向常整型数的指针一个指向整型数的常指针一个指向常整型数的常指针4a)0x12345678littleendianbigendian恰好反过来高地点--〉0x12低地点--〉0x120x340x340x560x56低地点--〉0x78高地点--〉0x78参数<=4时候,经过R0~R3传达,>4的经过压栈方式传达异样:在产生时一定考虑与办理器的时钟同步,实践上,异样也称为同步中止。在办理器执行到因为编程失误而致使的错误指令时,或许在履行时期出现特别状况(如缺页),一定靠核办理的时候,办理器就会产生一个异样。所谓中止应当是指外面硬件产生的一个电信号,从cpu的中止引脚进入,打断cpu目前的运转;所谓异样,是指软件运转中发生了一些一定作出办理的事件,
cpu
自动产生一个堕入来打断目前运转,转入异样办理流程。异步与同步的差别
`5高优先级任务需要等候低优先级任务开释资源,而低优先级任务又正在等候中等优先级任务的现象叫做优先级反转优先级继承策略(Priorityinheritance):继承现有被堵塞任务的最高优先级作为其优先级,任务退出临界区,恢复初始优先级。优先级天花板策略(Priorityceilings):控制接见临界资源的信号量的优先级天花板。优先级继承策略对任务履行流程的影响相对教小,因为只有当高优先级任务申请已被低优先级任务据有的临界资源这一事实发生时,才抬升低优先级任务的优先级。原文地点/u/451daef9010007mv商定:下边的测试题中,以为全部一定的头文件都已经正确的包含了数据种类char一个字节1byteint两个字节2byte(16位系统,以为整型是2个字节)longint四个字节4bytefloat四个字节4byetdouble八个字节8bytelongdouble十个字节10bytepointer两个字节2byte(注意,16位系统,地点总线只有16位)第1题:考察对volatile重点字的认识#include<setjmp.h>staticjmp_bufbuf;main(){volatileb=3;
intb;if(setjmp(buf)!=0){printf("%d",b);exit(0);}b=5;longjmp(buf,1);}请问,这段程序的输出是350以上均不是第2题:考察种类变换main(){structnode{inta;intb;intc;};structnodes={3,5,6};structnode*pt=&s;printf("%d",*(int*)pt);}这段程序的输出是:3567第3题:考察递归调用intfoo(intx,intn){intval;val=1;if(n>0){if(n%2==1)val=val*x;val=val*foo(x*x,n/2);}returnval;}这段代码对
x和
n达成什么样的功能
(操作)?(a)x^n
(x
的n次幂)x*n(x与n的乘积)n^x(n的x次幂)以上均不是第4题:考察指针,这道题只合适于那些特别仔细且对指针和数组有深入理解的人main(){inta[5]={1,2,3,4,5};int*ptr=(int*)(&a+1);printf("%d%d",*(a+1),*(ptr-1));}这段程序的输出是:222125以上均不是第5题:考察多维数组与指针voidfoo(int[][3]);main(){inta[3][3]={{1,2,3},{4,5,6},{7,8,9}};foo(a);printf("%d",a[2][1]);}voidfoo(intb[][3]){++b;b[1][1]=9;}这段程序的输出是:897以上均不对第6题目:考察逗号表达式main(){inta,b,c,d;a=3;b=5;c=a,b;d=(a,b);printf("c=%d",c);printf("d=%d",d);}这段程序的输出是:c=3d=3c=5d=3c=3d=5c=5d=5第7题:考察指针数组main(){inta[][3]={1,2,3,4,5,6};int(*ptr)[3]=a;printf("%d%d",(*ptr)[1],(*ptr)[2]);++ptr;printf("%d%d",(*ptr)[1],(*ptr)[2]);}这段程序的输出是:235623454500以上均不对第8题:考察函数指针int*f1(void){intx=10;return(&x);}int*f2(void){int*ptr;*ptr=10;returnptr;}int*f3(void){int*ptr;ptr=(int*)malloc(sizeof(int));returnptr;}上边这3个函数哪一个最可能惹起指针方面的问题只有f3只有f1andf3只有f1andf2f1,f2,f3第9题:考察自加操作(++)main(){inti=3;intj;j=sizeof(++i+++i);printf("i=%dj=%d",i,j);}这段程序的输出是:i=4j=2i=3j=2i=3j=4i=3j=6第10题:考察形式参数,实质参数,指针和数组voidf1(int*,int);voidf2(int*,int);void(*p[2])(int*,int);main(){inta;intb;p[0]=f1;p[1]=f2;a=3;b=5;p[0](&a,b);printf("%d\t%d\t",a,b);p[1](&a,b);printf("%d\t%d\t",a,b);}voidf1(int*p,intq){inttmp;tmp=*p;*p=q;q=tmp;}voidf2(int*p,intq){inttmp;tmp=*p;*p=q;q=tmp;}这段程序的输出是:5555353553533333第11题:考察自减操作(--)voide(int);main(){inta;a=3;e(a);}voide(intn){if(n>0){e(--n);printf("%d",n);e(--n);}}这段程序的输出是:0120012112010211第12题:考察typedef种类定义,函数指针typedefint(*test)(float*,float*)testtmp;tmp
的种类是(a)函数的指针,该函数以
两个指向浮点数
(float)
的指针
(pointer)
作为参数(arguments)Pointertofunctionofhavingtwoargumentsthatispointertofloat整型(c)函数的指针,该函数以两个指向浮点数(float)的指针(pointer)作为参数(arguments),而且函数的返回值种类是整型Pointertofunctionhavingtwoargumentthatispointertofloatandreturnint以上都不是第13题:数组与指针的差别与联系main(){charp;charbuf[10]={1,2,3,4,5,6,9,8};p=(buf+1)[5];printf("%d",p);}这段程序的输出是:569以上都不对第14题:考察指针数组的指针Voidf(char**);main(){char*argv[]={"ab","cd","ef","gh","ij","kl"};f(argv);}voidf(char**p){char*t;t=(p+=sizeof(int))[-1];printf("%s",t);}这段程序的输出是:abcdefgh第15题:本题考察的是C的变长参数,就像标准函数库里printf()那样,这个话题一般国大学讲堂是不会讲到的,不会也情有可原呵呵,#include<stdarg.h>intripple(int,...);main(){intnum;num=ripple(3,5,7);printf("%d",num);}intripple(intn,...){inti,j;intk;va_listp;k=0;j=1;va_start(p,n);for(;j<n;++j){i=va_arg(p,int);for(;i;i&=i-1)++k;}returnk;}这段程序的输出是:7653第16题:考察静态变量的知识intcounter(inti){staticintcount=0;count=count+i;return(count);}main(){inti,j;for(i=0;i<=5;i++)j=counter(i);}本程序履行到最后,j的值是:101567详尽参照答案第1题:(b)volatile字面意思是易于挥发的。这个重点字来描绘一个变量时,意味着给该变量赋值(写入)以后,立刻再读取,写入的值与读取的值可能不同样,因此说它"简单挥发"的。这是因为这个变量可能一个存放器,直接与外面设施相连,你写入以后,该存放器也有可能被外面设施的写操作所改变;或许,该变量被一其中止程序,或另一个进度改变了.volatile不会被编译器优化影响,在longjump后,它的值是后边假设的变量值,b最后的值是5,因此5被打印出来.setjmp:设置非局部跳转/*setjmp.h*/Storescontextinformationsuchasregistervaluessothatthelomgjmpfunctioncanreturncontroltothestatementfollowingtheonecallingsetjmp.Returns0whenitisinitiallycalled.Lonjjmp:履行一个非局部跳转/*setjmp.h*/Transferscontroltothestatementwherethecalltosetjmp(whichinitializedbuf)wasmade.Executioncontinuesatthispointasiflongjmpcannotreturnthevalue0.Anonvolatileautomaticvariablemightbechangedbyacalltolongjmp.Whenyouusesetjmpandlongjmp,theonlyautomaticvariablesguaranteedtoremainvalidarethosedeclaredvolatile.Note:Testprogramwithoutvolatilequalifier(resultmayvery)更详尽介绍,请参阅C语言的setjmp和longjmp第2题:(a)构造题的成员在存中的地点是依据他们定义的地点次序挨次增添的。假如一个构造体的指针被当作它的第一个成员的指针,那么该指针确实指向第一个成员第3题:(a)本题目较难.这个程序的非递归版本intwhat(intx,intn){intval;intproduct;product=1;val=x;while(n>0){if(n%2==1)product=product*val;
/*
假如是奇数次幂
,x(val)要先乘前一次
,;偶数次幂
,最后返回时才会到这里乘以1*/val=val*val;n=n/2;}returnproduct;}/*用二元复乘策略*/算法描绘(whilen>0){ifnextmostsignificantbinarydigitofn(power)isonethenmultiplyaccumulatedproductbycurrentval,reducen(power)sequencebyafactoroftwousingintegerdivision.getnextvalbymultiplycurrentvalueofitself}第4题:(c)a的种类是一个整型数组,它有5个成员&a的种类是一个整型数组的指针因此&a+1指向的地方等同于a[6]因此*(a+1)等同于a[1]ptr等同a[6],ptr-1就等同与a[5]第5题:(b)题目自己就给了足够的提示b[0][0]=4b[1][0]=7第6题:(c)考察逗号表达式,逗号表达式的优先级是很低的,比
赋值(=)
的优先级
低.
逗号表达式的值就是最后一个元素的值逗号表达式的还有一个作用就是切割函数的参数列表
..E1,E2,...,En上边这个表示式的左右是
,E1,E2,...En
的值被分别计算出来,
En计算出来的构造赋给整个逗号表达式c=a,b;
/*yieldsc=a*/d=(a,b);
/*d=b*/第7题:(a)ptr是一个数组的指针,该数组有3个int成员第8题:(c)f1明显有问题,它返回一个局部变量的指针,局部变量是保存在stack中的,退出函数后,局部变量就销毁了,保存其指针没存心义,因为其指向的stack空间可能被其余变量覆盖了f2也有问题,ptr是局部变量,未初始化,它的值是未知的,*ptr不知道指向哪里了,直接给*ptr赋值可能会覆盖重要的系统变量,这就是往常说的野指针的一种第9题:(b)sizeof操作符给出其操作数需要占用的空间大小,它是在编译时便可确立的,因此其操作数即便是一个表达式,也不需要在运转时进行计算.(++i+++i)是不会执行的,因此i的值仍是3第10题:(a)很明显选a.f1互换*p和q的值,f1履行完后,*p和q的值确实互换了,但q的改变不会影响到b的改变,*p实质上就是a因此履行f1后,a=b=5这道题考察的知识围很广,包含typedef自定义种类,函数指针,指针数组void(*p[2])(int*,int);定义了一个函数指针的数组p,p有两个指针元素.元素是函数的指针,函数指针指向的函数是一个带2个参数,返回void的函数,所带的两个参数是指向整型的指针,和整型p[0]=f1;p[1]=f2containaddressoffunction.functionnamewithoutparenthesisrepresentaddressoffunctionValueandaddressofvariableispassedtofunctiononlyargumentthatiseffectedisa(addressispassed).Becauseofcallbyvaluef1,f2cannoteffectb第11题:(a)考察--操作和递归调用,认真剖析一下就能够了第12题:(c)建议不会的看看C专家编程从左往有,碰到括号停下来,将第一个括号里的东西当作一个整体第13题:(c)考察什么时候数组就是指针.对某些种类T而言,假如一个表达式是T[](T个表达式的值实质上就是指向该数组的第一个元素的指针.因此(buf+1)[5]*(buf+6)或许buf[6]
的数组),这实质上就是第14题:(b)sizeof(int)的值是(p+=sizeof(int))[-1]
2,因此p+=sizeof(int)指向argv[1],
指向argv[2],这点预计大家都没有什么疑问能理解吗,因为(p+=sizeof(int))[-1]就相当于(p+=2)[-1],
也就是
(p+2-1)第15题:(c)在C编译器往常供给了一系列办理可变参数的宏,以障蔽不同的硬件平台造成的差别,程序的可移植性。这些宏包含va_start、va_arg和va_end等。采纳ANSI标准形式时,参数个数可变的函数的原型申明是:
增添typefuncname(typepara1,typepara2,...)这种形式起码需要一个一般的形式参数,type是函数返回值和形式参数的种类。
后边的省略号不表示省略,
而是函数原型的一部分。不同的编译器,对这个可变长参数的实现不同样对于可变长参数,可参阅
,gcc4.x
中是置函数
.[url]./html/2004-11/26.html[/url][url]./html/2004-11/24.html[/url]程序剖析va_listp;/*
定义一个变量
,保存
函数参数列表
的指针*/va_start(p,n);
/*
用va_start
宏初始化变量
p,va_start
宏的第2个参数
n,是一个固定的参数,一定是我们自己定义的变长函数的最后一个入栈的参数也就是调用的时候参数列表里的第1个参数*/for(;j<n;++j)/*j从1开始,遍历全部可变参数*/{i=va_arg(p,int);/*va_argfor(;i;i&=i-1)/*++k;/*i}
拿出目前的参数,并以为拿出的参数是一个整数(int)*/判
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【正版授权】 ISO 21120:2025 EN Machinery for forestry - Forestry mulching equipment - Terms,definitions and commercial specifications
- 2024年版房屋买卖合同:购房者与开发商之间的购房权益、交付时间等详细约定
- 2024年标准油漆施工合作合同版B版
- 2024年科研成果保密合同
- 正装复合模装课程设计
- 2024年漳州卫生职业学院单招职业适应性测试题库带答案
- 完善财务报告的透明度要求计划
- 商城服务员工作总结
- 安防行业顾问工作总结
- 分析仓库工作中的服务意识计划
- 2024高血压的诊断与治疗
- 重度子痫前期产后护理查房
- 制作课件wps教学课件
- 北京市海淀区2023届高三上学期期末考试化学试卷 附解析
- MCN机构签约合同范本
- 解读智能问答系统研究
- 2024年沪教版一年级上学期语文期末复习习题
- 2024广东省广州市天河区中考一模语文试题含答案解析
- 中国移动-AI+智慧城市安全解决方案白皮书2024
- 前台文员的工作灵活性与适应能力计划
- 2024版【人教精通版】小学英语六年级下册全册教案
评论
0/150
提交评论