没有合适的资源?快使用搜索试试~ 我知道了~
首页嵌入式软件面试题(PDF版)
资源详情
资源评论
资源推荐

1、int a[10]={1,2,3,4,5,6,7,8,9,0};
int *p=&a[1];
则 p[6]等于 8
2、整数数组清零:bzero(),memset()。
3、sizeof();测试变量所占地址的字节数
4、 main()
{
char *str[]={"ab","cd","ef","gh","ij","kl"};
char *t;
t=(str+4)[-1];
printf("%s",t);
}则显示"gh"
5、小端:低位字节数据存储在低地址
大端:高位字节数据存储在低地址
例如:int a=0x12345678;(a 首地址为 0x2000)
0x2000 0x2001 0x2002 0x2003
0x12 0x34 0x56 0x78 大端格式
6、异步 IO 和同步 IO 区别
如果是同步 IO,当一个 IO 操作执行时,应用程序必须等待,直到此 IO 执行完,相反,异
步 IO 操作在后台运行,
IO 操作和应用程序可以同时运行,提高系统性能,提高 IO 流量; 在同步文件 IO 中,线
程启动一个 IO 操作然后就立即进入等待状态,直到 IO 操作完成后才醒来继续执行,而异
步文件 IO 中,
线程发送一个 IO 请求到内核,然后继续处理其他事情,内核完成 IO 请求后,将会通知线
程 IO 操作完成了。
7、用变量 a 定义
一个整型数 int a;
一个指向整型数的指针 int *a;
一个指向指针的指针,它指向的指针式指向一个整型数 int **a;
一个有 10 个整型数的数组 int a[10];
一个有 10 指针的数组,该指针是指向一个整型数 int *a[10];
一个指向有 10 个整型数数组的指针 int (*a)[10];
一个指向函数的指针,该函数有一个整型数参数并返回一个整型数 int (*a)(int);
一个有 10 个指针的数组,该指针指向一个函数,该函数有一个整型数参数并返回一个整
型 int (*a[10])(int);

8、int foo(void)
{
int i;
char c=0x80;
i=c;
if(i>0)
return 1;
return 2;
}返回值为 2;因为 i=c=-128;如果 c=0x7f,则 i=c=127。
9、a=b*2;a=b/4;a=b%8;a=b/8*8+b%4;a=b*15;效率最高的算法
a=b*2 -> a=b<<1;
a=b/4 -> a=b>>2;
a=b%8 -> a=b&7;
a=b/8*8+b%4 -> a=((b>>3)<<3)+(b&3)
a=b*15 -> a=(b<<4)-b
10、c 关键字
c 的关键字共 32 个
*数据类型关键字(12)
char,short,int,long,float,double,unsigned,signed,union,enum,void,struct
*控制语句关键字(12)
if,else,switch,case,default,for,do,while,break,continue,goto,return
*存储类关键字(5)
auto,extern,register,static,const
*其他关键字(3)
sizeof,typedef,volatile
11、int main(void)
{
unsigned int a = 6;
int b = -20;
char c;
(a+b>6)?(c=1):(c=0);
}则 c=1,但 a+b=-14;如果 a 为 int 类型则 c=0。
原来有符号数和无符号数进行比较运算时(==,<,>,<=,>=),有符号数隐式转换成了无符号
数(即底层的补码不变,但是此数从有符号数变成了无符号数),
比如上面 (a+b)>6 这个比较运算,a+b=-14,-14 的补码为 1111111111110010。此数进行

