影石创新

嵌入式软件开发一面面经

完整信息

35 条问法 · 36 道题

本篇目录

影石 嵌入式软件开发 一面面经(粉丝投稿)

粉丝投稿。影石嵌入式软件开发校招一面,纯技术,大概一个多小时,几乎没寒暄。面试官顺着项目实现一路往下抠:调度周期、总线异常、Cache/DMA 一致性、并发与性能边界,强度很大,背定义很难过。

本人全网10w+粉丝,B站教学3年+,嵌入式开发经验5年+,带过上千位学员,企业资深面试官。(订阅专栏支持简历辅导、答疑、学习路线规划、项目推荐等!)

嵌入式八股文专栏:

https://www.nowcoder.com/creation/manager/columnDetail/mPZ4kk

  1. 高频传感器数据用环形缓冲还是消息队列?写端在中断、读端在任务时,怎么保证不丢包、不读到半包?

  2. DMA 往 SRAM 写、CPU 从同一缓冲读,D-Cache 开启时会出现什么现象?Clean/Invalidate 的时机怎么定,漏做一次会怎样?

  3. 同一块缓冲既给 DMA 用又给算法用,为什么有人把它配成 Non-cacheable?和按行 Invalidate 比,带宽和延迟差在哪?

  4. 姿态解算从采样中断到控制输出,端到端最坏延迟怎么拆?哪一段最容易引入抖动?

  5. FreeRTOS 任务通知、二值信号量、队列分别适合什么?高频小数据为什么不建议硬塞队列?

  6. 优先级反转怎么触发?互斥锁的优先级继承解决什么、解决不了什么?

  7. 中断里调用了带阻塞的 API 会怎样?你们怎么规范 ISR 里能做什么、不能做什么?

  8. Tickless Idle 打开后,定时采样的抖动从哪来?怎么验证实际抖动是否可接受?

  9. 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)共享内存通信时,如何做缓存一致性与同步?只用自旋锁够不够,还要配什么?

本篇目录
  1. 01
    高频传感器数据用环形缓冲还是消息队列?写端在中断、读端在任务时,怎么保证不丢包、不读到半包?
  2. 02
    DMA 往 SRAM 写、CPU 从同一缓冲读,D-Cache 开启时会出现什么现象?Clean/Invalidate 的时机怎么定,漏做一次会怎样?
  3. 03
    同一块缓冲既给 DMA 用又给算法用,为什么有人把它配成 Non-cacheable?和按行 Invalidate 比,带宽和延迟差在哪?
  4. 04
  5. 05
  6. 06
    优先级反转怎么触发?互斥锁的优先级继承解决什么、解决不了什么?
  7. 07
  8. 08
  9. 09
    I2C 通信偶发 NACK,怎么区分是从机忙、地址错、时序违例还是总线干扰?
  10. 10
  11. 11
    SPI 全双工连续传输时,为什么有时会出现“发出去的对、收回来的错一位”?和模式、采样边沿、线延迟怎么关联?
  12. 12
  13. 13
    相机/传感器链路里,MIPI CSI 丢帧和带宽不足怎么区分?你会看哪些计数器和时序指标?
  14. 14
  15. 15
  16. 16
    边缘侧推理为什么有时 INT8 精度掉很多、有时几乎无损?和校准集、敏感层、算子实现有什么关系?
  17. 17
    模型从训练框架导出到板端,算子不支持时你们怎么处理?改图、拆算子、回退 CPU 的取舍标准是什么?
  18. 18
  19. 19
  20. 20
    嵌入式里为什么慎用 `shared_ptr` 做热路径对象管理?引用计数的原子开销和确定性怎么考虑?
  21. 21
    `unique_ptr` 自定义删除器在“对象来自内存池/共享内存”时怎么写?和默认 `delete` 差在哪?
  22. 22
    移动语义在裸机/RTOS 项目里实际解决了什么?哪些场景移动后对象仍不安全?
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
    写共享变量为什么有时要 memory barrier / `volatile` / 原子操作?三者各自解决什么、解决不了什么?
  28. 28
    如何估算某段 DSP/卷积内核的理论算力上限?算力够却跑不满时,瓶颈通常在算力、访存还是调度?
  29. 29
    流水线冒险(数据/控制/结构)对你们热点循环的影响怎么体现?编译器优化和手写汇编各自能吃掉哪部分?
  30. 30
    Cortex-M/A 上 HardFault 来了,你怎么从 CFSR/BFAR/MMFAR 和栈帧反推根因?最常见的三类原因是什么?
  31. 31
    MPU/MMU 把某段配成 Device 或 Execute Never,分别防什么?配错会表现为总线 fault 还是静默数据错误?
  32. 32
    链接脚本里为什么要把 DMA 缓冲、向量表、栈放到特定区域?放错段最典型的运行时现象是什么?
  33. 33
  34. 34
    低功耗休眠唤醒后,外设和时钟树要恢复哪些状态?哪些“醒了但外设不工作”的问题最常见?
  35. 35

相关公司