影石嵌入式一面面经

面试流程

流程分三块:基础八股 → 项目深挖 → 手撕代码。整体感觉:考察点偏底层实现与系统设计,不满足于表面答案,问得很深。

一、八股文环节(核心难点)

这一部分不只是背诵,而是深挖机制,很多问题都追问到实现原理。

C语言与内存相关

  • 函数指针和回调的本质区别?如何在中断回调和任务回调之间安全切换?
  • malloc 内部是如何管理堆的?在嵌入式系统里为什么尽量避免?
  • memcpymemmove 的区别?如果自己实现要如何避免内存重叠问题?
  • union 在寄存器映射里的应用,为什么比结构体更合适?

RTOS 内核机制

  • FreeRTOS 的任务控制块(TCB)里面包含哪些关键内容?(栈指针、优先级、状态列表等)
  • 内核是如何实现任务切换的?具体到 ARM Cortex-M,PendSV 中断和 SVC 的作用?
  • 信号量、互斥量、事件组的底层差异?为什么互斥量会涉及优先级继承
  • 如果任务 A 持有互斥量但被高优先级任务 B 抢占,会发生什么?内核如何处理?
  • 系统 tick 丢失会有什么后果?如何设计 tickless idle 来降低功耗?

驱动与硬件相关

  • I2C DMA 和 I2C 中断模式的差异?在高频采样场景下哪个更合适?
  • 如果 SPI 主机和从机时钟不同步,会有什么现象?怎么排查?
  • USB 枚举流程的关键步骤?设备是如何告诉主机自己的配置的?
  • 摄像头驱动中,为什么常用环形队列管理帧缓存?如何避免帧丢失?

全网最全面的嵌入式八股文专栏:https://www.nowcoder.com/creation/manager/columnDetail/mPZ4kk

二、项目深挖

项目问得非常细,面试官会结合你做过的模块,往系统设计和调优层面引导。

  1. 系统架构你做过的 RTOS 项目里,任务是如何划分的?任务优先级是基于什么考虑?为什么要用消息队列而不是直接共享内存?怎么保证实时性?
  2. 性能与调优你如何定位任务卡死?除了加日志,还有没有更底层的方法?(比如利用空闲任务统计、看门狗、硬件 trace)如果某个任务频繁触发上下文切换,怎么分析它是不是优先级配置不合理?
  3. 驱动与硬件结合你做过的 DMA 优化:是如何减少 CPU 占用的?如何保证 DMA 传输和中断同步?如果摄像头采集数据速率过高,导致队列满了,丢帧怎么解决?
  4. 系统稳定性嵌入式产品在量产后,偶发死机问题如何排查?如何用硬件定时器 + 看门狗实现双重保护?

三、手撕代码

题目很贴近实际:既考算法逻辑,也考嵌入式开发能力。

例题 1:环形缓冲区实现一个无锁环形缓冲区,要求:

  • 读写指针用 volatile 修饰,保证中断和主循环同时访问安全;
  • 支持覆盖写模式;
  • 提供 pushpop 接口。

例题 2:简化版任务调度器实现一个简易任务调度器,要求:

  • 每个任务有执行周期(ms);
  • main() 的死循环里,通过 tick() 调用决定哪个任务该执行;
  • 要求支持多个任务同时运行,避免漂移。

例题 3(追问):如果任务执行时间超过了设定周期,如何处理?(考察你是否知道 “软实时 vs 硬实时” 的区别)

四、总结

影石一面的整体感觉:

  • 八股不浅显,不止问 “RTOS 有几种内存分配”,而是问 TCB、任务切换机制、优先级继承等底层实现;
  • 项目深挖到真实问题,比如 DMA 异常、摄像头丢帧、任务调度失衡;
  • 手撕题偏工程化,不是纯算法,而是环形缓冲区、任务调度器这种贴近嵌入式开发的题目。

整体难度属于偏硬核,需要不仅会用,还要懂原理。

全部评论
这样太难了
点赞 回复 分享
发布于 09-12 08:34 四川
这么难吗
点赞 回复 分享
发布于 09-11 17:24 山东

相关推荐

评论
3
33
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务