比较运算时,
被当成了无符号数,它远远大于 6,所以得到上述结果。
12、给定一个整型变量 a,写两段代码,第一个设置 a 的 bit3,第二个清除 a 的 bit,在以
上两个操作中,
要保持其它位不变。
#define BIT3 (0x1<<3)
static int a;
void set_bit3(void)
{
a |= BIT3;
}
void clear_bit3(void)
{
a &= ~BIT3;
}
13、要求设置一绝对地址为 0x67a9 的整型变量的值为 0xaa66。
int *ptr;
ptr = (int *)0x67a9;
*ptr = 0xaa66;(建议用这种)
一个较晦涩的方法是:
*(int * const)(0x67a9) = 0xaa66;
14、中断是嵌入式系统中重要的组成部分,这导致了很多编译开发商提供一种扩展—让标准
C 支持中断。
具代表性的是,产生了一个新的关键字__interrupt。下面的代码就使用了__interrupt 关键
字去定义了一个中断服务子程序(ISR),请评论一下这段代码的。
__interrupt void compute_area (void)
{
double area = PI * radius * radius;
printf(" Area = %f", area);
return area;
}
ISR 不可能有参数和返回值的!
ISR 尽量不要使用浮点数处理程序,浮点数的处理程序一般来说是不可重入的,而且是消
耗大量 CPU 时间的!!

printf 函数一般也是不可重入的,UART 属于低速设备,printf 函数同样面临大量消耗 CPU
时间的问题!
15、评价下面的代码片断:
unsigned int zero = 0;
unsigned int compzero = 0xFFFF;
/*1's complement of zero */
对于一个 int 型不是 16 位的处理器为说,上面的代码是不正确的。应编写如下:
unsigned int compzero = ~0;
16、main()
{
char *ptr;
if ((ptr = (char *)malloc(0)) == NULL)
puts("Got a null pointer");
else
puts("Got a valid pointer");
}
该代码的输出是“Got a valid pointer”。还可以*ptr='a';不出现段错误
17、Typedef 在 C 语言中频繁用以声明一个已经存在的数据类型的同义字。也可以用预处
理器做类似的事。
例如,思考一下下面的例子:
#define dPS struct s *
typedef struct s * tPS;
以上两种情况的意图都是要定义 dPS 和 tPS 作为一个指向结构 s 指针。哪种方法更
好呢?(如果有的话)为什么?
这是一个非常微妙的问题,任何人答对这个问题(正当的原因)是应当被恭喜的。答案
是:typedef 更好。思考下面的例子:
dPS p1,p2;
tPS p3,p4;
第一个扩展为
struct s * p1, p2;
上面的代码定义 p1 为一个指向结构的指,p2 为一个实际的结构,这也许不是你想要

的。第二个例子正确地定义了 p3 和 p4 两个指针。
18、int a = 5, b = 7, c;
c = a+++b;
则 c=12。
19、int main()
{
int j=2;
int i=1;
if(i = 1) j=3;
if(i = 2) j=5;
printf("%d",j);
}
输出为 5;如果再加上 if(i=3)j=6;则输出 6。
20、宏定义是在预编译阶段被处理的。
21、Norflash 与 Nandflash 的区别
(1)、NAND 闪存的容量比较大
(2)、由于 NandFlash 没有挂接在地址总线上,所以如果想用 NandFlash 作为系统的启动
盘,就需要 CPU 具备特殊的功能,
如 s3c2410 在被选择为 NandFlash 启动方式时会在上电时自动读取 NandFlash 的 4k 数据
到地址 0 的 SRAM 中。
(3)、NAND Flash 一般地址线和数据线共用,对读写速度有一定影响。NOR Flash 闪存数
据线和地址线分开,
所以相对而言读写速度快一些。
22、反码:对原码除符号位外的其余各位逐位取反就是反码
补码:负数的补码就是对反码加 1
正数的原码、反码、补码都一样
23、pthread_t tid;
pthread_create(&tid,NULL,pthread_func,NULL);//创建线程
pthread_join(tid,NULL);//等待子线程结束,并回收资源
pthread_detach(tid);//与当前进程分离
pthread_exit(NULL);//退出调用线程
pthread_cancel(tid);//取消线程
pthread_mutex mutex=PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_init(&mutex,NULL);//初始化一个互斥锁
pthread_mutex_lock(&mutex);//对互斥锁上锁
剩余33页未读,继续阅读













安全验证
文档复制为VIP权益,开通VIP直接复制

评论1