今天下午到网路通电子面试嵌入式驱动开发一职,至于面试机会是怎么样来的,就得看自己的努力和技巧了,在这就不扯这个问题了,还是说说面试过程吧;前往公司面试一路也算是有点小波折吧,在面试通知里边可知学院和上社两个BRT站都能去,我就选择上社下车,一边开导航,一边找,一路走呀走呀,一不小心走错路口,从上社走到学院,郁闷,然后往回走,总算到公司了;
上去见到前台MM,我说来面试的,她说是不是面试驱动开发一职,然后我就递交我的简历,她也从电脑上打印一份试题,然后拿给我,让我做;内容是C和linux驱动的一些知识;先说C吧,趁热打铁,把我能想起来的都拿出来说说;
一,选择题部分,题目不分次序;
1 . for(i=0,k=-1;k=1;i++,k++)
printf("*");
循环一次、不循环、无限循环; 答案是无线循环;这个考察的是对for的熟悉程度,还有逗号表达式; 实际for判断的是k=1;k赋值为1,肯定可以,当然为真了;为了保证正确性,我又想了如果if(k=1)呢,或许你看不出,如果是if(k==1),有印象了吧,为什么初学者建议写成if(1==k)的形式,就是避免出现if(k=1)的bug然后调试不出来;
2. 若变量已正确定义并赋值,表达式______不符合C语言语法。
A、a*b/c; B、3.14%2 C、2, b D、a/b/c
咋一看,觉得都可以,是不是这样觉得C呢?刚开始我也觉得疑惑,但是但是答案往往会诱导你,C一看确实觉得是不合法的,仔细想想面试一般不可能给这么简单的题吧?所以C瞬间就是正确的,不信你可以看看C语言中不是还有个逗号表达式吗?a=2,b; 最后不就是a=b吗!!!但A,D不用看就知道是对的,所以只剩下B了,我就选择B了,感觉%应该不能是浮点型的;面试回来之后,一查确实是:%只能针对整数。
3.语句“if(a>b) k=0; else k=1;”和______等价
A 、k=a>b?1:0 Bk=a<=b?0:1 C、k=a<=b D、k=a>b
这道题看起来不难吧?但是不经意间,你就会脑袋紊乱而选错,答案是C为什么呢?想想0是假,真一般是1,有些编译器是-1,我再想想bool类型,然后就果断选C了;
4. 已知int a[4];问下边表达式是不允许的?
A 、*a B、a[0] C、a++ D、a
是不是惊呆了,我也是,感觉好像似乎都对,没错啊,深深怀疑出题人,但是觉得没理由,一定有错的;我们对这些变量的思维常用于赋值语句的右边,当想想放在左边的时候,答案就出来了 ,a=XX;可以吗?显然不行了,因为a是数组不是指针,这道题考的不是别的就是数组与指针的区别;
5. int i,char j; float z,x; 若变量已正确定义并赋值,则i*j+z/x 是什么类型?
A 、int B、char C、float D、double
是不是有种想马上翻书的感觉了?或者是上机调试?这里考察的是不同类型的数据运算的时候的类型转换;如果一个运算符两边的运算数类型不同,先要将其转换为相同的类型,即较低类型转换为较高类型,然后再参加运算;有些编译器是转成float,有些是double;具体还得看平台;
double ←── float 高
↑
long
↑
unsigned
↑
int ←── char,short 低
6. c[] = "adef\0abc" ; char *p = c; printf("%c", p+4); 打印什么值?
A 、adef B、abc C、0 D、a
这个不用说,一眼就能排除A,B,不要问我为什么,自己看;答案是C;这个地方考察的是转意符的使用;
剩下的4道选择题,感觉没什么,而且我印象也不深了,也不打算讲了;
接下来说说简答和代码题的。
二,简答题
1. 函数 int sum (int a. int b) 定义一个函数指针P,并让P指向sum;
int (*P)(int , int) = sum;
2.把a的bit3置1,不改变其他位;a的bit3置0不改变其他位;
a |= 1<<3;
a &= ~(1<<3);
3.有一个数组table,用一个宏计算数组大小;
#define ARRAY_SIZE ((sizeof(a))/sizeof(*a))
4.查看内核打印信息用什么指令;怎样查看系统里的字符设备;怎样查看系统已用的中断号;
dmesg
ls -l /dev
cat /proc/interrupts
5.内核中断上半部分和下半部分关系和原因,大概就是这个意思;
产生中断时硬件相关的处理要求快, 而有些驱动在中断处理程序中又需要完成大量工作,这构成矛盾,所以Linux中断的上半部分和下半部分,上半部分处理急且重要的工作,下半部分处理不急但重要的工作;.
Linux 的底半机制主要有Tasklet 和worl\k queue以及 softirq,可以理解成一种工作的延迟。所以实际使用时跟timer机制基本上一个意思。Linux的底半处理实际上是建立在内核的软中断机制上的.
6.copy_to_user()和copy_from_user()功能和作用;主要用在file_operations中的那些函数? 不解释了,网上资料大把;
7.写一个结构体封装一个人的信息,性别,身高,名字;输入 男1 ,178cm,Tonmy;
8.实现 char *strcpy(char* dest, const char *src); 函数;
笔试部分完结;
接下来面试部分
面试官是一个看起来很年轻的青年,估计也就25左右;整个过程没有说笔试部分上的问题,一开始基本都是自我介绍;所以这次也是不例外,自我介绍的时候面试官会借此机会一边听一边看简历,所以整个过程要把握好,刚好他看得差不多就可以停,这是个技巧;网上学的;我就废话不多说,直切正题;
一上来就问,你这里的内核移植时做过的吧?我说是的,做过的,下载源代码,参考一些手册一步一步移植,不懂的找资料和看论坛; 好了,我只说问题不说回答了;
问题1. 如果我有个文件想加入内核源代码,要怎样做? 。。。。。。都忘得差不多了,只能说个大概
问题2. USB驱动,是内核自带的然后选上还是自己移植的? 。。。。。。正中要害,虽然是直接选上,但有时用不了,原因是USB那块的时钟没设置好,需要修改,圆滑过渡了,这是我移植的时候出现的问题;
问题3. I2C驱动你做过吧?能简单说下是怎样编写的吗?
问题4. 那简单说说I2C设备的地址有哪些位?
问题5. 网络编程TCP的服务器怎样设置?
问题6. 写过多线程编程吗?
问题7. 你简历里的按键驱动是怎样设计的?
问题8. 有使用过视频编码吗?
还有一些问题,我也忘记了,印象深的就这些了,由于我没准备好,有些回答得很差,而且没重点,具体怎样还是等通知,该干嘛还是得干嘛去。
对了,还问到 Source Insight的快捷键还有vi快捷键,想查看你用这些工具的熟用程度;
总结了下I2C、USB、socket 被问到的概率很高,还是需要整装备战,准备好了,继续战斗!!!