禾赛科技嵌入式面经全流程|从笔试到终面,激光雷达赛道真题一次讲透
- 2026-10-25 01:08:47
禾赛科技嵌入式面经全流程|从笔试到终面,激光雷达赛道真题一次讲透
前面聊过华为、大疆、比亚迪。这期换一条更垂直的赛道——激光雷达。
禾赛科技(Hesai)是全球激光雷达市占率第一的公司,纳斯达克上市,主要客户是理想、小米、长安、吉利、长城、奇瑞这些主机厂,也在给割草机器人、伴随机器人供传感器。它的嵌入式岗位,做的是激光雷达底层驱动、数据处理、通信协议这些活。
这条赛道的面试有个鲜明特点:它是"嵌入式基础 × 车载通信 × 数据链路"的三重叠加。 你既要会 FreeRTOS 的任务切换,又要说清 CAN 的仲裁电平,还得知道点云为什么要走 UDP 不走 TCP。
本文把 2024–2026 届多位同学的真实面经拼成一条完整链路:笔试、技术一面、技术二面、终面,逐关给真题、给深挖链、给接法。背完能直接用。
一、先看流程:禾赛嵌入式面几轮
标准链路通常是这样:
网申 + 笔试(线上,3 道编程题) 技术一面(视频,40–60 分钟,C 语言 + 操作系统 + 网络) 技术二面(视频,40–50 分钟,往深里挖,专挑一面答得不好的再问一遍) 终面 / HR 面(有的岗位"面试官说大概率就是最后一面,HR 忙,可能没有 HR 面") Offer
几条被反复验证的实情:
面试以视频为主,手撕代码在本地 IDE 里做。 不是白板,但也不是纯口述——有同学的一面就是"在本地 IDE 里写,无项目问题"。 二面会"翻旧账"。 多份面经都提到"对于一面中回答的不好的地方再次问道"。这意味着一面答砸的题,二面很可能原题重来,答不上来就是双倍扣分。 C 语言是绝对主线。 有同学的一面"主要考察 C 语言相关",面试官开场就问"平时用 C 开发多吗",因为公司主要用 C。 网络协议和 Linux 内核,是禾赛区别于纯 MCU 公司的分水岭。 五层模型、TCP 帧结构、ARP、GCC 启动流程、slab 分配器、USB 驱动——这些在别的公司是加分项,在这里是必答项。 Base 可选上海和重庆,面试官一般推荐上海,但想去重庆也可以。 一个真实时间线:7.19 笔试 → 8.4 一面 → 8.13 二面,节奏比大疆紧凑得多。
二、笔试:3 道编程题,难度是"easy+ / medium / medium+"
禾赛笔试的结构非常干净:三道编程题,一道 easy+、一道 medium、一道 medium+。
但真正拉开差距的,是行业知识型客观题——从公开的试卷样本看,题目是围绕激光雷达的真实工程场景出的:
① 点云数据怎么传? 每秒数十万到上百万个点的点云上传到域控制器,主控与上位机之间最常用的高速数据链路是——千兆以太网(UDP)。
高频追问:为什么用 UDP 不用 TCP? 因为点云允许少量丢包,UDP 延迟低、不会因重传阻塞后续数据流;再配合 PTP 做时间同步。
② DMA 在 LiDAR 数据采集里的作用。 这里有一道很典型的判断:"DMA 开启后无需关心缓存一致性,在任何内核上都安全"——这是错的。带 D-Cache 的内核上,DMA 与 Cache 必须做一致性处理(clean / invalidate,或者把内存配成 non-cacheable),否则 CPU 读到的是缓存里的旧数据。DMA 接收还应配合环形缓冲 / 双缓冲,避免数据被覆盖。
③ C 语言实操题(从公开笔试样本看):16 进制转 10 进制、翻转字符串里的单词顺序。
笔试真实体感:编程题难度不算离谱,但每道题背后都挂着一个"行业为什么这么做"的追问。只刷 LeetCode 的同学,会在客观题上直接失分。
📖 嵌入式八股阅读原文:C 语言 / 单片机 / 通信协议 / RTOS 的完整八股整理,见原文
三、技术一面:C 语言为主轴,网络协议是分水岭
一面的时长 40–60 分钟,流程是:自我介绍 → C 语言逐条挖 → 操作系统 / 网络 → 手撕 → 反问。面试官会"对着提纲一道一道往下问",节奏快,几乎不放水。
3.1 C 语言:从"声明与定义"一路挖到函数指针
这是一面占比最大的部分。一位同学的真实记录是这样的——注意每一问后面都跟着追问:
① 变量的声明与定义
C 语言里,变量的声明和定义有什么区别? 追问:什么是声明、什么是定义? 再追问:平时用到过吗?
要点:定义会给变量创建内存空间来存放它;声明只是告诉编译器"这个变量在别处定义过"。
② static 的三种用法
static修饰局部变量和修饰全局变量有什么区别?全局变量加 static和普通的有什么区别?追问:如何访问另外一个文件里用 static 定义的变量?(答案是访问不了——static 把作用域锁在本文件内,这正是它做"文件级封装"的意义)
③ 指针
平时用指针做什么?有用别的指针吗,比如函数指针? 举一个实际使用指针的例子。 函数指针是什么?
④ 其他高频 C 语言考点
volatile关键字的作用const char *这个声明的含义是什么?(指向常量的指针,const 修饰的是char)分别定义"指针数组"和"数组指针"( char *p[10]vschar (*p)[10])内存五大分区:这个变量存在哪一段?bss 段、data 段还是栈? 什么是字节对齐? #pragma pack的作用是什么?大小端模式,以及写代码判断当前机器是大端还是小端(联合体 union) 代码编译过程 → 编译这一步主要做什么 → 为什么不能一步直接编到二进制? malloc和calloc有什么区别?什么是野指针?如何避免野指针? C 语言中的存储类别: auto、static、extern、register
⑤ 位操作
在 C 语言结构体中,如何定义一个只占 2 位的成员变量?(位域 unsigned int x : 2;)
3.2 操作系统与 RTOS
你是否阅读过 FreeRTOS 的内核源码? 请阐述 FreeRTOS 的任务调度机制。 FreeRTOS 中如何管理临界资源?提供了哪些锁机制? 请描述 FreeRTOS 中进行任务切换的具体流程。 进程间通信有哪些方式?
3.3 网络协议(禾赛的必答项)
这段是一面后半程的主线,也是很多人翻车的地方:
请简述网络五层模型(或 TCP/IP 模型)中各层的主要功能及对应的典型协议。 TCP 报文段和以太网数据帧各自包含哪些主要字段? IP 层(网络层)是如何获取目标 MAC 地址的?(ARP:先查 ARP 缓存,未命中则广播 ARP 请求,目标主机单播回应)
📖 嵌入式八股阅读原文:RTOS / 中断机制 / 内存管理 / 通信协议的完整八股整理,见原文
3.4 手撕代码
一面几乎必有一道,难度不高但要求跑通:
LeetCode 14 · 最长公共前缀(出现频率最高,一面、二面都考过) 反转链表 编写一个程序:返回当前日期所在的月份和日期(不区分闰年,但每个月天数不同——考的是边界处理) 16 进制转 10 进制 翻转字符串中的单词顺序
3.5 开放题
什么是嵌入式?(这个问题出现频率意外地高,别轻敌) 你对公司有什么了解? 你对激光雷达行业有什么了解?
四、技术二面:往深里挖,还会"翻一面的账"
二面 40–50 分钟,风格是一面的加难版。开头那句几乎成了固定动作:"对于一面中回答得不好的地方,再次问一遍。"
4.1 通信协议:I2C / SPI 挖到仲裁和 DMA
I2C 协议讲一下。如果 SCL 被异常拉低(总线被占住)怎么办?怎么排查问题? I2C 出现竞争时,仲裁优先级是什么?(谁先发出低电平谁赢;显性(低)压过隐性(高);ID 越小优先级越高) SPI 协议:四根线分别是什么?四种模式分别是什么?(CPOL × CPHA)SPI 能不能实现真正的全双工? SPI 和 DMA 怎么连接? 项目中用到了 I2C,介绍一下;项目中激光雷达是如何接收数据的?
4.2 任务切换与上下文:问到底层寄存器
这是二面的核心深挖区,多份面经反复出现:
上下文切换的具体内容是什么? 任务切换时需要把寄存器压入堆栈吗?可不可以不入栈? 函数调用和中断服务函数有什么区别?(结合 PendSV 谈) 函数调用需要把相应的寄存器入栈吗? ARM 架构的通用寄存器有哪些?介绍一下 栈指针有几个?MSP 和 PSP 分别用在什么场景?(FreeRTOS 里任务用 PSP,异常/中断用 MSP) 汇编文件里的 PendSV(上下文切换)具体做了什么? FreeRTOS 的内存管理、上下文切换、临界资源与锁的管理(最简单方案) 任务有几个状态?从运行态切到就绪态的条件是什么?主动进入阻塞态的方式有哪些? 就绪态的任务是通过什么方式管理的? 任务栈空间是怎么分配的?是否对栈的使用率做过检测?
4.3 ARM 内核与其他
Cortex-M 的缓存一致性怎么处理? Cortex-M 的特权模式是什么? Cortex-M 内核中,如何通过栈回溯定位 HardFault 异常的根本原因? 为什么说进程比线程开销大?为什么说进程是分配的最小单元、线程是调度的最小单元? STM32 里中断的整个流程,CPU 要做哪些工作?中断为什么要保存通用寄存器? 热插拔驱动:它的 probe 函数在哪里实现的?poweron 的原理是什么? 手撕:LeetCode 14 · 最长公共前缀、快排
4.4 Linux 内核方向(Linux BSP / 底层驱动岗会深挖这一整块)
如果你投的是 Linux 方向(禾赛有 Linux BSP 软件工程师岗),二面的重心会整体切换到内核:
中断里用什么锁?(自旋锁)自旋锁和互斥锁的区别? 如果中断函数被线程化,又该用什么锁?(互斥锁) 中断下半部有哪些方式?(软中断、tasklet、工作队列) tasklet 是进程上下文还是中断上下文?(中断上下文) 说一下系统启动过程 / bring up 需要做哪些工作? 最熟悉哪个内核子系统?——说一下 slab 分配器。 内存这块有没有实际的优化案例?(内存裁剪、去掉板卡没用到的外设、把耗时驱动改成模块方式加载) IO 读写性能低,可能是什么原因?怎么定位?(iostat -x 1 看 await / %util、iotop 看进程级 IO、dmesg 查硬件错误) 概率性死机问题怎么定位和解决? 快启(快速启动)的思路是什么? 有过 USB 驱动经验吗? 能接受加班吗?
看出来禾赛在考什么了吗:它不是考你会不会用 API,而是考你有没有真的去看过内核源码、有没有真的调过一个概率性死机。一面问"知识",二面问"经历"。
📖 嵌入式八股阅读原文:Linux 内核 / 驱动 / 中断管理 / 内存子系统的完整八股整理,见原文
五、终面 / HR 面:一面二面就够狠,最后一关反而轻
禾赛的轮次偏少。有同学的反问得到的回答是"大概率就是最后一面,HR 忙,可能没有 HR 面"。
所以终面的内容,基本混在二面里一起问完了,常见的是这几类:
介绍一个最有挑战的项目。 你遇到过的最难的问题?怎么解决的? 谈一下自己的性格特点。 能接受加班吗? 有什么想问我的?(反问环节)
值得注意的两点:
"最有挑战的项目"这道题,在禾赛是重头戏。 因为它会顺势引出"最难的问题怎么定位"——而这正是激光雷达公司最看重的工程能力。 反问要问得专业。 参考问法:"禾赛嵌入式一共几面?"、"禾赛有哪些 base 可选?"。好的反问本身就是一次展示。 愿意来哪座城市要提前想清楚。 上海是主阵地,重庆也有 base。
六、激光雷达赛道专属考点(其他公司不会问)
这是本文最有增量价值的部分——禾赛的差异化考点,全在"传感器 + 数据链路 + 车载通信"这条链上。
① 点云数据链路
激光雷达点云上传到域控制器,走什么链路?为什么是千兆以太网 + UDP,而不是 TCP? 为什么需要 PTP 这类时间同步协议? 点云的时间戳精度、多传感器时间同步为什么重要?
② 激光雷达基础
激光雷达的测距原理是什么?(TOF,发射激光脉冲测反射时间) 主流技术路线有哪些?(机械式 / 半固态(MEMS、转镜)/ 纯固态(OPA、Flash)) 相比摄像头,激光雷达的优势是什么?(高精度、不受光照影响、直接获取深度) 不同技术路线的优缺点是什么?
③ 车载通信(MCU 方向必考)
CAN 总线的仲裁和通信逻辑是什么? CAN 的显性电平和隐性电平怎么区分? CAN 的通信波特率是多少? 实际传输中遇到过 CAN 总线错误(发送/接收错误、数据丢失)吗?怎么处理? 如何对不同 ID 的 CAN 消息做过滤?过滤器的屏蔽规则是什么?
④ 传感器与执行器
IMU 模块通过什么方式通信?从 IMU 获取数据的整个流程是什么? IMU 数据多久同步一次?接收 IMU 数据是在任务里周期性查询吗?查询频率多高? 不清楚 IMU 发送频率的情况下,如何决定接收任务周期以避免丢包? 接收 IMU 数据时 buffer 怎么设置?一包没收完又来数据怎么办? 电机控制如何实现(转速和方向)?转速调节的具体实现方式?
一位做过 MCU 方向实习的同学说得很实在:"基本是围绕项目问的"——他会从你的 IMU 通信任务,一路问到你为什么要设这个周期。
七、高频八股速查表
C 语言:声明 vs 定义、 static三种用法(局部 / 全局 / 跨文件访问)、volatile、const char *、指针数组 vs 数组指针、函数指针、内存五大分区(text/data/bss/heap/stack)、字节对齐与#pragma pack(1)、大小端与 union 判定、编译四步(预处理/编译/汇编/链接)、mallocvscalloc、野指针、位域、auto/static/extern/register内存管理:内存泄漏 vs 内存碎片、内存池、slab 分配器、kmalloc / vmalloc、环形缓冲与双缓冲 RTOS:任务状态与调度机制、就绪态的链表管理、上下文切换与寄存器压栈、PendSV、MSP vs PSP、临界资源与锁、信号量 vs 互斥量、消息队列、栈使用率检测 中断与内核:中断流程、为什么要保存通用寄存器、中断里用什么锁、中断线程化、下半部(软中断 / tasklet / workqueue)、HardFault 栈回溯、Cortex-M 特权模式、DMA 与 Cache 一致性 通信协议:I2C(仲裁、SCL 被拉死怎么排查)、SPI(四线、四种模式、全双工、接 DMA)、UART、CAN(仲裁、显性/隐性电平、波特率、ID 过滤与屏蔽规则)、千兆以太网 + UDP、PTP 网络:五层模型与协议对应、TCP 报文段字段、以太网帧字段、ARP 获取 MAC 的过程 Linux 内核:自旋锁 vs 互斥锁、中断下半部、系统启动流程、bring up、slab、内存裁剪、IO 性能定位(iostat / iotop / dmesg)、概率性死机的排查思路、快启 体系结构:ARM 通用寄存器、Cortex-M 特性、进程 vs 线程的开销差异 算法:最长公共前缀、反转链表、快排、字符串处理、进制转换
📖 嵌入式八股阅读原文:以上全部考点的完整八股合集(含 C 语言 / RTOS / Linux / 车载协议),见原文
八、禾赛到底在考什么
把多位同学的经验压成三句话:禾赛考的是"C 语言的深度 × 内核源码的熟悉度 × 对传感器链路的理解"。
C 语言必须真懂,而且要能追到第三层。 从"声明和定义的区别",一路能追到"怎么访问另一个文件里的 static 变量"——这是纯记忆型选手的分水岭。 看过源码的人明显占优。 "你看过 FreeRTOS 的源码吗"这个问题,答"看过"和答"用过",后面的追问深度完全不是一个量级。二面问的寄存器压栈、调度器实现,都是源码级问题。 行业知识是加分,但不是必需品,可以临阵补。 点云为什么走 UDP、激光雷达有哪几条技术路线、TOF 是什么——这些花两小时就能补上,但面试里能立刻把你和其他候选人区分开。 诚实是保命符。 二面会原题重问一面答砸的地方,与其硬编,不如老实说"这块我当时理解得不到位,我后来的理解是……"。坦诚 + 有进步,比装懂好得多。
九、备考清单
C 语言:按第七节逐条自测。重点补 static的三种用法、指针数组 vs 数组指针、内存五大分区、字节对齐、编译四过程——这几块在一面出现频率最高,而且都是连环追问的形式。RTOS:真的去翻一遍 FreeRTOS 源码,至少读透 task.c和port.c。把"任务切换时保存哪些寄存器""PendSV 做了什么""MSP 和 PSP 谁用在哪"讲清楚,这是二面的核心得分区。网络:把五层模型、TCP 报文段字段、以太网帧字段、ARP 全过程整理成一页纸。答案要能默写出来。 手撕:把 LeetCode 14、反转链表、快排练到闭眼能写;再练几道字符串处理题(进制转换、单词翻转、日期计算)。 行业知识:花两小时整理激光雷达的四块——TOF 测距原理、技术路线(机械/半固态/固态)、点云数据链路的选型理由(UDP + PTP)、与摄像头的对比优势。这是让你在一面开口就出彩的地方。 Linux 方向加分:如果投 BSP / 底层驱动岗,额外补 自旋锁 vs 互斥锁、中断下半部三种方式、slab 分配器、系统启动与 bring up、IO 性能定位工具链。 项目:准备 1 个"最有挑战的项目",重点练"最难的问题怎么定位"这条线——用真实的时间线、真实的排查手段讲,比讲技术点更打动人。 反问:准备两三个专业问题,比如团队做的是哪一代产品的哪个模块、嵌入式在国内和海外的分工差异。
嵌入式八股阅读原文
评论区扣下你想看的公司,下一篇优先安排。
#嵌入式面试 #禾赛科技面经 #激光雷达 #嵌入式软件开发 #秋招 #校招
—— 嵌入式求职 · 面经专场