嵌入式linux android驱动工程师 面试题总汇
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
嵌入式linux android驱动工程师面试题总汇
1. 嵌入式系统中断服务子程序(ISR) 收藏中断是嵌入式系统中重要的组成
部分,这导致了很多编译开发商提供一种扩展—让标准C支持中断。具代表事实是,产生了一个新的关键字__interrupt。下面的代码就使用了__interrupt 关键字去定义了一个中断服务子程序(ISR),请评论一下这段代码的。
__interrupt double compute_area (double radius) { double area = PI * radius * radius; printf(" Area = %f", area); return area; } 1). ISR 不能返回一个值。2). ISR 不能传递参数。3). 在许多的处理器/编译器中,浮点一般都是不可重入的。有些处理器/编译器需要让额处的寄存器入栈,有些处理器/编译器就是不允许在ISR中做浮点运算。此外,ISR应该是短而有效率的,在ISR中做浮点运算是不明智的。4). 与第三点一脉相承,printf()经常有重入和性能上的问题。
2.C语言中对位的操作,比如对a的第三位清0,第四位置1.本来应该会的,一犯晕写反了,以后注意!
#define BIT3 (1<<3)
#define BIT4 (1<<4)
a &= ~BIT3; a |= BIT4;
3.考到volatile含义并举例:理解出错,举了很具体的例子,连程序都搬上去了,有些理解不深的没举出来……
volatile表示这个变量会被意想不到的改变,每次用他的时候都会小心的重新读取一遍,不适用寄存器保存的副本。
volatile表示直接存取原始地址
例:
并行设备的硬件寄存器(状态寄存器)
在多线程运行的时候共享变量也要时时更新
一个中断服务子程序中访问到的的非自动变量(不太清楚,正在查找资料ing……)
4.要求设置一绝对地址为0x67a9 的整型变量的值为0xaa66
当时我的写法:#define AA *(volatile unsigned long *)0xaa66
AA = 0x67a9;
答案:
int *ptr = (int *)0xaa66;
*ptr = 0x67a9;
我感觉自己写的应该不算错吧(自我感觉,还请达人指正),我写的适合裸机下用,当做寄存器用,而答案就是适合在操作系统下的写法。
1. linux内核里面,内存申请有哪几个函数,各自的区别?
2. IRQ和FIQ有什么区别,在CPU里面是是怎么做的?
3.
int *a;
char *b;
a 和 b本身是什么类型?
a、b里面本身存放的只是一个地址,难道是这两个地址有不同么?
4. 中断的上半部分和下半部分的问题:
讲下分成上半部分和下半部分的原因,为何要分?讲下如何实现?
5. 内核函数mmap的实现原理,机制?
6. 驱动里面为什么要有并发、互斥的控制?如何实现?讲个例子?
7. spinlock自旋锁是如何实现的?
8. 任务调度的机制?
【二、本人碰到】
1. 嵌入式linux和wince操作系统的特点和特性?
2. 嵌入式linux中tty设备驱动的体系结构?
3. 嵌入式设备,为加快启动速度,可以做哪些方面的优化?
4. USB设备的枚举过程?
5. PSRAM、SDRAM、DDR、DDR2的时序特性?
6. I2C触摸屏芯片与CPU的数据传输流程?画出相关图例?(这题目记得不是太清楚了,大概是考查I2C设备驱动的数据传输过程)