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

下载本文档

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

文档简介

1、嵌入式开发面试题 2.txt根网线''尽赚了多少人的青春有时候感动的就是身边微不足道的小事。破碎不是最残酷的最残酷的是踩着这些碎片却假装不疼痛固执的寻找将来就算我遇见再怎么完美的人,都有一个缺点,他不是你,_下辈子要做男生,娶一个像我这样的女生。8086的堆栈采取向下生长的方式,在压入时_(41_。(41 A. SP 先减,再压入数据 B. 先压入数据,SP 再减C. SP 先加,再压入数据D. 先压入数据,SP 再加<解析>:考查8086堆栈的基础知识。个人觉得,堆栈是嵌入式的基础东西,自然就是考试重点,以后或许会多考单片机ARM的结构。8086处理器均采用满递减

2、堆栈。入栈时,先减地址,后进数据;出栈时,先出数据,后减地址。PUSH SRL:先将栈顶指针SP向上移两位,即SP-2,指向一个新的字存储单元,再将操作数的内容存入SP所指的字存储单元。POP DST:将当前栈顶指针SP所指向字单元内容送向DST,然后将SP下移两位,SP-2。参考答案:A。若对某一寄存器某几位清零,可用一条指令_(42_处理。今天老大让我针对一个面试者出些嵌入式方面的面试题,主要是想对他的技术深度进一步了解。我就出了下面这些问题,每个问题背后都是考察一个嵌入式程序员应该具备的相关技能。当然这些只是我的个人理解,不一定正确。在此与大家分享,只是希望朋友们能够得到一点点启发:如何

3、抓住每一个契机展现你的与众不同?同样的技术问题,很多人可能都能够回答得对,但有些人只是知其然而不知所以然。其实面试官每一个问题背后通常都隐藏着一个考察点。如果我们能够透过问题看到背后的实质,在回答出答案的时候还能够借机发挥,我相信90和100分的差别就出来了。哪个面试官不喜欢招一个喜欢思考、能透过现象看本质的员工呢下面我们来看看嵌入式C面试题背后到底藏何玄机。以下仅是个人的一些想法,欢迎大家讨论,拍砖的轻点/1、 int a=2,b=11,c=a+b+/a+; 则c值为多少?【考点】编码规范。表面上考察你对运算符优先级的掌握程度,但实际上优先级这些玩意很难死记硬背得住?大家的疑惑不就是运算符的

4、结合顺序么?那么如何去避免呢?c=a+(b+/(a+不就行了么,其实问题背后考察的是你的编码规范,如何写清晰易懂的代码,如何在一个团队中让自己的代码狠容易毫无偏差的让新人看懂2、 Static用在全局变量定义和函数内部局部变量定义有何区别?【考点】编码规范及模块化设计。Static变量的两个属性涉及存储位置及可见域。在大型的程序设计中static全局变量可以有效的避免名字空间的重复及无意的变量引用,这样可以有效的提高程序设计的安全性,同时也利用模块化作业3、在程序设计中哪些地方需要使用define?如何用define来定义一年内有多少小时的常量?【考点】可移植性。嵌入式程序设计的特点就是软硬件

5、平台可变性,有效利用define常量可以提高程序的可移植性,这样改动方便,不易出错4、 Define宏语句和inline函数有什么区别?【考点】时空效率及宏的副作用。嵌入式系统平台通常存储资源有限,但同时又对实时性有一定的要求,二者如何权衡需要考虑。Define宏语句相对于函数调用能提高运行时间性能,但消耗了空间,并且不标准的宏语句定义在不标准的编码中更容易出现副作用,因此inline函数则是define语句的完美替代品。小资金干大事正是嵌入式的终极目标!5、哪些地方可以用到const?const变量和函数输入参数用const修饰有哪些作用?【考点】程序设计可靠性。Const只读变量可以有效克

6、服define常量的一些弊端,如无类型安全检查。Const形参可以有效避免程序内部更改无意的更改。人非圣贤孰能无误,所以我们要将这些可能的失误统统交给智能的编译器,这样就可以将错误扼杀在摇篮中6、 Int,short,char在32位平台下各占几个字节?一个结构体含有int、short、char变量各一个,结构体占据的总内存空间多少?【考点】跨平台移植。嵌入式并非x86,其硬件平台具备很大的差异性,同为int在不同的架构体系下可能占据的字节数是不一样的。不同的平台也有不同的编译器,其在变量对齐方面可能有不同的特性。因此在结构体定义时如何设计成员变量的顺序以有效减少占据的内存空间,以及如何填充特

7、定字段保证访问对齐问题,都是嵌入式系统结构体设计时应该考虑的跨平台可移植性问题7、如何将unsigned int明确定义为一个32位类型?define和typedef有何区别?【考点】跨平台移植。define和typedef都可以实现变量类型重定义,但是typedef类型的指针变量可以有效去除变量定义的二义性。在嵌入式的工程项目中,通常为了保证数据类型的统一且便于跨平台移植时修改数据类型方便,通常都会单独定义一个数据类型的头文件,把所有用到的数据类型typedef成所熟悉的形式8、有没有用过volatile?有哪些典型的适用场合?【考点】编译优化的副作用。通常为了提高程序运行的效率,编译器会自

8、动进行一些优化,如将变量放在寄存器中,以减少存储器访问次数,在数据长期未变时不重新读取内存等等。但是优化有时会带来问题,如硬件寄存器、多任务共享变量、中断和主程序共享变量,优化有可能带来数据访问不一致性的问题,因此对于这些个别变量,我们需要用volatile声明告诉编译器取消优化9、参数传递有哪些形式?寄存器和堆栈传递各有什么优缺点?【考点】编译优化、调用性能、接口设计。每种体系结构及对应的编译器对参数传递都有自己的规定。参数传递并非总是通过堆栈进行的,参数入栈出栈是需要耗费时间的,编译器总是尽量优化利用寄存器来传递参数,因为寄存器的访问效率要高,但当参数过多时,将放弃优化从而用栈传递参数。因

9、此为了提高调用性能,应尽量减少参数个数,太多时可以将所有参数重新定义为一个结构体,利用结构体指针来传递参数。在函数接口设计时应考虑硬件平台和编译器的特性,以灵活定义参数形式10、中断服务程序设计应注意的问题?中断触发方式的选择?中断处理太长怎么办?中断处理程序如何与主应用程序交互?【考点】中断服务程序设计。嵌入式程序最大的特点是经常需要和硬件打交道,中断是接收外界输入的典型方式,通常都决定了系统运行流程,因此如何高效不丢失的处理中断是每个嵌入式程序员应考虑的问题11、 TCP/IP和OSI七层模型是如何划分的?各层的功能,这么设计有什么好处?【考点】层次化软件设计保证可移植性。分层模型最大的好

10、处就是某一层变化了,只要其提供上层的接口未变,那么上层就无需做任何改动。因此只需要更改本层的实现即可。嵌入式平台因为软硬件多变性,为了最大限度的利用先前的成果,软件设计一定要遵循这种层次化模型,这样才能保证其可移植性12、 TCP和UDP的区别?各种网络互连设备都用在哪一层?如何建立链接?如何进行拥塞控制?【考点】协议设计可靠性及缓冲区设计管理。TCP和UDP的最大区别在于可靠性,TCP通过三次握手协议及超时机制安全可靠的建立或者释放连接。协议设计最大的问题就是如何保证效率合可靠性,TCP的设计为我们提供了一个参考。而滑动窗口机制可以有效的进行拥塞控制,但窗口大小的设计则关系到内存利用率及缓冲

11、效率可靠性等问题。在嵌入式的驱动程序设计中,经常会开辟缓冲区来进行流量控制及防止数据覆盖,缓冲区的大小设计则需要更加具体的应用情况设计才能保证可靠性合灵活性(42A. AND B. OR C. NOT D. XOR<解析>:考查汇编语言的基础知识,简单到极点了,这个分数拿不到,基本过不了。AND(与:有0为0。OR(或:有1为1。NOT(非:取反。XOR(异或:相同为0,不同为1。要对寄存器的某几位清零,应用AND。例如对11011010的中间四位清零:11011010 AND 11000011 得11000010。个人认为:用XOR指令,一条指令是做不到的,实际中不可取。参考答案

12、:A。指令周期是指_(43_。(43 A. CPU 从主存取出一条指令的时间B. CPU 执行一条指令的时间C. CPU 从主存取出一条指令加上执行该条指令的时间D. 时钟周期的时间<解析>:考嵌入式最最基本的概念了,记住就行,这个分数必拿。指令周期:CPU从内存取出一条指令并执行这条指令的时间总和。包括取指令,分析指令,执行指令整个过程。<补充>:时钟周期、机器周期、指令周期的概念辨析。时钟周期:时序中的最小单位,就是1/fosc。例如:晶振为12MHz,那么时钟周期为1/12us。机器周期:完成某一规定操作所需的时间,通常由若干时钟周期构成。例如:单片机是12周期的

13、话,那么在12MHz晶振的情况下,其机器周期为1us。指令周期:完成一条指令的所有时间。例如RET是一个2周期指令,在上述的条件下,它的指令周期为2us。参考答案:C。在汇编过程中,不产生机器码,只用来指示汇编程序如何汇编的指令是_(44_。(44A. 宏指令 B. 伪指令 C. 汇编指令 D. 机器指令<解析>:考查汇编语言的基础知识。不想多说了,太简单了,自己看看概念吧。或者这样记住:伪指令就是假的指令,假得指令是给人看的,不是给机器看的,所以机器不能产生代码。注意一下宏指令的用法,说不好下次就考了。参考答案:B。在8086微处理器中,若(SS = 2000H,(SP = 01

14、00H,(AX = 2107H,执行指令PUSH AX 后存放数据21H 的物理地址是_(45_。(45A. 20102H B. 20101H C. 200FEH D. 200FFH<解析>:这道题目不容易,需要对X86汇编语言有深入的理解,拿不到分就算了。41题是会做对这道题目的基础。由41题可知,8086的堆栈数据操作是,SP先减,再压入数据,以字为单位对堆栈操作。因此压入数据时的起始SP应为0100H-2=00FEH。而8086中数据采用小端模式存取,即一个字数据中低字节存放低位地址。(X86越向上的地址越小8086逻辑地址到物理地址的形成机制为:物理地址=段地址*16+偏移

15、地址(或物理地址=段地址左移4位+偏移地址。压栈后,内容存储的物理地址为2000*16+00FEH=200FE,21H是AX 中的高位,其存储位置为200FFH。参考答案:D。在串行通信中,根据数据传输方向不同,可以分成三种方式,不包括_(46_方式。(46A. 单工 B. 双工 C. 半单工 D. 半双工<解析>:考查接口通信的基础知识。没有必要多说,是我们搞嵌入式必须知道的基本常识。什么是单工、双工、半双工得搞搞清楚。参考答案:C。寄存器间接寻址方式中,操作数处在_(47_。(47A. 通用寄存器 B. 主存单元 C. 程序计数器 D. 堆栈<解析>:考查寻址方式的

16、基础概念,需要有一点的理解,但是其选项会让很多人答对。简单来说,寄存器间接寻址方式是说,指令的寄存器的内容不是操作数,而是操作数的偏移地址,操作数本身则在存储器中。参考答案:B。 IEEE 1394具有_(48_位地址空间,IEEE 1394的通信协议具有三个协议层,下面不属于这三个协议层的是_(49_。(48A. 8 B. 16 C. 32 D. 64(49A. 事务层 B. 表示层 C. 链路层 D. 物理层<解析>:考查接口技术中1394的基本知识。参考教程219-221页。1394总线类似于PCI总线,任何设备可以在64位地址空间内进行读写操作。一条1394总线可以接入63

17、个设备,支持同步和异步两种串行传输方式。1394的协议由3层组成:物理层、链路层、事务层。参考答案:D、B。在软件测试中,白盒测试是基于设计的和基于_(50_测试。(50A. 需求的 B. 代码的 C. 提炼的 D. 反常的或极端的<解析>:考查软件测试的基本知识。参考教程405-410页,在2007年考试中,下午考了一道这方面的题目,要注意。机器测试分为黑盒测试和白盒测试。黑盒测试也称为功能测试。白盒测试也称为结构测试。白盒测试,将软件看成透明的白盒,根据程序内部结构和逻辑来设计测试用例,对程序的路径和过程进行测试,检查是否满足设计的需要。通过白盒测试,测试人员可以很清楚已经有多

18、少代码被检查过了,可以准确地预测出系统中的程序设计错误的数量规模。参考答案:B。下面的题目必须全部答对才给分:1、如何在C中初始化一个字符数组。2、如何在C中为一个数组分配空间。3、如何初始化一个指针数组。4、如何定义一个有10个元素的整数型指针数组。5、 s10的另外一种表达方式是什么。6、 GCC3.2.2版本中支持哪几种编程语言。7、要使用CHAR_BIT需要包含哪个头文件。8、对(-1.2345取整是多少?9、如何让局部变量具有全局生命期。10、C中的常量字符串应在何时定义?11、如何在两个.c文件中引用对方的变量。12、使用malloc之前需要做什么准备工作。13、realloc函数

19、在使用上要注意什么问题。14、strtok函数在使用上要注意什么问题。15、gets函数在使用上要注意什么问题。16、C语言的词法分析在长度规则方面采用的是什么策略?17、a+b所表示的是什么意思?有什么问题?18、如何定义Bool变量的TRUE和FALSE的值。19、C语言的const的含义是什么。在定义常量时,为什么推荐使用const,而不是#define。20、C语言的volatile的含义是什么。使用时会对编译器有什么暗示。这部分是ANSI C的一些问题,题目的前提是必须都答对,看似很变态,但是细想一下,这些都是最基础的,虽然我们在使用他们的时候会犯这样那样的错误,但是最终目的是不犯错

20、误,不是么,那么好,从最基础的开始。1、如何在C中初始化一个字符数组。这个问题看似很简单,但是我们要将最简单的问题用最严谨的态度来对待。关键的地方:初始化、字符型、数组。最简单的方法是char array;。这个问题看似解决了,但是在初始化上好像还欠缺点什么,个人认为:char array5='1','2','3','4','5'或者char array5="12345"或者char array210="China","Beijing"也许更符合“初始化”

21、的意思。2、如何在C中为一个数组分配空间。最简单的方法是:char array5;意思是分配给数组array一个5个字节的空间。但是我们要知道在C中数组其实就是一个名字,其实质含义就是指针,比如char array;是到底分配的多少空间?所以我们要将其分成为两种不同的形式给出答案:一种是栈的形式:char array5;一种是堆的形式:char *array; array=(char *malloc(5;/C+: array=new char5; 堆和栈的含义其实我也没弄太透彻,改天明白了再发一篇。我们要明白的是,第一种形式空间分配的大小可能会受操作系统的限制,比如windows会限制在2M;

22、第二种形式成空间分配很灵活,想分配多少分配多少,只要RAM够大。3、如何初始化一个指针数组。首先明确一个概念,就是指向数组的指针,和存放指针的数组。指向数组的指针:char (*array5;含义是一个指向存放5个字符的数组的指针。存放指针的数组:char *array5;含义是一个数组中存放了5个指向字符型数据的指针。按照题意,我理解为初始化一个存放指针的数组,char *array2="China","Beijing"其含义是初始化了一个有两个指向字符型数据的指针的数组,这两个指针分别指向字符串"China"和"Beij

23、ing"。4、如何定义一个有10个元素的整数型指针数组。既然只是定义而不是初始化,那就很简单且没有争议了:int *array10;。5、 s10的另外一种表达方式是什么。前面说过了,数组和指针其实是数据存在形态的两种表现形式,如果说对于数组s,我们知道*s=s0,那么s10的另一种表达方式就是:*(s+10。6、 GCC3.2.2版本中支持哪几种编程语言。这个问题实在变态,就像问你#error的作用是什么一样。不可否认,gcc是linux下一个亮点,是一个备受无数程序员推崇的编译器,其优点省略 1000字,有兴趣可以自己查,我翻了翻书,书上曰:支持C,C+,Java,Obj-C,A

24、da,Fortran,Pascal,Modula-3等语言,这个“等”比较要命,不过我认为已经很全了,如果认为还是不全,干脆把ASM也加上算了,不过那已经不算是编译了。7、要使用CHAR_BIT需要包含哪个头文件。如果结合上面的问题,答题的人估计会认为自己撞鬼了,这个问题实在是搜索了一下,应该是limits.h。8、 对(-1.2345取整是多少? 其实不同的取整函数可能有不同的结果,不过这个数没有太大的争议,答案是-1。 9、 如何让局部变量具有全局生命期。 具体的生命期的概念我觉得我还要好好深入的学习一下,但是这个题目还算比较简单,即用 static 修饰就可以了,但是只是生命期延长,范围

25、并没有扩大,除非把这个变量定义在函数 体外的静态区,不过那样就变成全局变量了,仿佛不符合题目要求。 10、C 中的常量字符串应在何时定义? 这个问题说实话不是很理解题干的意思,据我理解,有两种情况,一种是预处理阶段,用 #define 定义;还有就是使用 const 修饰词,不过 const 修饰的是一个变量,其含义是“只 读” ,称之为常量并不准确,但是确实可以用操作变量的方法当常量用。所以还是第一种比较 靠谱。 11、如何在两个.c 文件中引用对方的变量。 这个问题也问的挺含糊的,怎么说呢,最简单最直接的方法是为变量添加 extern 修饰词,当 然,这个变量必须是全局变量。还有一种就是利

26、用函数调用来进行变量的间接引用,比如这 个 C 文件中的一个函数引用另外一个 C 中的函数,将变量通过实参的形式传递过去。不过题 目既然说是引用,那么还是用第一个答案好了。 12、使用 malloc 之前需要做什么准备工作。 其实准备工作很多啊,比如你需要一台计算机之类的。玩笑话,我们首先要知道 malloc 的用 途,简单的说就是动态的分配一段空间,返回这段空间的头指针。实际的准备工作可以这么 分:需要这段空间的指针是否存在,若不存在,则定义一个指针用来被赋值,还要清楚要返 回一个什么类型的指针,分配的空间是否合理;如果指针已经存在,那么在重新将新的空间 头地址赋值给这个指针之前,要先判断指

27、针是否为 NULL,如果不是要 free 一下,否则原来 的空间就会被浪费,或者出错,free 之后就按照前一种情形考虑就可以了。 13、realloc 函数在使用上要注意什么问题。 这个函数我也才知道的,汗一个。据我的初步理解,这个函数的作用是重新分配空间大小, 返回的头指针不变,只是改变空间大小。既然是改变,就有变大、变小和为什么改变的问题。 变大,要注意不能大到内存溢出;变小,那变小的那部分空间会被征用,原有数据不再存在; 为什么改变,如果是想重新挪作他用,还是先 free 了吧。 14、strtok 函数在使用上要注意什么问题。 这个问题我不知道能不能回答全面,因为实在是用的很少。这个

28、函数的作用是分割字符串, 但 是 要 分 割 的 字 符 串 不 能 是 常 量 , 这 是 要 注 意 的 。 比 如 先 定 义 一 个 字 符 串 : char array="part1,part2",strtok 的原形是 char *strtok(char *string, char *delim;, 我们将","作为分隔符,先用 pt=strtok(array,",",得到的结果 print 出来就是"part1", 那后面的呢,要写成 pt=strtok(NULL,",",注意,要

29、用 NULL,如果被分割的字符串会被分 成 N 段,那从第二次开始就一直要用 NULL。总结起来,需要注意的是:被分割的字符串和分 隔符都要使用变量;除第一次使用指向字符串的指针外,之后的都要使用 NULL;注意使用这 个函数的时候千万别把指针跟丢了,不然就全乱了。 15、gets 函数在使用上要注意什么问题。 这是一个键盘输入函数,将输入字符串的头地址返回。说到要注意的问题,我还是先查了一 下网上的一些情况,需要注意的就是 gets 以输入回车结束,这个地球人都知道,但是很多人 不知道的是,当你输入完一个字符串后,这个字符串可能依然存在于这个标准输入流之中, 当再次使用 gets 的时候,也

30、许会把上次输入的东西读出来,所以应该在使用之后用 fflush(stdin;处理一下,将输入流清空。最后也还是要注意溢出的问题。关于这个答案我 比较含糊,不知道有没有高人高见? 16、C 语言的词法分析在长度规则方面采用的是什么策略? 我无语闻所未闻啊还是搜索了一下,有一篇文章,地址是: /jp2005/20/kcwz/wlkc/wlkc/03/3_5_2.htm, 是关于词法分析器的。 其 中提到了两点策略: (1 按最长匹配原则确定被选的词型; (2 如果一个字符串能为若干个 词型匹配,则排列在最前面的词型被选中。不知道是不是题干的要求,还是其他什么。我

31、乃 一介草民,望达人指点迷津! 17、a+b 所表示的是什么意思?有什么问题? 这个东西(称之为东西一点都不过分)其实并没有语法错误,按照 C 对运算符等级的划分, +的优先级大于+,那么这句话会被编译器看做:(a+(+ b,这回明白了吧。有什么问题, 语法上没有问题,有的是道德上的问题!作为一个优秀的程序员,我们要力求语句的合法性 和可读性,如果写这句的人是在一个 team 里,那么他基本会被打的半死最后讨论一下 结果:假设 a 之前的值是 3,b 是 4,那么运行完这个变态语句后,a 的值是 4,b 是 5,语句 的结果是 8。 18、如何定义 Bool 变量的 TRUE 和 FALSE 的值。 不知道这个题有什么陷阱, 写到现在神经已经大了, 一般来说先要把 TURE 和 FALSE 给定义了, 使用#define 就可以: #define TURE 1 #define FALSE 0 如果有一个变量需要定义成 bool 型的,举个例子:bool a=TURE;就可以了。 19、C 语言的 const 的含义是什么。在定义常量时,为什么推荐使用 const,而不是#define

温馨提示

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

评论

0/150

提交评论