嵌入式软件类笔试面试小结_第1页
嵌入式软件类笔试面试小结_第2页
嵌入式软件类笔试面试小结_第3页
嵌入式软件类笔试面试小结_第4页
嵌入式软件类笔试面试小结_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

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

文档简介

1、最近忙于找工作,笔试面试了一些公司,本人主要找工作的方向是:嵌入式软件工程师。所以,针对嵌入式软件开发岗位的多次笔试与面试经历总结了一些常考查的知识点,希望有利于学弟、学妹们找工作。C语言首先,对C的考查是必须的。既然打算从事嵌入式软件开发岗位,C语言是基础,关于C主要需要把C语言三剑客即C陷阱与缺陷C和指针C专家编程,还有C语言深度剖析。其中C和指针、C语言深度剖析这两本书至少看2,3遍,从此对于C语言的基础考查,就很难难倒你了,没有捷径这几本书必须看的。1关键字考查volatile:防止编译器优化这个关键字是为了告诉你请不要做没谱的优化,这个值可能变掉。(笔试中考查过)volatile使用

2、的几个例子j并行设备的硬件寄存器(如:状态寄存器)k一个中断服务子程序中会访问到的非自动变量l多线程应用中被几个任务共享的变量一个指针可以是volatile吗可以,因为指针和普通变量一样,有时也有变化程序的不可控性。常见例:子中断服务子程序修改一个指向一个buffer的指针时,必须用volatile来修饰这个指针。说明:指针是一种普通的变量,从访问上没有什么不同于其他变量的特性。其保存的数组是个整形数据,和整形变量不同的是,这个整形数据指向的是一段内存地址。const:修饰的只读变量(笔试中考查过)const:这个关键字是告诉你:请作为常量使用,而并非放心吧,那肯定是常量const int *

3、p; /p可变,p指向的对象不可变int const *p; / p可变,p指向的对象不可变int * const p; /p不可变,p指向的对象可变const int * const p;/指针p和p指向的对象都不可变记忆方法说明:先忽略类型名(编译器解析的时候也是忽略类型名),我们看const离哪个近,“近水楼台先得月”,离谁近就修饰谁。const int *p; /const修饰*p,p是指针,*p是指针指向的对象,不可变int const *p; / const修饰*p,p是指针,*p是指针指向的对象,不可变int * const p; /const修饰p,p不可变,p指向的对象可变c

4、onst int * const p;/前一个const修饰*p,后一个const修饰p,指针p和p指向的对象/都可不变int const a = 12;const修饰的a值是不是一定无法改变呢?非也,int *p = &a; *p = 5; 通过这两步,即可改变a的值,此时a值为5.typedef与define(笔试中考查过)把typedef看成是一种彻底的“封装”类型-在声明它之后不能再往里面增加别的东西。可以用其他类型说明符对宏类型名进行扩展,但对typedef所定义的类型名却不能这样做。    #define peach int    u

5、nsigned peach i;/*没问题*/    typedef int banana;    unsigned banana i;/*错误!非法*/面试题:typedef和define有什么区别:j用法不同:typedef用来定义一种数据类型的别名,增强程序的可读性。define主要用来定义常量,以及书写复杂使用频率的宏。k执行时间不同:typedef是编译过程的一部分,有类型检查的功能。define是宏定义,是预编译的部分,其发生在编译之前,只是简单的进行字符串的替换,不进行类型的检查。l作用域不同:typedef有作用域限制。define不受作

6、用域约束,只要是在define声明后面的引用都是正确的。m对指针的操作不同:typedef和define定义的指针时有很大的区别。注意:typedef定义是语句,因此句尾要加上分号。而define不是语句,千万不能在句尾加分号。说明:j#define PINT int * PINT a,b; / 定义结果是a的类型是int *, b的类型是int ktypedef int * PINT; PINT a,b; /a,b都为int * 类型static:是常考查的关键字,笔试面试中考查次数相当多(笔试面试都有考查过)static修饰的局部变量存储于静态区,存储于静态区的变量有默认初始值为0,这种变

