嵌入式经典面试题

来源:互联网 发布:非关系型数据库 编辑:程序博客网 时间:2024/05/22 06:46

1、用预处理指令来声明一个常数,用以表名1年中有多少秒(忽略闰年问题)

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

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

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

但是该宏有副作用如     least = MIN(*p++,       b);

3、嵌入式系统中经常用到无线循环,常见的死循环有

(1)、while (1)  {

}

(2)、for ( ; ; ){

}

(3)、

loop:


goto   loop;

4、用变量p给出下面定义

(1)、一个有10个指针的数组,该指针是指向一个整型数的。

int        *p[10];

(2)、一个指向有10个整型数 数组的指针。

int      (*p)[10];

(3)、一个指向函数的指针,该函数有一个整型参数并返回一个整型数。

int      (*p) (int);

(4)、一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数。

int     (*a[10]) (int);

5、c语言中关键字static的作用是什么?

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

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

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

6、关键字const有什么含义?

(1)、const意味着只读,增强代码的可读性。

(2)、产生更紧凑的代码。

(3)、保护那些不希望被改变的参数。

(4)、说说下面声明是什么意思?

const      int   a;

int       const  a;

以上两个声明的作业是一样的,a是一个常整型数。

const    int     *a;

表示指针a是一个指向常整型数的指针,也就是,整型数是不可修改的,但指针可以。

int     *  const    a;

表示指针a是一个指向整型数的常指针,也就是,指针指向的整型数是可以修改,但指针是不可修改的。

int    const    *a     const;

表示指针a是一个指向常整型数的常指针,也就是,指针指向的整型数是不可修改的,同时指针也是不可修改的。

7、关键字volatile有什么含义?

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

(1)、并行设备的硬件寄存器(如:状态寄存器)。

(2)、一个中断服务子程序中会访问到的非自动变量。

(3)、多线程应用中被几个任务共享的变量。

8、一个参数既可以是const还可以是volatile吗?为什么?

是的,只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。

9、一个指针可以是volatile吗?为什么?

是的,当一个中断服务子程序修改一个指向一个buffer的指针时。

10、修改下面代码

int       square(volatile    int    *ptr)

{

return    *ptr   *      *prt;

}

正确代码是:

long      square(volatile    int     *ptr)

{

int     a;

a    =   *ptr;

return  a  *   a;

}

11、嵌入式系统总是用户变量或寄存器进行位操作。给定一个整型变量a,写两段代码,

第一个设置a的bit3,第二个清楚a的bit3。在以上两个操作中,要保存其它为不变。

#define      BIT3     (0x1     <<     3)

static       int         a;

void      set_bit3(void)

{

a    |=      BIT3;

}

void    clear_bit3(void)

{

a      &=     ~BIT3;

}

12、嵌入式系统经常具有要求程序员去访问某特定的内存位置的特点。

在某工程中,要求设置一绝对地址为0x67a9的整型变量的值位0xaa66。

编译器是一个纯粹的ANSI编译器。写代码去完成这一任务。

int      *ptr;

ptr  =   (int    *)0x67a9;

*ptr   =   0xaa55;

当然也可以一条语句完成,但不方便阅读如下

*(int    * const )(0x67a9) = 0xaa55;

13、中断是嵌入式系统中重要的组成部分,这导致了很多编译开发商提供一种扩展一让标志C支持中断。

具代表事实是,产生了一个新的关键字 __interrupt。

下面的代码就使用了 __interrupt关键字去定义了一个中断服务子程序(ISR)。指出下列代码的不足。

__interrupt       double    compute_area(double    radius)

{

double   area  =  PI *radius  *radius;

printf(" \n area  =  %f  \n",  area);

return    area;

}

(1)、中断服务子程序(ISR)不能返回一个值。

(2)、在许多的处理器/编译器中,浮点一般都是不可重入的。有些处理器/编译器需要让额外的寄存器入栈,

有些处理器/编译器就是不允许在ISR中做浮点运算。此外,ISR应该是短而有效率的,在ISR中做浮点运算是不明智的。

(3)、ISR不能传递参数。

(4)、printf()函数经常有重入和性能上的问题。

14、下面代码的输出结果是什么,Why?

void      function(void)

{

unsigned     int    a  = 6;

int         b      =  -20;

(a  +  b  >  6)   ?   puts(" > 6")   :  puts(" <=  6");

}

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

输出答案是      > 6

15、指出下列代码不足,并改正。

unsigned      int     zero   =  0;

unsigned     int     compzero   =   0xFFFF;

对于一个int型不是16位的处理器来说,上面代码是正确的。但是32位呢?

因此,应该把第二条语句改为如下:

unsigned     int       compzero    =     ~0;

16、下面代码片段输出什么?Why?

char     *ptr;

if   ( (ptr  =  (char  *)malloc(0))  ==  NULL) 

{

puts(" Got   a   null  pointer");

}

else

{

puts(" Got  a  valid  pointer");

}


输出结果是:Got  a   valid  pointer

执行malloc后,会得到一个合法的指针。

0 0
原创粉丝点击