嵌入式软件工程师经典面试题(二)
1、考察指针
要求设置一绝对地址为 0x67a9
的整型变量的值为 0xaa66
int *ptr;
ptr = (int *)0x67a9;
*ptr = 0xaa66;
2、考察中断
中断是嵌入式系统中重要的组成部分,这导致了很多编译开发商提供一种扩展—让标准C支持中断。具代表性的是,产生了一个新的关键字 __interrupt
。下面的代码就使用了 __interrupt
关键字去定义了一个中断服务子程序 (ISR)
,请评论一下这段代码的。
__interrupt void compute_area (void)
{
double area = PI * radius * radius;
printf(" Area = %f", area);
return area;
}
【评论】
1、ISR不可能有参数和返回值的!
2、ISR尽量不要使用浮点数处理程序,浮点数的处理程序一般来说是不可重入的,而且是消耗大量CPU时间的!!
3、printf函数一般也是不可重入的,UART属于低速设备,printf函数同样面临大量消耗CPU时间的问题!
3、考察typedef与define
思考一下下面的例子:
#define dPS struct s *
typedef struct s * tPS;
以上两种情况的意图都是要定义 dPS
和 tPS
作为一个指向结构 s
指针。哪种方法更好呢?为什么? 答案是:typedef更好。思考下面的例子:
dPS p1,p2;
tPS p3,p4;
第一个扩展为:
struct s * p1, p2;
上面的代码定义 p1
为一个指向结构的指, p2
为一个实际的结构,这也许不是你想要的。第二个例子正确地定义了 p3
和 p4
两个指针。关于define与typedef的区别可查阅往期笔记:【C语言笔记】typedef与define的区别
4、考察带参宏
写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个:
#define MIN(a, b) (a) <= (b) ? (a) : (b)
应注意给各参数加上括号,关于带参宏的笔记可查阅往期笔记:【C语言笔记】带参宏(二)
5、考察关键字static的作用
static用来修饰局部变量:该局部变量会保存在静态存储区。
static用来修饰全局变量:该全局变量只在该模块(该.c文件)内有效。
static用来修饰函数:该函数只在该模块内有效。
关于static关键字的具体用法可查看往期笔记:【C语言笔记】static关键字
猜你喜欢