查看原文
其他

嵌入式软件工程师经典面试题(二)

1、考察指针

要求设置一绝对地址为 0x67a9的整型变量的值为 0xaa66

  1. int *ptr;

  2. ptr = (int *)0x67a9;

  3. *ptr = 0xaa66;

2、考察中断

中断是嵌入式系统中重要的组成部分,这导致了很多编译开发商提供一种扩展—让标准C支持中断。具代表性的是,产生了一个新的关键字 __interrupt。下面的代码就使用了 __interrupt关键字去定义了一个中断服务子程序 (ISR),请评论一下这段代码的。

  1. __interrupt void compute_area (void)

  2. {

  3.   double area = PI * radius * radius;

  4.   printf(" Area = %f", area);

  5.   return area;

  6. }

【评论】

1、ISR不可能有参数和返回值的!

2、ISR尽量不要使用浮点数处理程序,浮点数的处理程序一般来说是不可重入的,而且是消耗大量CPU时间的!!

3、printf函数一般也是不可重入的,UART属于低速设备,printf函数同样面临大量消耗CPU时间的问题!

3、考察typedef与define

思考一下下面的例子:

  1. #define dPS struct s *

  2. typedef struct s * tPS;

以上两种情况的意图都是要定义 dPS 和 tPS 作为一个指向结构 s 指针。哪种方法更好呢?为什么? 答案是:typedef更好。思考下面的例子:

  1. dPS p1,p2;

  2. tPS p3,p4;

第一个扩展为:

  1. struct s * p1, p2;

上面的代码定义 p1为一个指向结构的指, p2为一个实际的结构,这也许不是你想要的。第二个例子正确地定义了 p3和 p4两个指针。关于define与typedef的区别可查阅往期笔记:【C语言笔记】typedef与define的区别

4、考察带参宏

写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个:

  1. #define MIN(a, b) (a) <= (b) ? (a) : (b)

应注意给各参数加上括号,关于带参宏的笔记可查阅往期笔记:C语言笔记】带参宏(二)

5、考察关键字static的作用

  • static用来修饰局部变量:该局部变量会保存在静态存储区。

  • static用来修饰全局变量:该全局变量只在该模块(该.c文件)内有效。

  • static用来修饰函数:该函数只在该模块内有效。

关于static关键字的具体用法可查看往期笔记:【C语言笔记】static关键字




猜你喜欢

一位大牛的单片机笔记

STM32两种printf函数重定向方法

什么是大小端模式?

【RT-Thread】启动问题

省电子设计竞赛一等奖作品分享(三)




    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存