地平线 嵌入式软件开发 一面 拷打
地平线作为自动驾驶芯片头部公司,嵌入式软件岗一面考察范围覆盖 Linux 内核、RTOS、硬件接口协议、C++ 底层和系统调试能力。整体难度中等偏上,追问较多,纯背八股很难过,需要结合项目经历展开回答。
- 自我介绍,重点介绍和嵌入式或驱动相关的项目经历
- C++ 中 volatile 关键字的作用是什么?在嵌入式开发中什么场景下必须用它?
- 说说 RTOS 中优先级反转是什么问题,如何解决?
- 说说 DMA 的工作原理,使用 DMA 传输时需要注意哪些问题?
- Linux 内核中中断上半部和下半部的区别是什么?tasklet 和 workqueue 分别适合什么场景?
- 说说 Linux 设备树(Device Tree)的作用,驱动是如何通过设备树获取硬件信息的?
- 说说 I2C 和 SPI 协议的区别,各自适合什么应用场景?
- 用户态程序访问空指针触发 Segment Fault,从硬件到操作系统整个过程发生了什么?
- 说说 Linux 内核中 spinlock 和 mutex 的区别,分别在什么场景下使用?
- 说说 Cache 一致性问题在嵌入式多核场景下是如何产生的,有哪些解决手段?
- 说说 ELF 文件的结构,程序从编译到运行经历了哪些阶段?
- 说说 Linux 中断亲和性(IRQ affinity)是什么,在多核嵌入式系统中如何合理配置?
- 说说看门狗(Watchdog)的工作原理,软件层面如何正确使用它?
- 如果一个嵌入式系统上线后偶发性重启,你会从哪些方向入手排查?
总结
地平线一面整体偏底层,考察重心在 Linux 内核机制、嵌入式硬件接口和 C++ 底层原理三块。中断、DMA、Cache 一致性这类题目是地平线的高频考点,建议结合实际项目经历来回答,光背理论容易被追问到哑口无言。设备树和驱动框架也是必考方向,最好有实际写过 platform driver 或字符设备驱动的经验。偶发性重启排查这类开放题考察的是系统性思维,回答时要有条理地从硬件、软件、内存、电源等维度展开,不要只说一个方向。
嵌入式八股文专栏:https://www.nowcoder.com/creation/manager/columnDetail/mPZ4kk
(专栏包括各类基础八股文以及大厂面试题等内容)
嵌入式八股文准备方法
分四个模块来准备,每个模块有侧重点:
C++ 基础:
- 重点掌握内存模型(栈堆布局、对象生命周期)、智能指针原理、虚函数表机制、move 语义
- volatile、const、inline、noexcept 这类关键字在嵌入式场景下的实际含义要能结合硬件说清楚
- 不要只背语法,要能说出为什么,比如为什么析构函数要是虚函数,为什么 make_shared 更好
Linux 内核与驱动:
- 内核模块、字符设备驱动、platform driver 框架至少要动手写过一个
- 中断子系统(上下半部、tasklet、workqueue、threaded irq)、内存管理(虚拟内存、页表、mmap、kmalloc vs vmalloc)是必考方向
- 设备树要能看懂基本结构,知道 compatible 属性如何匹配驱动,of_get_property 怎么用
- 同步原语(spinlock、mutex、rwlock、RCU)要知道各自的使用限制,尤其是中断上下文不能睡眠这条规则
RTOS:
- FreeRTOS 的任务调度、上下文切换、任务状态机要能画出来
- 优先级反转和优先级继承是必考题,要能说清楚场景和解决方案
- 信号量、互斥量、消息队列、事件组的区别和适用场景
- 内存管理的五种 heap 方案(heap1~heap5)要了解基本差异
硬件接口与调试:
- I2C、SPI、UART、CAN 的协议特点、时序、适用场景要熟
- DMA 的工作原理、Cache 一致性问题(flush/invalidate 的时机)是嵌入式特有的高频考点
- 调试工具:GDB + OpenOCD、逻辑分析仪、示波器的基本使用场景要能说
- 偶发性 bug 的排查思路(看门狗复位原因、内存踩踏、栈溢出检测)要有系统性的方法论
备考节奏建议:先把 C++ 和 Linux 内核两块打扎实,这是所有嵌入式岗的基础盘,再根据目标公司偏 Linux 还是偏 MCU 决定 RTOS 和驱动的深度。地平线偏 Linux 和 SoC,FreeRTOS 了解即可,Linux 驱动和内核机制要重点投入。
