首页 > 其他 > 详细

嵌入式软件工程师面试题01

时间:2020-08-18 16:18:04      阅读:106      评论:0      收藏:0      [点我收藏+]

1.预处理命令#define

  #define SECONDS_PER_YEAR  (60*60*24*365)UL

  (因为数值超过65535,产生溢出,因此需要用到长整型,而且不会是负数,所以使用无符号整型UL)

2.死循环的方案(3种)

  a:while(1){循环体}

  b:for(;;){循环体}

  c:Loop:循环体 goto Loop

3.变量定义

  a:一个整型  

  b:一个指向整型的指针

  c:一个指向指针的指针

  d:一个指向10个整型数的数组

  e:一个指向有10个整型指针的数组

  f:一个指向有10个整型数数组的指针

  g:一个指向函数的指针,该函数有一个整型参数并返回一个整型数

  h:一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数

  答案:

技术分享图片
1 a) int a; 
2 b) int *a; 
3 c) int **a; 
4 d) int a[10]; 
5 e) int *a[10]; 
6 f) int (*a)[10]; 
7 g) int (*a)(int);
8 h) int (*a[10])(int); 
View Code

4.关键字static的三个明显作用

  a:在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。

  b:在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。

  c:在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。

5.关键字const的含义:意味着该变量是一个“只读”变量,别说是常数

  a:Const int a;            a是一个常整型数

  b:int const a;          a是一个常整型数

  c:const int *a;              a是一个指向常整型数的指针(整型数是不可修改的,但指针可以)

  d:int * const a;             a是一个指向整型数的常指针(指针指向的整型数是可以修改的,但指针是不可修改的)

  e:int const * a const;        a是一个指向常整型数的常指针(指针指向的整型数是不可修改的,同时指针也是不可修改的)

6.关键字volatile

  一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份

  volatile变量的几个例子:
    1). 并行设备的硬件寄存器(如:状态寄存器)
    2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)
    3). 多线程应用中被几个任务共享的变量

  一个参数既可以是const还可以是volatile,一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它

7.对变量或者对寄存器进行位操作

  写两段代码:第一段代码进行置位操作:(寄存器)的bit3,第二段代码进行清位操作:(寄存器)的bit3 

技术分享图片
 1 #define BIT3 (0x1<<3) 
 2 static int a; 
 3 void set_bit3(void) 
 4 { 
 5     a |= BIT3; 
 6 } 
 7 void clear_bit3(void) 
 8 { 
 9     a &= ~BIT3; 
10 } 
View Code

 8.设置一绝对地址为0x67a9的整型变量的值为0xaa66,编译器是一个纯粹的ANSI编译器

技术分享图片
1 int *ptr; 
2 ptr = (int *)0x67a9; 
3 *ptr = 0xaa55;
View Code

9.关键字_interrupt

  中断是嵌入式系统中重要的组成部分,ISP(中断服务子程序)  注意点:

  a:ISR 不能返回一个值

  b:ISR 不能传递参数

  c:在许多的处理器/编译器中,浮点一般都是不可重入的,ISR应该是短而有效率的,在ISR中做浮点运算是不明智的。

  d:与第三点一脉相承,printf()经常有重入和性能上的问题

10.C语言中的整数自动转换原则

  当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型

技术分享图片
1 Void foo(void) 
2 { 
3     unsigned int a = 6; 
4     int b = -20; 
5     (a+b > 6) puts("> 6") : puts("<= 6"); 
6 }
View Code

11.注意

技术分享图片
1 unsigned int zero = 0; 
2 unsigned int compzero = 0xFFFF; 
3 /*1‘s complement of zero */
4 
5       对于一个int型不是16位的处理器为说,上面的代码是不正确的。应编写如下:
6 
7 unsigned int compzero = ~0;
View Code

12.分析

技术分享图片
1 Char *ptr;
2 if ((ptr = (char *)malloc(0)) == NULL)
3 puts(“Got a null pointer”);
4 else
5 puts(“Got a valid pointer”);
6 
7 代码的输出是“Got a valid pointer
View Code

13.typedef和define在C语言中频繁用以声明一个已经存在的数据类型的同义字(别名)

假设目的要定义dPS 和 tPS 都是一个指向结构s指针

技术分享图片
1 #define dPS struct s * 
2 typedef struct s * tPS;
3 
4 dPS p1,p2; 
5 tPS p3,p4;
6 
7 第一个扩展为:
8 struct s * p1, p2;
View Code

上面的代码定义p1为一个指向结构的指针,p2为一个实际的结构,显然错误了。第二个例子正确地定义了p3 和p4 两个指针。

14.编程风格问题

技术分享图片
1 Int a = 5, b = 7, c; 
2 c = a+++b;
View Code

实际为:c = a++ + b

程序运行后结果为:a = 6、b = 7、c = 12

嵌入式软件工程师面试题01

原文:https://www.cnblogs.com/ksht-wdyx/p/13523207.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!