海能达一面(9.23)
- 轮次
- 一面
- 时间
- 2026-10
- 来源
- 牛客网
《面试题目》
- 自我介绍。
- Linux 驱动框架的了解。
- SPI 通信机制。
- 是否使用过 IIC 和 UART?
- 介绍 IIC 的通信机制。
- Linux 进程间通信有哪些?
- 安卓开发经验。
- 堆栈的知识。
- 大小端的区别。
- 说一下执法记录仪项目主要负责做什么,遇到了哪些困难、怎么解决的。
- 说一下 rk3566 的项目。
- 虚拟内存是什么?
- gdb 常见命令。
《参考解析》
Linux 驱动框架怎么答:从内核的抽象层次往上讲最清楚。驱动按设备类型分字符设备、块设备、网络设备三类;字符设备最常考,核心是实现 file_operations(open/read/write/ioctl/release),通过 register_chrdev 或 platform 机制注册,用户态以设备节点访问。现代内核里设备与驱动靠设备树匹配:设备树节点给出寄存器地址、中断号、时钟、GPIO 等资源,驱动的 of_match_table 用 compatible 属性对上,probe 里用 devm_* 系列接口申请资源(自动回收,少写错误分支)。再往上补总线模型(platform、I2C、SPI 等总线把设备与驱动配对)和常用的内核机制(并发控制用自旋锁/互斥量、中断上下半部用 tasklet 或工作队列、用户与内核数据交换用 copy_to_user/copy_from_user)。如果能结合自己写过的驱动说清「probe 做了什么、中断怎么注册、怎么调试」,比背概念扎实得多。
SPI、IIC、UART 三种总线的区别:三者常一起考。SPI 是四线制(SCLK、MOSI、MISO、CS)全双工同步总线,靠片选选从机,速率可达几十 MHz,没有应答机制,适合高速外设(flash、屏幕、传感器);缺点是引脚多、无寻址、无硬件确认。IIC 是两线制(SCL、SDA)半双工同步总线,靠 7 位或 10 位地址寻址、支持多主多从,每字节后有 ACK,能检测从机是否存在;代价是速率低(标准 100k、快速 400k、高速 3.4M)、总线上拉电阻与电容影响波形,调试时常见问题是上拉缺失、地址冲突、时序不满足、从机把 SDA 拉死。UART 是异步串行,没有时钟线,靠约定波特率与起止位同步,点对点、引脚最少,适合板间通信与调试口;因为异步,双方波特率偏差与干扰会造成帧错误,工业场景常配 RS485/RS232 收发器与校验。
进程间通信与大小端、堆栈:Linux 进程间通信要能列全并说清适用场景:管道与 FIFO(亲缘/无关进程的字节流)、消息队列(有边界、可按类型取)、共享内存(最快,需自己配信号量或互斥量做同步)、信号量(同步而非传数据)、信号(异步通知,不能传大量数据)、socket(跨主机,也能做本机通信)。大小端题要给出判断方法和实际影响:小端是把低字节放在低地址(x86、ARM 默认小端),大端相反(网络字节序);判断可以用联合体或指针取首字节,跨机器通信必须统一用 htonl/ntohl 转换,结构体位域与 memcpy 直接发送是经典坑。堆栈题则要讲清栈由高地址向低地址增长、保存函数返回地址与局部变量、堆由低向高、用 malloc/free 管理;栈溢出、野指针、返回局部变量地址是嵌入式最常见的三类内存故障。
虚拟内存与 gdb 调试:虚拟内存是 MMU 提供的地址翻译机制,每个进程有独立地址空间,页表把虚拟地址映射到物理页,好处是隔离、可以按需分配与换出、支持共享库与 mmap、便于做权限控制(只读/不可执行),代价是 TLB 缺失与缺页异常的开销;嵌入式里还要能区分 MMU(能做虚拟内存)与 MPU(只做权限保护)。gdb 常用命令要按场景说:gdb ./app core 或 gdb -p pid 附着;b 下断点、r 运行、c 继续、n/s 单步(是否进函数)、bt 看调用栈、f 切栈帧、p/x 看变量与内存、info threads/thread 看多线程、watch 监视变量变化、disassemble 看汇编;实际排查段错误常用 bt 加 core 文件定位崩溃点,配合 -g 编译与 ulimit -c unlimited 打开 core。
项目讲述与这场面试的复盘:面试官问项目时,重点在「你负责什么 + 遇到什么困难 + 怎么解决」,尤其是执法记录仪这类音视频终端项目,追问会落在数据流链路(采集—编码—存储—传输)、掉电与文件完整性、弱网下的传输策略、内存与帧缓冲管理;rk3566 这类 SoC 项目则会被问到外设驱动、设备树配置、启动流程与性能调优。准备的写法是每个项目三句话:产品做什么、我负责的模块、一个可量化的成果,再准备两个「困难案例」按现象—定位—方案—结果讲。另外这场有个值得记住的点:第一志愿是嵌入式开发,结果是第二志愿安卓驱动开发先推进,说明投递时志愿顺序与岗位真实缺口不一定一致;面试里遇到与自己准备方向不同的岗位,不要慌,把 Linux 驱动、总线、调试这些共通底层讲扎实,同时主动问清岗位实际做什么,避免入职后落差。