7、量在程序执行之前创建,并在程序的整个执行期间一直存在,而不是每次在代码块开始执行时创建,在代码块执行完毕后销毁。普通变量存储于栈中,没有默认初始值。变量的链接属性和作用域不受影响,与普通局部变量一样。static修饰函数,使得函数成为静态函数。指函数的作用域仅局限于本文件(所以又称内部函数)。sizeof 和 strlen 的区别(他们的使用也是考查的重点)sizeof 和 strlen 有以下区别:sizeof 是一个操作符,strlen 是库函数。sizeof 的参数可以是数据的类型,也可以是变量,而 strlen 只能以结尾为 0的字符串作参数。编译器在编译时就计算出了 sizeof 的

8、结果。而 strlen 函数必须在运行时才能计算出来。并且 sizeof计算的是数据类型占内存的大小,而 strlen 计算的是字符串实际的长度。数组做 sizeof 的参数不退化,传递给 strlen 就退化为指针了。sizeof(a = b+1)-并没有向a赋值,返回a的长度大小,并非b的union共用体(笔试考查过)union 维护足够的空间来置放多个数据成员中的“一种”,而不是为每一个数据成员配置空间,在union 中所有的数据成员共用一个空间,同一时间只能储存其中一个数据成员,所有的数据成员具有相同的起始地址。对这个关键字的考查,经常会考到判断大小端。变量i 占4 个字节,但只有一个

9、字节的值为1,另外三个字节的值都为0。如果取出低地址上的值为0,毫无疑问,这是大端模式;如果取出低地址上的值为1,毫无疑问,这是小端模式。既然如此,我们完全可以利用union 类型数据的特点:所有成员的起始地址一致。(这个函数笔试考查过,需要记住)int checkSystem() union check int i; char ch; c; c.i = 1; return(c.ch = 1);auto,好多人都没有见过这个关键字,但是有些选择题目中可能会有涉及。auto:在缺省情况下,编译器默认所有变量都是auto的。(笔试选择题中出现过,要知道它是C语言的关键字)还有其他关键字就不一一列举

10、了,书中都有详细介绍,我把常考到的简单说一些。2、关于C的其他常考查知识点设置地址为 0x67a9 的整型变量的值为 0xaa66(笔试中考查过)int *ptr;ptr = (int *)0x67a9;*ptr = 0xaa66;说明:这道题就是强制类型转换的典型例子,无论在什么平台地址长度和整型数据的长度是一样的,即一个整型数据可以强制转换成地址指针类型,只要有意义即可。方法二: int *(int *)0x67a9 = 0xaa66;不使用库函数写出strcpy strcat strcmp strlen strstr memset memcpy 这些函数的实现。或者直接考查,或者间接考查

11、。首先要明白这几个函数如何使用,然后需要自己写出实现方式。我遇到过编写函数实现 strcpy 、strlen 的直接考查。对strstr的使用以及函数实现的编写。strcpy 、strcmp、strlen编写程序多次使用到。memset memcpy选择填空中遇到过。(笔试中考查过)链表和数组有什么区别(面试中考查过)数组和链表有以下几点不同:(1)存储形式:数组是一块连续的空间,声明时就要确定长度。链表是一块可不连续的动态空间,长度可变,每个结点要保存相邻结点指针。(2)数据查找:数组的线性查找速度快,查找操作直接使用偏移地址。链表需要按顺序检索结点,效率低。(3)数据插入或删除:链表可以快

12、速插入和删除结点,而数组则可能需要大量数据移动。(4)越界问题:链表不存在越界问题,数组有越界问题。说明:在选择数组或链表数据结构时,一定要根据实际需要进行选择。数组便于查询,链表便于插入删除。数组节省空间但是长度固定,链表虽然变长但是占了更多的存储空间。关于布尔值(笔试中考查过,要知道C中无布尔值)布尔值只有0和1C并不具备显试的布尔类型,所以使用整数来代替。其规则是:零的假,任何非零值皆为真。短路求值&& |(在线笔试中有涉及)&&操作符的左操作数总是首先进行求值,如果它的值为真,然后就紧接着对右操作数求值。如果操作数的值为假,那么右操作数便不再进行求值,因

