嵌入式面试笔试题目——附部分答案

时间:2023-02-11 14:38:30

1 、如何自动创建设备文件?
class_create device_create

2、led驱动编写有几种方式?
输入子系统 字符设备驱动 总线platform led子系统

3、如何实现http服务器?
tcp服务器:socket

4、如何编写守护进程,简述syslog的作用?
第一步:创建进程、杀死父进程
第二步:创建新的会话
第三步:改变工作路径路径
第四步:修改文件掩码权限
第五步:关闭文件描述符

5、bootloader和uboot的区别?
bootloader是启动装载。这是一段很小的程序,用于在系统上电启动初期运行,
初始化关键接口,如内存,串口,关闭中断,关闭看门狗,引导系统进入内核
的一段初始化的程序。它主要任务就是将内核映像从硬盘读到RAM中,然后跳转
到内核的入口点去运行内核,从而建立系统运行的必要环境。
uboot:是bootloader的一种

6、如何移植uboot?
1、下载源码
2、解压uboot源码并进入目录
3、指定交叉编译工具链
4、指定产品BOARD 底板
5、编译u-boot


7、传感器驱动如何编写?

8、BL0,BL1,BL2,BL3的作用?
BL0 文件是存放在 CPU 内部 IROM 中的一段固化代码,CPU 上点之后,首先去
运行soc中的BL0,运行时会将 BL1 拷贝到 CPU 的 IRAM 中,然后执行BL1;BL1文件执行
起来之后会先进行内存的初始化,之后将 BL2 文件拷贝到外部内存中,BL2会初始化BL3
的运行环境,将BL3搬移到DRAM中,BL3会有一个自搬移的过程,从而启动内核入口。
BL0:CPU内部的固化代码
BL1:三星提供的加密文件
BL2:截取uboot.bin 前14k
BL3:剩下的uboot 执行命令以及加载引导内核

9、exynos4412 时钟 APLL,MPLL,VPLL的区别?------倍频锁相环
APLL:用于 CPU_BLK (可产生高达1.4GHz的频率);作为 MPLL 的补充,它也可以给
DMC_BLK 、LEFTBUS_BLK 、RIGHTBUS_BLK 和 CMU_TOP 提供时钟。
MPLL:(可产生高达1GHz的频率)用于DMC_BLK 、LEFTBUS_BLK 、RIGHTBUS_BLK 和
CMU_TOP。
EPLL :主要给音频模块提供时钟,192MHz
VPLL :主要给视频系统提供54MHz时钟, 给 G3D(3D图形加速器 )提供时钟,或者是
1.1V下的440MHz。

10、arm中icache的作用
因为CPU的运行速度很快,而内存的速度比CPU的速度慢很多,因为icache是高速
缓存寄存器,将内存中的数据读取到cache中,所以这样会提高CPU的运行效率。

11、uboot启动流程?
1、初始化异常向量表
2、关中断,关看门狗,关MMU,关闭DCACHE,使能ICACHE
3、初始化时钟
4、初始化DRAM
5、初始化串口
6、设置栈
7、清BSS段
8、重定位
9、进一步初始化硬件
10、启动内核
1、初始化硬件
2、传递参数
3、启动内核


12、标准IO和文件IO的区别?
标准io是带缓存的,文件io不带缓存
标准io是属于库,文件io属于系统调用
标准io是流,文件io是文件描述符
标准io是一种特殊的文件io
13、select,poll,epoll的区别?
(1)select,poll实现需要自己不断轮询所有fd集合,直到设备就绪,期间可
能要睡眠和唤醒多次交替。而epoll其实也需要调用epoll_wait不断轮询就绪链表,期间
也可能多次睡眠和唤醒交替,但是它是设备就绪时,调用回调函数,把就绪fd放入就绪链
表中,并唤醒在epoll_wait中进入睡眠的进程。虽然都要睡眠和交替,但是select和poll
在“醒着”的时候要遍历整个fd集合,而epoll在“醒着”的时候只要判断一下就绪链表
是否为空就行了,这节省了大量的CPU时间。这就是回调机制带来的性能提升。

(2)select,poll每次调用都要把fd集合从用户态往内核态拷贝一次,并且要
把current往设备等待队列中挂一次,而epoll只要一次拷贝,而且把current往等待队列
上挂也只挂一次(在epoll_wait的开始,注意这里的等待队列并不是设备等待队列,只是
一个epoll内部定义的等待队列)。这也能节省不少的开销

