嵌入式工程师面试小结

目录

  • 前言
  • 题目介绍
    • 1、如何使用define声明一个常数,用以表明1年中有多少秒(忽略闰年问题)
    • 2、static的作用?
    • 3、堆和栈的区别,哪个运行的更快,优缺点是什么?
  • 4、volatile关键字的作用,举例说明
  • 5、进程间同步的方式有哪些
  • 6、I2C和SPI的区别

前言

一些题目虽然简单,甚至是老生常谈的,但是一些细节需要我们注意到,尽量作答完美,因为只有作答完美、考虑全面也才能代表您是真正理解了这个知识点。

题目介绍

1、如何使用define声明一个常数,用以表明1年中有多少秒(忽略闰年问题)

作答:
#define SECOND_PER_YEAR (60 * 60* 24 * 365)(UL)
注意事项
1、常数命名的问题。编写程序时的命名规则,不能随意命名。
2、右边的数值尽量用括号括起来。
3、考虑数据溢出的问题,即UL类型,高速编译器这个常数是个长整型数。
常量加括号的重要性,用个栗子重点说明下:

#define ADD1 a+b
#define ADD2 (a+b)
void main()
{
int a=10;
int b=20;
// 你想计算(10+20)*3
int c, d;
c = ADD1*3;
d = ADD2*3;
}
/*经过宏替换,就变成了下面的样子:
c = a+b*3;
d = (a+b)*3;
c的结果就是错误的。*/

2、static的作用?

这个回答要类似八股文一样,一定要把点全部回答上,而且要有条理。
static修饰无非是变量和函数,因此从以下三点做出它的作用总结。
1、static 全局变量和普通全局变量的区别
全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。
 全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。
  这两者的区别在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。
2、static局部变量和普通局部变量的区别?
把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。
static局部变量只被初始化一次,下一次依据上一次结果值
3、static函数和普通函数的区别
static函数与普通函数作用域不同,仅在本文件有作用。

3、堆和栈的区别,哪个运行的更快,优缺点是什么?

1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其
操作方式类似于数据结构中的栈。
2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS
回收。
申请方式的区别:
stack: 由系统自动分配。
heap: 需要程序员自己申请,并指明大小,在c中malloc函数
申请效率的区别:
栈由系统自动分配,速度较快。
堆的一般速度比较慢,容易产生内存碎片。
存储内容的区别:
stack: 局部变量、函数参数、函数运行指令。
heap: 具体内容由程序员安排。
存取效率的比较:
访问栈上的内容比访问堆上的内容要快。
使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就
走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自
由度小。
使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由
度大。

4、volatile关键字的作用,举例说明

编译器在编译程序时会进行优化,如果在变量前增加volatile进行限定,那么编译器就不会对该变量进行优化,每次是使用变量时,都必须直接读取该变量的内存单元。
使用场景:
1、被多个进程共享的变量。
2、硬件寄存器。
3、操作系统中使用的变量。
补充:volatile的考法:

int Function(volatile int* pa)
{
	return *pa * *pa;
}
这道题自己当时是这样作答的:
答:这个函数的目的是返回pa^2,应该将volatile的修饰符去掉。
面试官点评:函数的目的解析是正确的。他考虑的是函数目的是想得到当时程序运行环境中得到某个寄存器的值的平方,因此用volatile修饰这个入口参数,然后将这个值求平方,因此正确的做法应该是定义一个临时变量,让这个变量等于这个入口参数,然后再根据这个临时变量求取结果。

5、进程间同步的方式有哪些

使用volatile定义变量,当做flag供进程间同步使用。

6、I2C和SPI的区别

1、通信速率:
SPI>I2C>UART
2、硬件接线
SPI:4线总线 MISO MOSI SCLK CS 数据输入和输出线独立,允许同时完成数据的输入和输出。
I2C:2线总线
相同点:
都是串行通信方式,系统对通信传输的速率要求不高,相对应的是并行的通信方式,传输速度快。

特点:
SPI支持多主模式

你可能感兴趣的:(职业规划,嵌入式面试题)