更多课程 选择中心

嵌入式培训
达内IT学院

400-996-5531

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

  • 发布:嵌入式培训
  • 来源:嵌入式ARM
  • 时间:2019-01-08 16:39

今天为大家分享的是嵌入式软件工程师面试题一,有30道题目,希望大家可以认真看看、认真思考、认真做一下,因为要成为一名正式的嵌入式软件工程师,面试是你必须要跨过的门槛。

嵌入式软件工程师面试题

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);//对互斥锁上锁

pthread_mutex_unlock(&mutex);//对互斥锁解锁

sem_t sem;

sem_init(&sem,0,1);//创建信号量并初始化它的值

sem_wait(&sem);//信号量的值减1

sem_post(&sem);//信号量的值加1

24、内存管理MMU的作用

*内存分配和回收

*内存保护

*内存扩充

*地址映射

25、ROM是只读存储器,掉电不丢失

RAM是读写存储器,掉电丢失

26、SRAM:CPU的缓存就是SRAM,静态的随机存取存储器,加电情况下,不需要刷新,数据不会丢失

DRAM,动态随机存取存储器最为常见的系统内存,需要不断刷新,才能保存数据

SDRAM:同步动态随机存储器,即数据的读取需要时钟来同步。

27、signed char 的取值范围-128~127.

28、编译和链接有什么不同?(如外部符号的处理)

编译生成的是目标文件(object *.o);

编译过程中对于外部符号不做任何解释和处理。外部符号对应的就是“符号”

链接生成的是可执行程序

链接将会解释和处理外部符号。外部符号对应的是地址

29、已知strcpy函数的函数原型是:

char *strcpy(char *strDest, const char *strSrc)。其中,strDest是目的字符串,strSrc是源字符串。

不调用C++/C的字符串库函数,请编写函数

strcpy

char *strcpy(char *strDest, const char *strSrc)

{

int i=0;

if(!(strDest && strSrc))

return;

while(strDest[i++] = *strSrc++);

return strDest;

}

30、strcpy能把strSrc的内容复制到strDest,为什么还要char *类型的返回值?

为了实现链式表达式

int len = strlen(strcpy(strDest, strSrc))

以上就是今天达内嵌入式培训分享给大家的30道嵌入式软件工程师面试题,你做的怎么样呢?明天将继续为大家分享嵌入式软件工程师面试题二,敬请期待!

免责声明:内容和图片源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

预约申请免费试听课

填写下面表单即可预约申请免费试听!怕钱不够?可就业挣钱后再付学费! 怕学不会?助教全程陪读,随时解惑!担心就业?一地学习,可全国推荐就业!

上一篇:嵌入式Linux面试题3道,助你过关斩将!
下一篇:嵌入式面试题二十道,有解析哦!

想要在金九银十找到嵌入式相关的工作?先看这三关你能过吗?

嵌入式系统测试题其实很简单,不信你来做做看!

嵌入式Linux面试题3道,助你过关斩将!

嵌入式面试题二十道,有解析哦!

Copyright © 2023 Tedu.cn All Rights Reserved 京ICP备08000853号-56 京公网安备 11010802029508号 达内时代科技集团有限公司 版权所有

选择城市和中心
黑龙江省

吉林省

河北省

湖南省

贵州省

云南省

广西省

海南省