14、sysfs主要的作用?
sysfs文件系统不仅可以把设备(devices)和驱动程序(drivers) 的信息从内核
输出到 用户空间,也可以用来对设备和驱动程序做设置,
sysfs 的目的是把一些原本在 procfs 中的,关于设备的部份,独立出来,以‘
设备层次结构架构’(device tree)的形式呈现

15、内核为什么要引入平台总线?
是为了使得驱动程序中的硬件信息和软件分开

16、字符设备驱动实现流程?
申请设备号
注册设备号
调用file_operations函数

17、内核中select和异步通知的区别?

18、const int a,int const a, const int * a, const int const * a;
的区别?
const int a
int const a :表示都是int型变量a是只读的,不可写。
const int * a:表示指针地址不可以修改,为只读
const int const * a:表示指针*a和指针所指向的内容都是只读,不可修改
19、inline的作用?
内联函数,在程序设计的过程中,为了不让调用函数,使得程序跳来跳去,提供
程序的执行效率,用空间换取效率的一种手段
20、volatile 的作用?
防止编译器的过度优化
1.中断子服务的非自动变量
2.多线程中的被多个线程共享的变量
3.并行设备的硬件寄存器
21 、#ifndef define #end 的作用
防止在头文件中重复定义
22、设备树中
reg interrupt-parent interrupts status pinctl-0 pinctl-name
compatible 表示什么?
reg表示子节点数
interrupt-parent 表示中断父节点
interrupts 中断号
status 中断的开启状态
pinctl-0
pinctl-name 中断名字
compatible 匹配的中断的兼容性

23.进程和线程区别?
进程的地址空间是独立的。线程的地址空间共享的。
进程消耗的资源比较大,线程消耗的资源比较小
进程和进程通信通过进程间通信方式,线程和线程通信通过全局变量。
24.fork和vfork的区别?
vfork保证子进程先运行,在他调用exec或者exit之后,父进程才可能被调度运
行,如果在调用者两个函数之前子进程依赖于父进程的动作,会导致死锁
fork需要拷贝整个父进程的环境,而vfork不需要拷贝父进程的环境,在子进程
没有调用exec或者exit之前,父进程u子进程共享环境,此时的父进程相当于阻塞等待

25.进程间通信方式有几种?每一种的特点?
8种通信方式
有名管道
无名管道
信号
信号量
共享内存
消息队列
套接字
26.字符型驱动设备你是怎么创建设备文件的,就是/dev/下面的设备文件,供上层应用程
序打开使用的文件?
mknod手动进行创建
自动创建class_create
device_create

27.insmod 一个驱动模块,会执行模块中的哪个函数?rmmod呢?这两个函数在设计上要
注意哪些?遇到过卸载驱动出现异常没?是什么问题引起的?
会执行init函数,rmmod会执行exit函数
卸载模块时曾出现卸载失败的情形,原因是存在进程正在使用模块,检查代码后
发现产生了死锁的问题。
评:要注意在init函数中申请的资源在exit函数中要释放,包括存储,ioremap,定时器
,工作队列等等。也就是一个模块注册进内核,退出内核时要清理所带来的影响,带走一
切不留下一点痕迹。
28.static作用?
1、修饰全局变量,限制全局变量在该目录下使用,不能被其他文件使用
2、修饰函数,限制函数在该目录下使用,不能被其他文件使用
3、修饰局部变量,使得该局部变量生命周期变长,改变了存储方式
29.inline的作用?
内联函数,在程序设计的过程中,为了不让调用函数,使得程序跳来跳去,提供
程序的执行效率,用空间换取效率的一种手段
30.在驱动调试过程中遇到过oops没?你是怎么处理的?
pc c
arm-none-linux-gnueabi-addr2line 地址 -e vmlinux -f


printk

