嵌入式面试题2

时间:2021-09-06 11:57:20
1.用指令#define 声明一个常数,用于表明1年中用多少秒(忽略闰年问题)
答:#define SECOND_PER_YEAR  (60*60*24*365)UL
2.写一个标准的宏MIN,这个宏输入两个参数,并返回较小的一个
答:#define MIN(a,b) ((a) > (b) ? (a) : (b))
3.嵌入式系统中经常用到的无限循环,用C写死循环
while(1)
{

}

4.数据声明,用变量a给出下面的定义
1)一个整型数
int a;
2)一个指向整型数的指针
int *a;
3)一个指向指针的指针,它指向的指针是指向一个整形数
int **a;
4)一个有10个整形数的数组
int a[10];
5)一个有10个指针的数组,该指针是指向一个整形数的
int *a[10];
6)一个指向有10个整形数组的指针
int (*a)[10];
7)一个指向函数的指针,该函数有一个整形参数并返回一个整形数
int (*a)(int);
8)一个有10个指针的数组,该指针指向一个函数,该函数有一个整形参数并返回一个整形数
int (*a[10])(int);

5.关键字static的作用
答:1)在函数体,一个被声明为静态的变量在这一函数被调用的过程中维持其值不变
int fun()
{
	static int a = 5;//在5的基础上累加
	a ++;
	return a;
}
2)在模块内(但在函数体外)一个被声明为静态的变量可以被模块内所有函数访问但不能被模块外的
其它函数访问。
3)在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用

6.关键字const有什么含意 
答:const可以保护不希望被改变的变量参数
const int a;
a是一个常整形(把类型去掉,保护最近的那个)
const int *a;(*a不可修改,a可以修改)a是一个指向常整形的指针
int *const a; (a不可修改,*a可以修改) a是一个指向整形的常指针
int const *a const;(*a和a都不可以修改)a是一个指向常整形的常指针

7.关键字volatile有什么含意,并给出三个不同的例子
答:防止变量被优化,优化器在处理被volatile修饰的变量时,会重新
读取这个变量的值,而不是使用保存在寄存器里的备份(可能被意想不到的改变)
1)并行设备的硬件寄存器(状态寄存器)
2)一个中断服务子程序中会访问到的非自动变量
3)多线程应用中被几个任务共享的变量

8.一个参数可以是const还可以是volatile吗
答:可以,只读状态寄存器,它是volatile因为它可能被意想不到地改变,
它是const因为程序不应该试图去修改它

9. int square(volatile int *ptr)
{
	return *ptr * *ptr;
}函数有什么错误
答:*ptr的值可能被意想不到的改变,返回值不是期望的平方值
改:
long square(volatile int *ptr)
{
	int a;
	a = *ptr;
	return a * a;
}

10. 位操作
给定一个整形变量a,写两片代码,第一个设置a的bit 3,第二个清除a的 bit 3
在以上两个操作中,要保持其它位不变
答:#define BIT3 (0x1 << 3)
	static int a;
	void set_bit3(void)
	{
		 a | = BIT3;
	}
	
	void clear_bit3(void)
	{
		a &= ~BIT3;
	}
	
11.访问固定的内存位置
嵌入式系统经常要求程序员去访问特定的内存位置的点,要求设置一绝对地址为0x6780的整型
变量的值为0x5566
答: int *p;
	p = (int *)0x6780;
	*p = 0x5566;
	(访问绝对地址把一个整型,强制转换成一个指针是合法的)

12.中断服务程序ISR(请评论)

__interrupt double compute_area(doble radius)
{
	double area = PI*radius*radius;
	printf("\n AREA = %f", area);
	return area;
}
答:1)ISR不能返回值
	2)ISR不能传递参数
	3)有些编译器不允许在ISR中做浮点运算
	4)printf有重入性问题
13. 下面代码输出什么?为什么?
void foo(void)
{
	unsigned int a = 6;
	int b = -20;
	(a+b > 6) ? puts("> 6") : puts("<=6");
}
答:输出>6,因为表达式中有符号和无符号类型时,所有操作
数都自动转换为无符号型

14.评价下面的代码
unsigned int zero = 0;
unsigned int compzero = 0xFFFF;
答:对一个int 型不是16位的处理器不正确
unsigned int compzero = ~0;