嵌入式经典面试题
来源:互联网 发布:非关系型数据库 编辑:程序博客网 时间: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后,会得到一个合法的指针。
- 嵌入式经典面试题
- 经典嵌入式面试题
- 嵌入式经典面试题
- 嵌入式经典面试题
- 嵌入式经典面试题
- 嵌入式经典面试题
- 嵌入式面试题-经典
- 嵌入式经典面试题
- 嵌入式经典面试题
- 嵌入式经典面试题
- 嵌入式经典面试题
- 嵌入式经典面试题
- 嵌入式经典面试题
- 嵌入式经典面试题
- 嵌入式经典面试题
- 嵌入式经典面试题
- 嵌入式经典面试题
- 嵌入式经典面试题
- iOS开发-UIButton
- QTP 加载函数库,实现调用与定义分离
- 连接字符串时是使用 "+" 号还是使用StringBuilder
- xsd概述
- c++ virtual总结
- 嵌入式经典面试题
- POJ-2728 Desert King 01参数规划-最优比率生成树
- dfxhfghfhgfd
- 基于eclipse的ftp插件安装
- 数据结构和算法设计专题之---八大内部排序
- 机会只看到房价多少了罚款时间到了数字机顶盒
- POJ The Triangle
- 通过扩展 CWebUser 增加信息到 Yii::app()->user
- mysql修改root密码