汇编:
点灯
31.ioctl和unlock_ioctl有什么区别?
ioctl是应用层的,unlock_ioctl是底层提供给应用层的接口 属于内核层的
32.驱动中操作物理绝对地址为什么要先ioremap?
将一个IO地址空间映射到内核的虚拟地址空间上去。因为内核没有办法直接访问
物理内存地址,必须先通过ioremap获得对应的虚拟地址。,便于访问
33.设备驱动模型三个重要成员是?platfoem总线的匹配规则是?在具体应用上要不要先
注 册驱动再注册设备?有先后顺序没?
驱动 设备 总线
34.内核函数mmap的实现原理,机制?
map将一个文件或者其它对象映射进内存。文件被映射到多个页上,如果文件
的大小不是所有页的大小之和,最后一个页不被使用的空间将会清零。mmap在用户空间映
射调用系统中作用很大。
35.在Linux C中,ls这个命令是怎么被执行的?
fork+exec
system("ls -l");
36.uboot是如何引导内核?

37.请从网卡、LCD驱动器、传感器芯片中选择一个或者2个(可以以具体的芯片为例),
对下面的问题做答:
1)如果是外部扩展芯片,请说出你用的芯片的型号
2)画出上题中你选定相应硬件模块与CPU的主要引脚连线
3) 编写上题中你选定相应硬件模块相应LINUX驱动的流程?

38.platform总线设备及总线设备如何编写?
驱动 硬件

39.IIC原理,总线框架,设备编写方法,i2c_msg

40.查看驱动模块中打印信息应该使用什么命令?如何查看内核中已有的字符设备的信息
?如何查看正在使用的有哪些中断号?
dmesg cat /proc/devices
cat /proc/interrupt

41.中断和轮询哪个效率高?怎样决定是采用中断方式还是采用轮询方式去实现驱动?
中断是CPU处于被动状态下来接受设备的信号,而轮询是CPU主动去查询该设备是
否有请求。
凡事都是两面性,所以,看效率不能简单的说那个效率高。如果是请求设备是一个频
繁请求cpu的设备,
或者有大量数据请求的网络设备,那么轮询的效率是比中断高。如果是一般设备,
并且该设备请求cpu的频率比较低,则用中断效率要高一些。主要是看请求频率。

42、IIC,SPI,串口的区别?
SPI总线由三条信号线组成
串行时钟(SCLK)、串行数据输出(SDO)、串行数据输入(SDI)。SPI总线可以实现多个SPI设
备互相连接。提供SPI串行时钟的SPI设备为SPI主机或主设备(Master),其他设备为SPI从
机或从设备(Slave)。主从设备间可以实现全双工通信,当有多个从设备时,还可以增加
一条从设备选择线
I2C总线是双向、两线(SCL、SDA)
具有总线仲裁机制,非常适合在器件之间进行近距离、非经常性的数据通信。在
它的协议体系中,传输数据时都会带上目的设备的设备地址
UART总线是异步串口,因此一般比前两种同步串口的结构要复杂很多,一般由波
特率产生器(产生的波特率等于传输波特率的16倍)、UART接收器、UART发送器组成,硬件
上由两根线,一根用于发送,一根用于接收

43、输入子系统分为哪几层?如何编写设备驱动?
分为三层:硬件驱动层、子系统核心层、事件处理层

编写事件处理层


44、TCP和udp的区别?
tcp:是基于连接的,可靠的一种通信方式,而udp是不需要连接的,直接发送报

 

45、用变量a给出下面的定义
a) 一个整型数(An integer)
b)一个指向整型数的指针( A pointer to an integer)
c)一个指向指针的的指针,它指向的指针是指向一个整型数( A pointer to a
pointer to an intege)r
d)一个有10个整型数的数组( An array of 10 integers)
e) 一个有10个指针的数组,该指针是指向一个整型数的。(An array of 10
pointers to integers)
f) 一个指向有10个整型数数组的指针( A pointer to an array of 10
integers)
g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数(A pointer
to a function that takes an integer as an argument and returns an integer)
h)一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回
一个整型数( An array of ten pointers tofunctions that take an integer
argument and return an integer )

46、中断是嵌入式系统中重要的组成部分,这导致了很多编译开发商提供一种扩展—让标
准C支持中断。具代表事实是,产生了一个新的关键字__interrupt。下面的代码就使用了
__interrupt关键字去定义了一个中断服务子程序(ISR),请评论一下这段代码的。

__interrupt double compute_area (double radius)
{
double area = PI * radius * radius;
printf("\nArea = %f", area);
return area;
}

 

中断不能有返回值,不能使用printf函数,不能传递参数 不能进行浮点数计算

 

 

文中答案为本人整理而得到,不能保证百分之百正确,如有误,请联系作者本人修改