13、为整个表达式的值肯定是假的。 |操作数也是同理。当左操作数的值为真,右操作数便不再求值。a0与a(这个是必须弄清楚的,多次考查过)int a5;a0是一个元素,a是整个数组。sizeof(a) = 20; sizeof(&a0) = 4;/取元素a0的首地址sizeof(&a) = 4; /取数组a的首地址,在VC+6.0为20,Bug数组名的类型是“指向int的常量指针”a是数组首元素的首地址,也就是a0的首地址&a0表示数组首元素的地址;&a表示数组的首地址看法:在表示地址时:a与&a0含义用法是一致的a作为右值时其意义与&a0是一样,代表的

14、是数组首元素的首地址,而不是数组的首地址(用在表达式sizeof(a)中时,a表示的数组名,此时a并没有被用作右值)。但是注意,这仅仅是代表,并没有一个地方(这只是简单的这么认为,其具体实现细节不作过多讨论)来存储这个地址,也就是说编译器并没有为数组a分配一块内存来存其地址,这一点就与指针有很大的差别。a不能作为左值!main() int a5=1,2,3,4,5; int *ptr=(int *)(&a+1); printf("%dn%dn",*(a+1),*(ptr-1);/此处把a换成&a0也是可以的&a + 1-取数组a 的首地址,该地址的值

15、加上sizeof(a) 的值,即&a + 5*sizeof(int),也就是下一个数组的首地址,显然当前指针已经越过了数组的界限。(int *)(&a+1)-则是把上一步计算出来的地址,强制转换为int * 类型,赋值给ptr。*(a+1)- a,&a的值是一样的,但意思不一样,a是数组首元素的首地址,也就是a0的首地址,&a是数组的首地址,a+1是数组下一元素的首地址,即a1的首地址,&a+1是下一个数组的首地址。所以输出2*(ptr-1)-因为ptr是指向a5,并且ptr是int * 类型,所以*(ptr-1)是指向a4,输出5。大端存储与小端存储(

16、笔试中考查过)小端: 较高 的有效字节存放在较高 的的存储器地址,较低 的有效字节存放在较低 的存储器地址。 大端: 较高 的有效字节存放在较低 的存储器地址,较低 的有效字节存放在较高 的存储器地址。我们常用的X86结构是小端模式,而KEIL-C51则为大端模式。很多的ARM,DSP都为小端模式。有些ARM处理器还可以由硬件来选择是大端模式还是小端模式。内存对齐(常考查知识点)字,双字,和四字在自然边界上不需要在内存中对齐。(对字,双字,和四字来说,自然边界分别是偶数地址,可以被4整除的地址,和可以被8整除的地址。)无论如何,为了提高程序的性能,数据结构(尤其是栈)应该尽可能地在自然边界上对

17、齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;然而,对齐的内存访问仅需要一次访问。struct Test char c1; short s; char c2; int i;a;sizeof(a) = 12;(s两个字节为一个字,会在偶数地址对齐)缺省情况下,编译器默认将结构、栈中的成员数据进行内存对齐。因此,上面的程序输出就变成了:c1 00000000, s 00000002, c2 00000004, i 00000008。编译器将未对齐的成员向后移,将每一个都成员对齐到自然边界上,从而也导致了整个结构的尺寸变大。尽管会牺牲一点空间(成员之间有部分内存空闲),但提高了性能。

18、-struct Test char c1; char c2; short s; int i;a1;sizeof(a1) = 8;c1 00000000, c2 00000001, s 00000002, i 00000004-struct Test char c1; double e;a;sizeof(a) = 16;(这儿以8字节对齐)struct Test char c1; short e; char c2;a;sizeof(a) = 6;(这儿以2个字节对齐)关于内存对齐,有时候还会涉及到知识点 柔性数组 和 位域 ,需要简单了解一下。冒泡排序、递归的使用也是有所考查。C语言是重点,还有

19、其他知识点未有涉及,还需仔细看书。数据结构与算法数据结构与算法常考到的有 单链表、双链表、二叉树。对于单链表的考查,会考查到单链表的创建、插入、删除,单链表逆序,判断单链表是否有环的两种方法。(创建、插入、删除、逆序笔试中我都遇到过,判断是否有环,往年的笔试题目中看到过)双链表的插入。(我笔试中遇到过,也有同学面试中考查过,现场写程序)二叉树的遍历方式(前序遍历、中序遍历、后序遍历)。(面试中考查过,现场写程序)栈与队列的区别,如何用两个栈实现一个队列。(同学笔试、面试中考查过)哈希表(同学面试中考查过)二分法查找(笔试中考查过)快速排序、桶排序、堆排序、分治法排序、冒泡排序他们的时间复杂度、

20、稳定性。(选择、填空有考查过)部分知识点详细说明:判断单链表中是否有环用两个栈实现一个队列的功能入队时,将元素压入s1。出队时,判断s2是否为空,如不为空,则直接弹出顶元素;如为空,则将s1的元素逐个“倒入”s2,把最后一个元素弹出并出队。计算机网络主要考查TCP与UDP,他们如何进行通讯,TCP的三次握手四次挥手如何实现。他们都用到了哪些函数。(笔试面试都考查过)在window系统下,htonl(),htons(),ntohl(),ntohs()都表示什么功能。(笔试考查过)详细说明:TCP用到的函数:创建套接字 socket绑定地址bind设置监听端口listen等待连接accept发送数

21、据send接收数据recv关闭连接close连接服务器connectTCP协议中的三次握手和四次挥手建立TCP需要三次握手才能建立,而断开连接则需要四次握手。首先Client端发送连接请求报文,Server端接受连接后回复ACK报文,并为这次连接分配资源。Client端接收到ACK报文后也向Server端发送ACK报文,并分配资源,这样TCP连接就建立了。-假设客户端发起中断连接请求,也就是发送FIN报文。服务器端收到FIN报文后,意思是说:“我客户端没有数据要发送给你了”,但是如果你还有数据没有发送完成,则不必急着关闭socket,可以继续发送数据。所以你发送ACK,“告诉客户端,你的请求我

22、收到了,但是我还没准备好,请继续你等我的消息”。这个时候客户端进入了FIN_WAIT状态,继续等待服务器端的FIN报文。当客户端确定数据已发送完成,则向客户端发送FIN报文,“告诉客户端,好了,我这边数据发完了,准备好关闭连接了”。客户端收到FIN报文后,“就知道可以关闭连接了,但是他还是不相信网络,怕客户端不知道要关闭,所以,发送ACK后进入TIME_WAIT状态,如果客户端没有收到ACK则可以重传”,客户端收到ACK后,“就知道可以断开连接了”。客户端等待了2msl后依然没有收到回复,则证明服务器端已正常关闭,那好,我客户端也可以关闭连接了。OK,TCP连接就这样关闭了!为什么连接的时候是

23、三次握手,关闭的时候却是四次握手?因为服务器端收到客户端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当服务器端收到FIN报文时,很可能并不会立即关闭socket,所以只能先回复一个ACK报文,告诉客户端,“你发的FIN报文我收到了”。只有等到我服务器端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。在window系统下,htonl(),htons(),ntohl(),ntohs()操作系统linux进程与线程的区别,多进程设计、多线程设计用到了哪些函数。(笔试面试都考查过,内容较多,详细知识点就不列举

24、了)Linux下的GDB调试如何使用,核心转存(Core Dump)主要解决哪类问题?core dump 主要来对付segment fault(段错误)。何为段错误?包括四个原因产生的错误:数组访问越界、访问空指针、栈溢出、修改只读内存。(笔试考查过,面试2家公司都考查过)Linux进程间通讯的主要方式有:无名管道(pipe)、有名管道(FIFO)、信号(signal)、消息队列、共享内存、信号量、套接字(socket)。(笔试多次考查,面试也考过)OSI标准的七层(应用层、表示层、会话层、传输层、网络层、数据链路层、物理层)。(笔试、面试都有考查过,必须背熟)Linux应用程序地址布局在学习

25、Linux应用程序开发时,经常会遇到如下概念:代码段、数据段、BSS段(Block Started by Symbol,又名:未初始化数据段) 、堆(heap)和栈(stack)。而这些部分也是构成Linux应用程序的重要组成部分。从低地址到高地址分别为:代码段、数据段、BSS段、堆、栈堆向高内存地址生长栈向低内存地址生长数据存放1、代码段:代码,全局常量(const)、字符串常量2、数据段:全局变量(初始化以及未初始化)、静态变量(全局的和局部的、初始化的以及未初始化的)3、堆:动态分配的区域4、栈:局部变量(初始化以及未初始化的,但不包含静态变量)、局部只读变量(const)5、BSS段(

26、属于数据段):用来存放程序中未初始化的全局变量和静态变量的一块内存区域。特点是:可读写的,在程序执行之前BSS段会自动清0。所以,未初始的全局变量在程序执行之前已经成0了。操作系统方面的知识点,也是笔试面试重点考查的地方。尤其是面试的时候。其他琐碎知识点MMU的作用(笔试选择填空)1. 将虚拟地址转化为物理地址2. 访问权限管理cache的功能(笔试选择填空)高速缓冲存储器Cache是位于CPU与内存之间的临时存储器,它的容量比内存小但交换速度快。在cache中的数据是内存中的一小部分,但这一小部分是短时间内CPU即将访问的,当CPU调用大量数据时,就可避开内存直接从cache中调用,从而加快

27、读取速度,由此可见,在CPU中加入cache是一种高效的解决方案,这样整个内存储器(cache+内存)就变成了既有cache的高速度,也有内存的大容量的存储系统了。在Arm系统中函数调用的时候,参数是通过哪种方式传递的?(笔试简答题)当参数小于等于4的时候通过r0r3来进行传递的,当参数大于4的时候是通过压栈的方式传递。dup复制文件描述符lseek定位文件fork创建进程。备注:以上知识点基本上都是我笔试面试遇到过的,也有少部分是身边同学遇到过的。有些纯软件的公司会考查到C+与数据库,这类公司招聘的是软件工程师。对于爱好做嵌入式的童鞋可能不太适合,对于我,也不太熟悉数据库与C+,所以知识点未

28、能涉及这方面的内容。对于想去纯软件类、互联网类的公司的童鞋,还需要熟悉数据库。HR面除了对专业课、知识点的考查外。面试的经验也是很重要的。第一次面试的时候,面试很傻,技术面的时候没想着把面试官引向自己熟悉的领域,反而老是暴漏自己的不足之处。二面综合面,面试官老盯着我看,觉得有些尴尬就避免与面试官直视,这种看法是不正确的。应该面带微笑的与面试官进行眼神的交流,盯着面试官看。后来的面试也是这么做的。当面试官问到你项目的事情时,应该滔滔不绝的讲述,多与面试官说项目的事情,毕竟自己做的项目还是比较熟悉的,但是面试官可能并不熟悉你的项目。面试的时候不要过于谦虚。关于HR面,有些问题是常会被问到的,我整理

29、了一下。公司看中的是你的学习能力、自信、团队精神,这是要尽量在面试中体现出来。请介绍一下你自己说明:不要简单的说自己叫什么,哪个学校,哪个专业就完了,太少例:我叫*,今年*岁,就读于安徽大学,集成电路工程专业 嵌入式系统方向,全日制在读研究生。我喜欢写代码,我从大二开始就积极参加各类编程项目中,虽然还没有毕业但是在嵌入式软件方向也算是有4。5年微薄的编程经历了。我对技术有浓厚的兴趣,责任心强,思路清晰,沟通能力好,精通C语言,熟悉linux系统。平常有时间看看博客,并也喜欢在技术论坛上写技术类的文章,与网友一起讨论。谢谢。(最后几句多好,这逼还是要装的。)你未来3-5年的职业规划是怎样的例:我希望从现在开始,1-2年内能够在我目前申请的这个

温馨提示

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

评论

0/150

提交评论