恒玄科技嵌入式一面:60 分钟从项目框架问到互斥锁、自旋锁与 volatile
- 轮次
- 一面
- 时间
- 2026-10
- 来源
- 牛客网
《面试题目》
- 自我介绍。
- 项目拷打:整体框架是什么?关键细节怎么实现的?做了哪些优化?
- 进程间的通信方式有哪些?
- 进程和线程有什么区别?
- 多任务怎么设计,怎么保护共享资源?
- 互斥锁、自旋锁、读写锁分别是什么,怎么选?
- SPI 和 I2C 有什么区别?
- 堆和栈有什么区别?
volatile的用法是什么?- 实习拷打。
- 反问。
《参考解析》
项目优化要能分层说:算法层(换更轻的模型、减少重复计算)、内存层(减少拷贝、用内存池、把大缓冲复用)、并发层(缩小临界区、把阻塞操作移出高优先级任务)、IO 层(DMA 替代轮询、批量传输)。每层配一个数字(时延、内存峰值、CPU 占用),面试官才有「确实优化过」的印象。
进程通信:管道/FIFO、消息队列、共享内存(最快但要自己做同步)、信号量、信号、socket(可跨机)。共享内存 + 信号量是最常见的组合。
互斥锁 vs 自旋锁 vs 读写锁:互斥锁拿不到就睡眠,适合临界区较长、可能阻塞的场景,代价是上下文切换;自旋锁拿不到就忙等,适合极短临界区且不允许睡眠的场合(中断上下文、内核态),单核上要关抢占;读写锁区分读共享与写独占,适合读多写少。RTOS 里还要提优先级继承(互斥量)与优先级反转问题。
多任务与资源保护:任务按周期/优先级/阻塞特性划分,共享数据用互斥量保护、跨任务传递用队列(避免共享)、中断与任务之间用信号量或任务通知;关键是缩小临界区、避免在持锁时做阻塞操作(否则必然死锁或抖动)。
SPI vs I2C:SPI 四线(SCLK/MOSI/MISO/CS)、全双工、速率可达数十 MHz、无地址靠片选;I2C 两线(SCL/SDA)、半双工、有 7/10 位地址与仲裁、速率 100k-3.4M、需要上拉。选型看速率与器件数量,多设备低速传感器用 I2C 省引脚,屏/Flash 用 SPI。
堆栈区别与 volatile 用法见常见八股:栈自动管理、空间小、分配快;堆手动管理、空间大、有碎片。volatile 保证每次都从内存读、不被优化,用于 ISR 共享变量、寄存器映射、DMA 缓冲,但不提供原子性。