嵌入式面试经典100题
嵌入式经典面解析及探讨
一、基础部分考察
问题一:预处理指令的使用
要求:使用预处理指令define声明一个常数,表示一年中有多少秒(忽略闰年问题)。
答案:
```c
define SECONDS_PER_YEAR (60 60 24 365)UL
```
考点:
1. `define`语法的基本知识,如不能以分号结束,括号的使用等。
2. 了解预处理器会计算常数表达式的值,因此直接写出计算结果而不是实际值,这样更清晰且无代价。
3. 意识到表达式可能使16位机的整型数溢出,因此使用长整型符号L来表示这是一个长整型数。
问题二:宏MIN的实现
要求:写一个"标准"宏MIN,该宏接受两个参数并返回较小的一个。
答案:
```c
define MIN(A,B) ((A)
```
考点:
1. `define`在宏中的应用。
2. 三元条件操作符的使用,该操作符在C语言中用于生成比IF-then-else更优的代码。
3. 在宏中小心地将参数用括号括起来的重要性。
二、进阶问题探讨
问题三:预处理器标识error的作用。
答案:编译程序时,遇到error会跳出一个编译错误,其目的是保证程序按照预期进行编译。例如,在不确定是否定义了某个宏(如XXX)时,可以使用error进行编译错误检查。
问题四:死循环的C语言编写方式。
答案:首选方案为使用while循环:
```c
while(1) {
// 循环体
```
或者for循环:
```c
for(;;){
// 循环体
```
还有一些其他方案如使用goto进行循环跳转等。但这些方案不是首选,并且可能会出应试者对C语言循环结构的不熟悉。
问题五:变量类型的定义。
答案:根据题目要求定义了不同类型的变量,如整型数、指针、指针的指针等。这些定义展示了应试者对C语言中数据类型和变量声明的基本理解。
问题六:代码片段输出及原理分析。
答案及考点:代码输出"> 6",因为C语言中的整数自动转换原则,当存在无符号类型和有符号类型操作数时,所有操作数都会自动转换为无符号类型。-20变成了一个非常大的正整数,所以表达式的计算结果大于6。这个问题考察了应试者对C语言中整数自动转换原则的理解。
问题七:代码片段的评价及处理器字节的重要性。
答案及考点:代码片段展示了在嵌入式系统中对处理器字节的重要性的理解。对于一个int型不是16位的处理器来说,原来的代码可能不正确。正确的代码应该使用~0来获得一个全1的补码,从而表示无符号整型的最大值。这揭露出了应试者是否懂得处理器的字节细节及其局限。优秀的嵌入式程序员会非常准确地理解硬件的细节和它的局限。
三、总结及探讨
本次面旨在全面考察应试者的嵌入式系统开发基础知识和C语言编程能力,以及他们对于硬件细节的理解和把握能力。嵌入式系统开发不仅需要扎实的编程基础,还需要对硬件有深入的理解和把握。希望每一位应试者都能通过这些问题对自己的知识和能力有更深入的了解和提升。