影石嵌入式一面面经

面试流程

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

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

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

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 异常、摄像头丢帧、任务调度失衡;
  • 手撕题偏工程化,不是纯算法,而是环形缓冲区、任务调度器这种贴近嵌入式开发的题目。

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

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

相关推荐

8.22 秋招第一面,面了一小时,那会八股还是完全不熟的状态,直接裸面上了,答的非常无敌糟糕,全程汗流浃背,面完是真的快虚脱了...1. 自我介绍2. 聊目前华为实习内容之后就开始了八股盛宴😭😭😭3. 什么是中断上下文,为什么在中断处理函数中不能休眠(第一个问题我就没听清,我回答的是中断上下半部内容,被点出来后慌的我,补充说的也不是很好)4. 继续问什么是进程上下文(那会完全不了解)5. 介绍DMA(只点到了概念的大概意思),继续追问是什么驱使我用DMA而不是CPU6. 如果遇到IIC读写错误的问题,你会怎么排查7. 如果一个当驱动模块发生panic时,如何调试(没遇过,只回答了日志抓取),继续问有没有做过rundump或者kkdump?8. 有无用过中断下半部的工作队列和Tasklet(没用过,那会我连tasklet是什么都不知道😰)9. 在工作队列中可以休眠吗10.工作队列是工作在进程上下文还是中断上下文(这一块那时的我依旧完全不了解)11.驱动能直接访问用户空间的内存吗(默认不能),那如何实现间接访问(我只了解用户访问驱动的那套流程,反过来的实现完全不了解😇,后面面试官告诉我Linux有提供专门的内核函数copy_from_user/copy_to_user)12.c和c++哪个熟13.介绍c++的RAII机制,追问实现自动释放内存的原理,动态管理内存的底层逻辑是?14.介绍一下多态,虚函数表是干嘛的(多态和继承那块我是真的经不起问,一问一个不知道)15.介绍堆栈的区别16.有没有分析过内存泄露的问题17.介绍一下之前用gdb调试的经历18.有没有用gdb调试过踩内存的问题(🈚)19.什么是优先级反转(又一个当时完全不知道的问题...)20.线程间有哪些同步机制,怎么解决并发竞争的问题21.进程间的通信方式有哪些22.谈谈你遇到过的印象深刻的技术难题23.问我自学看了哪些书(Linux设备驱动开发详解、c++ primer…)有什么收获24.有接触过Linux启动这块吗25.反问就是现在的我回头再复盘这一面,依旧还是心累的😥😥秋招第一面直接来了个巨大暴击,一下就看到了很多不足,那会给我的直观感觉就是,是真的要把重心放到秋招面试的准备上来了,原本还打算九月底才结束暑期实习,那会当场就决定必须得早点all in秋招。之后就开始猛猛整理操作系统和c++的八股,无缘了影石,但这场面试非常的有用!
查看24道真题和解析
点赞 评论 收藏
分享
评论
1
18
分享

创作者周榜

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