嵌入式软件开发一面面经
完整信息
本篇目录
影石 嵌入式软件开发 一面面经(粉丝投稿)
粉丝投稿。影石嵌入式软件开发校招一面,纯技术,大概一个多小时,几乎没寒暄。面试官顺着项目实现一路往下抠:调度周期、总线异常、Cache/DMA 一致性、并发与性能边界,强度很大,背定义很难过。
本人全网10w+粉丝,B站教学3年+,嵌入式开发经验5年+,带过上千位学员,企业资深面试官。(订阅专栏支持简历辅导、答疑、学习路线规划、项目推荐等!)
嵌入式八股文专栏:
https://www.nowcoder.com/creation/manager/columnDetail/mPZ4kk
高频传感器数据用环形缓冲还是消息队列?写端在中断、读端在任务时,怎么保证不丢包、不读到半包?
DMA 往 SRAM 写、CPU 从同一缓冲读,D-Cache 开启时会出现什么现象?Clean/Invalidate 的时机怎么定,漏做一次会怎样?
同一块缓冲既给 DMA 用又给算法用,为什么有人把它配成 Non-cacheable?和按行 Invalidate 比,带宽和延迟差在哪?
姿态解算从采样中断到控制输出,端到端最坏延迟怎么拆?哪一段最容易引入抖动?
FreeRTOS 任务通知、二值信号量、队列分别适合什么?高频小数据为什么不建议硬塞队列?
优先级反转怎么触发?互斥锁的优先级继承解决什么、解决不了什么?
中断里调用了带阻塞的 API 会怎样?你们怎么规范 ISR 里能做什么、不能做什么?
Tickless Idle 打开后,定时采样的抖动从哪来?怎么验证实际抖动是否可接受?
I2C 通信偶发 NACK,怎么区分是从机忙、地址错、时序违例还是总线干扰?
I2C 被从机拉死在中间字节,主机侧如何做总线恢复?为什么只复位外设寄存器往往不够?
SPI 全双工连续传输时,为什么有时会出现“发出去的对、收回来的错一位”?和模式、采样边沿、线延迟怎么关联?
多从机共用 SPI,片选切换前后为什么要插延时或哑时钟?不插会踩什么坑?
相机/传感器链路里,MIPI CSI 丢帧和带宽不足怎么区分?你会看哪些计数器和时序指标?
双缓冲采集图像时,如何保证 ISP/算法永远读完整帧,而不是写到一半的帧?
零拷贝把 DMA 缓冲区直接交给算法,生命周期和所有权怎么设计?谁负责归还缓冲?
边缘侧推理为什么有时 INT8 精度掉很多、有时几乎无损?和校准集、敏感层、算子实现有什么关系?
模型从训练框架导出到板端,算子不支持时你们怎么处理?改图、拆算子、回退 CPU 的取舍标准是什么?
NPU/DSP 和 CPU 异构推理时,输入输出张量的内存布局、对齐、Cache 一致性怎么约定?
如何评估板端推理的吞吐与时延是否达标?P50/P99、预热、功耗和热节流分别怎么测?
嵌入式里为什么慎用
shared_ptr做热路径对象管理?引用计数的原子开销和确定性怎么考虑?unique_ptr自定义删除器在“对象来自内存池/共享内存”时怎么写?和默认delete差在哪?移动语义在裸机/RTOS 项目里实际解决了什么?哪些场景移动后对象仍不安全?
虚函数表在多继承下怎么布局?通过基类指针删除派生类对象,析构不是虚的会具体崩在哪一步?
std::vector在实时任务里为什么危险?你们用固定容量容器或内存池替代时,接口怎么设计?传
const T&、T*、span/string_view在嵌入式接口里怎么选?既要避免拷贝又要避免悬空?Cache line 伪共享在多核或 DMA+CPU 场景下怎么出现?数据结构怎么对齐/填充规避?
写共享变量为什么有时要 memory barrier /
volatile/ 原子操作?三者各自解决什么、解决不了什么?如何估算某段 DSP/卷积内核的理论算力上限?算力够却跑不满时,瓶颈通常在算力、访存还是调度?
流水线冒险(数据/控制/结构)对你们热点循环的影响怎么体现?编译器优化和手写汇编各自能吃掉哪部分?
Cortex-M/A 上 HardFault 来了,你怎么从 CFSR/BFAR/MMFAR 和栈帧反推根因?最常见的三类原因是什么?
MPU/MMU 把某段配成 Device 或 Execute Never,分别防什么?配错会表现为总线 fault 还是静默数据错误?
链接脚本里为什么要把 DMA 缓冲、向量表、栈放到特定区域?放错段最典型的运行时现象是什么?
看门狗喂狗策略怎么设计才不会“任务死了还在喂”?窗口看门狗比普通 IWDG 多解决什么问题?
低功耗休眠唤醒后,外设和时钟树要恢复哪些状态?哪些“醒了但外设不工作”的问题最常见?
多核(或 CM7+CM4)共享内存通信时,如何做缓存一致性与同步?只用自旋锁够不够,还要配什么?
本篇目录
当前问题0135
- 01
高频传感器数据用环形缓冲还是消息队列?写端在中断、读端在任务时,怎么保证不丢包、不读到半包?
- 02
DMA 往 SRAM 写、CPU 从同一缓冲读,D-Cache 开启时会出现什么现象?Clean/Invalidate 的时机怎么定,漏做一次会怎样?
- 03
同一块缓冲既给 DMA 用又给算法用,为什么有人把它配成 Non-cacheable?和按行 Invalidate 比,带宽和延迟差在哪?
- 04
姿态解算从采样中断到控制输出,端到端最坏延迟怎么拆?哪一段最容易引入抖动?
- 05
FreeRTOS 任务通知、二值信号量、队列分别适合什么?高频小数据为什么不建议硬塞队列?
- 06
优先级反转怎么触发?互斥锁的优先级继承解决什么、解决不了什么?
- 07
中断里调用了带阻塞的 API 会怎样?你们怎么规范 ISR 里能做什么、不能做什么?
- 08
Tickless Idle 打开后,定时采样的抖动从哪来?怎么验证实际抖动是否可接受?
- 09
I2C 通信偶发 NACK,怎么区分是从机忙、地址错、时序违例还是总线干扰?
- 10
I2C 被从机拉死在中间字节,主机侧如何做总线恢复?为什么只复位外设寄存器往往不够?
- 11
SPI 全双工连续传输时,为什么有时会出现“发出去的对、收回来的错一位”?和模式、采样边沿、线延迟怎么关联?
- 12
多从机共用 SPI,片选切换前后为什么要插延时或哑时钟?不插会踩什么坑?
- 13
相机/传感器链路里,MIPI CSI 丢帧和带宽不足怎么区分?你会看哪些计数器和时序指标?
- 14
双缓冲采集图像时,如何保证 ISP/算法永远读完整帧,而不是写到一半的帧?
- 15
零拷贝把 DMA 缓冲区直接交给算法,生命周期和所有权怎么设计?谁负责归还缓冲?
- 16
边缘侧推理为什么有时 INT8 精度掉很多、有时几乎无损?和校准集、敏感层、算子实现有什么关系?
- 17
模型从训练框架导出到板端,算子不支持时你们怎么处理?改图、拆算子、回退 CPU 的取舍标准是什么?
- 18
NPU/DSP 和 CPU 异构推理时,输入输出张量的内存布局、对齐、Cache 一致性怎么约定?
- 19
如何评估板端推理的吞吐与时延是否达标?P50/P99、预热、功耗和热节流分别怎么测?
- 20
嵌入式里为什么慎用 `shared_ptr` 做热路径对象管理?引用计数的原子开销和确定性怎么考虑?
- 21
`unique_ptr` 自定义删除器在“对象来自内存池/共享内存”时怎么写?和默认 `delete` 差在哪?
- 22
移动语义在裸机/RTOS 项目里实际解决了什么?哪些场景移动后对象仍不安全?
- 23
虚函数表在多继承下怎么布局?通过基类指针删除派生类对象,析构不是虚的会具体崩在哪一步?
- 24
`std::vector` 在实时任务里为什么危险?你们用固定容量容器或内存池替代时,接口怎么设计?
- 25
传 `const T&`、`T*`、`span`/`string_view` 在嵌入式接口里怎么选?既要避免拷贝又要避免悬空?
- 26
Cache line 伪共享在多核或 DMA+CPU 场景下怎么出现?数据结构怎么对齐/填充规避?
- 27
写共享变量为什么有时要 memory barrier / `volatile` / 原子操作?三者各自解决什么、解决不了什么?
- 28
如何估算某段 DSP/卷积内核的理论算力上限?算力够却跑不满时,瓶颈通常在算力、访存还是调度?
- 29
流水线冒险(数据/控制/结构)对你们热点循环的影响怎么体现?编译器优化和手写汇编各自能吃掉哪部分?
- 30
Cortex-M/A 上 HardFault 来了,你怎么从 CFSR/BFAR/MMFAR 和栈帧反推根因?最常见的三类原因是什么?
- 31
MPU/MMU 把某段配成 Device 或 Execute Never,分别防什么?配错会表现为总线 fault 还是静默数据错误?
- 32
链接脚本里为什么要把 DMA 缓冲、向量表、栈放到特定区域?放错段最典型的运行时现象是什么?
- 33
看门狗喂狗策略怎么设计才不会“任务死了还在喂”?窗口看门狗比普通 IWDG 多解决什么问题?
- 34
低功耗休眠唤醒后,外设和时钟树要恢复哪些状态?哪些“醒了但外设不工作”的问题最常见?
- 35
多核(或 CM7+CM4)共享内存通信时,如何做缓存一致性与同步?只用自旋锁够不够,还要配什么?