揭开嵌入式c面试题背后的玄机
今天老大让我针对一个面试者出些嵌入式方面的面试题,主要是想对他的技术深度进一步了解。我就出了下面这些问题,每个问题背后都是考察一个嵌入式程序员应该具备的相关技能。当然这些只是我的个人理解,不一定正确。在此与大家分享,只是希朋友们能够得到一点点启发:如何抓住每一个契机展现你的与众不同?同样的技术问题,很多人可能都能够回答得对,但有些人只是知其然而不知所以然。其实面试官每一个问题背后通常都隐藏着一个考察点。如果我们能够透过问题看到背后的实质,在回答出答案的时候还能够借机发挥,我相信90和100分的差别就出来了。哪个面试官不喜欢招一个喜欢思考、能透过现象看本质的员工呢~
下面我们来看看嵌入式C面试题背后到底藏何玄机~。以下仅是个人的一些想法,欢迎大家讨论,拍砖的轻点~~
////////////////////////////
1、 int a=2,b=11,c=a+b++/a++; 则c值为多少?
【考点】编码规范。
表面上考察你对运算符优先级的掌握程度,但实际上优先级这些玩意很难死记硬背得住?大家的疑惑不就是运算符的结合顺序么?那么如何去避免呢?c=a+((b++)/(a++))不就行了么,其实问题背后考察的是你的编码规范,如何写清晰易懂的代码,如何在一个团队中让自己的代码狠容易毫无偏差的让新人看懂~
2、 Static用在全局变量定义和函数内部局部变量定义有何区别?
【考点】编码规范及模块化设计。
Static变量的两个属性涉及存储位置及可见域。在大型的程序设计中static全局变量可以有效的避免名字空间的重复及无意的变量引用,这样可以有效的提高程序设计的安全性,同时也利用模块化作业
3、 在程序设计中哪些地方需要使用define?如何用define来定义一年内有多少小时的常量?
【考点】可移植性。
嵌入式程序设计的特点就是软硬件平台可变性,有效利用define常量可以提高程序的可移植性,这样改动方便,不易出错
4、 Define宏语句和inline函数有什么区别?
【考点】时空效率及宏的副作用。
嵌入式系统平台通常存储资源有限,但同时又对实时性有一定的要求,二者如何权衡需要考虑。Define宏语句相对于函数调用能提高运行时间性能,但消耗了空间,并且不标准的宏语句定义在不标准的编码中更容易出现副作用,因此inline函数则是define语句的完美替代品。小资金干大事正是嵌入式的终极目标!
5、 哪些地方可以用到const?const变量和函数输入参数用const修饰有哪些作用?
【考点】程序设计可靠性。
Const只读变量可以有效克服define常量的一些弊端,如无类型安全检查。Const形参可以有效避免程序内部更改无意的更改。人非圣贤孰能无误,所以我们要将这些可能的失误统统交给智能的编译器,这样就可以将错误扼杀在摇篮中
6、 Int,short,char在32位平台下各占几个字节?一个结构体含有int、short、char变量各一个,结构体占据的总内存空间多少?
【考点】跨平台移植。
嵌入式并非x86,其硬件平台具备很大的差异性,同为int在不同的架构体系下可能占据的字节数是不一样的。不同的平台也有不同的编译器,其在变量对齐方面可能有不同的特性。因此在结构体定义时如何设计成员变量的顺序以有效减少占据的内存空间,以及如何填充特定字段保证访问对齐问题,都是嵌入式系统结构体设计时应该考虑的跨平台可移植性问题
7、 如何将unsigned int明确定义为一个32位类型?define和typedef有何区别?
【考点】跨平台移植。
define和typedef都可以实现变量类型重定义,但是typedef类型的指针变量可以有效去除变量定义的二义性。在嵌入式的工程项目中,通常为了保证数据类型的统一且便于跨平台移植时修改数据类型方便,通常都会单独定义一个数据类型的头文件,把所有用到的数据类型typedef成所熟悉的形式
8、 有没有用过volatile?有哪些典型的适用场合?
【考点】编译优化的副作用。
通常为了提高程序运行的效率,编译器会自动进行一些优化,如将变量放在寄存器中,以减少存储器访问次数,在数据长期未变时不重新读取内存等等。但是优化有时会带来问题,如硬件寄存器、多任务共享变量、中断和主程序共享变量,优化有可能带来数据访问不一致性的问题,因此对于这些个别变量,我们需要用volatile声明告诉编译器取消优化
9、 参数传递有哪些形式?寄存器和堆栈传递各有什么优缺点?
【考点】编译优化、调用性能、接口设计。
每种体系结构及对应的编译器对参数传递都有自己的规定。参数传递并非总是通过堆栈进行的,参数入栈出栈是需要耗费时间的,编译器总是尽量优化利用寄存器来传递参数,因为寄存器的访问效率要高,但当参数过多时,将放弃优化从而用栈传递参数。因此为了提高调用性能,应尽量减少参数个数,太多时可以将所有参数重新定义为一个结构体,利用结构体指针来传递参数。在函数接口设计时应考虑硬件平台和编译器的特性,以灵活定义参数形式
10、 中断服务程序设计应注意的问题?中断触发方式的选择?中断处理太长怎么办?中断处理程序如何与主应用程序交互?
【考点】中断服务程序设计。
嵌入式程序最大的特点是经常需要和硬件打交道,中断是接收外界输入的典型方式,通常都决定了系统运行流程,因此如何高效不丢失的处理中断是每个嵌入式程序员应考虑的问题
11、 TCP/IP和OSI七层模型是如何划分的?各层的功能,这么设计有什么好处?
【考点】层次化软件设计保证可移植性。
分层模型最大的好处就是某一层变化了,只要其提供上层的接口未变,那么上层就无需做任何改动。因此只需要更改本层的实现即可。嵌入式平台因为软硬件多变性,为了最大限度的利用先前的成果,软件设计一定要遵循这种层次化模型,这样才能保证其可移植性
12、 TCP和UDP的区别?各种网络互连设备都用在哪一层?如何建立链接?如何进行拥塞控制?
【考点】协议设计可靠性及缓冲区设计管理。
TCP和UDP的最大区别在于可靠性,TCP通过三次握手协议及超时机制安全可靠的建立或者释放连接。协议设计最大的问题就是如何保证效率合可靠性,TCP的设计为我们提供了一个参考。而滑动窗口机制可以有效的进行拥塞控制,但窗口大小的设计则关系到内存利用率及缓冲效率可靠性等问题。在嵌入式的驱动程序设计中,经常会开辟缓冲区来进行流量控制及防止数据覆盖,缓冲区的大小设计则需要更加具体的应用情况设计才能保证可靠性合灵活性
揭开嵌入式c面试题背后的玄机的更多相关文章
- C/C++嵌入式开发面试题
C/C++嵌入式开发面试题 预处理器(Preprocessor) 1. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题) #define SECONDS_PER_YEA ...
- 嵌入式Linux C笔试题积累(转)
http://blog.csdn.net/h_armony/article/details/6764811 1. 嵌入式系统中断服务子程序(ISR) 中断是嵌入式系统中重要的组成部分,这导致了很 ...
- 3java面试题 传智 发的 有用
第一章内容介绍 20 第二章JavaSE基础 21 一.Java面向对象 21 1. 面向对象都有哪些特性以及你对这些特性的理解 21 2. 访问权限修饰符public.private.protect ...
- java170道面试题汇总+详细解析
2013年年底的时候,我看到了网上流传的一个叫做<Java面试题大全>的东西,认真的阅读了以后发现里面的很多题目是重复且没有价值的题目,还有不少的参考答案也是错误的,于是我花了半个月时间对 ...
- java面试题(一)
1.面向对象的特征有哪些方面? - 1 - 2.访问修饰符public,private,protected,以及不写(默认)时的区别? - 1 - 3.String 是最基本的数据类型吗? - 1 - ...
- 收集了50道基础的java面试题
下面的内容是对网上原有的Java面试题集及答案进行了全面修订之后给出的负责任的题目和答案,原来的题目中有很多重复题目和无价值的题目,还有不少的参考答案也是错误的,修改后的Java面试题集参照了JDK最 ...
- 转:Java面试题集(1-50)
Java程序员面试题集(1-50) http://blog.csdn.net/jackfrued/article/details/17403101 一.Java基础部分 1.面向对象的特征有哪些方面? ...
- 2017年 Java 程序员,风光背后的危机
不得不承认,经历过行业的飞速发展期,互联网的整体发展趋于平稳.为什么这么说?为什么要放在 Java 程序员的盘点下说? 的确,对于进可攻前端,后可守后端大本营的 Java 程序员而言,虽然供应逐年上涨 ...
- Day09 -超级经典面试题:Ruby的a ||= b(or-equals)是什么意思呢?
前情提要: 写了这一系列下来,发现Ruby有许多特别的方法.前几天提到String字串,并且接续着在第八天我们了解串接(concatenate)与插入interpolation#{}方法(就连加号+也 ...
随机推荐
- WPF读书笔记 x名称空间详解(第二天)
每天看一点,每天进步一点. x名称空间映射的是http://schemas.microsoft.com/winfx/2006/xaml,它包含的类均与解析XAML语言关,亦可称为"XAML名 ...
- canvas使用注意点
1.canvas中文教程https://developer.mozilla.org/zh-CN/docs/Canvas_tutorial 2.canvas默认宽高是300.150,为避免异常,最好使用 ...
- 一步步学习NHibernate(1)——NHibernate介绍
请注明转载地址:http://www.cnblogs.com/arhat 第十五章 从本章开始,老魏将给大家一起学习NHibernate这个流行的ORM框架,本来老魏想要和大家一起探讨微软的EF框架的 ...
- leetcode-173:Binary Search Tree Iterator(Java)
Binary Search Tree Iterator Implement an iterator over a binary search tree (BST). Your iterator wil ...
- jQuery name checked 模糊查找匹配ID
("div[name='jobTitle']") $("#aDiv").find("input[type='checkbox']:checked&qu ...
- sjtu1333 函数时代
Description Taring说:生活的过程就是执行函数的过程.需要命令,也需要回报.更重要的,是得到回报的过程. 好吧...这道题其实和上面的也没啥关系TAT,我们要求的是下面的问题: 给定\ ...
- Python中文全攻略
原文链接:http://blog.csdn.net/mayflowers/archive/2007/04/18/1568852.aspx 1. 在Python中使用中文 在Python中 ...
- ORMBase对象/关系型数据库映射在MVC中的应用(二)
3.DataBase基类,查询方法返回值是List<T>,并且是分页的,ThePart.dll版本2.0中封装了一个PageInfo类,作为分页的类型.这种方法很机械,也很狗血..建议大家 ...
- POJ2222+暴力搜索
一共2^15个状态 比较简单 /* 2^15 states */ #include<stdio.h> #include<string.h> #include<stdlib ...
- ffmpeg编译 --enable :没有命令
参照官方推荐的编译:http://www.roman10.net/how-to-build-ffmpeg-with-ndk-r9/ build_config.sh总是不过, 问题原因:./config ...