面灵AI→

10.19 记忆科技嵌入式一面:I2C、cache 一致性与大小端

轮次
一面
时间
2026-10
来源
牛客网

《面试题目》

  1. 做一下自我介绍。
  2. I2C 介绍,I2C 读的步骤、从设备数量、标准速率?
  3. 线程与进程的区别?为什么线程要同步?同步的方法有哪些?
  4. 项目中的知识蒸馏是怎么做的?如何轻量化?
  5. FP16 与 INT8 有什么区别?
  6. C 与 C++ 的区别?
  7. 空指针、野指针是什么?
  8. 内存泄漏是怎么回事?
  9. 堆与栈,访问效率谁高?
  10. cache 一致性是什么?如何解决?
  11. 大小端是什么?双方不一致如何解决?
  12. 反问。

《参考解析》

I2C:两根线 SCL/SDA,开漏加外部上拉,支持多主多从,7 位地址最多 112 个从设备(保留地址除外)。标准模式 100kHz、快速模式 400kHz、快速+ 1MHz。读流程:起始 → 发从机地址+写位 → 发寄存器地址 → 重复起始 → 发地址+读位 → 读数据(主机回 ACK/NACK)→ 停止。

线程同步:互斥锁、读写锁、条件变量、信号量、原子操作;同步是为了保护共享数据、保证顺序、避免竞态。

蒸馏与量化:蒸馏用大模型(教师)的软标签训练小模型(学生),损失是 KL 散度加硬标签交叉熵;轻量化还包括剪枝、量化、低秩分解。FP16 是指数 5 位、尾数 10 位,动态范围大但精度低;INT8 是定点,需要 scale/zero-point 校准,速度快、显存小,但可能掉点。

C vs C++:C 是面向过程、无类、手动内存管理;C++ 支持类、继承、多态、模板、RAII、STL、异常。嵌入式里 C++ 常用但要注意代码体积和异常/ RTTI 开销。

空指针/野指针/内存泄漏:空指针是值为 nullptr 的指针,解引用会崩;野指针指向已释放或未初始化的内存,行为未定义;内存泄漏是申请后未释放,长期运行会耗尽内存。工具:静态检查、ASan、Valgrind、代码审查。

堆 vs 栈:栈由系统管理、连续、访问快(寄存器+缓存友好),大小有限;堆手动管理、可能碎片、访问相对慢。

cache 一致性:多核各自 cache 同一地址会不一致,用 MESI 协议和总线嗅探维护;DMA 场景要软件做 cache invalidate/flush,或使用非缓存内存。

大小端:大端高字节在低地址,小端相反;网络字节序是大端。通信双方约定统一字节序,用 htonl/ntohl 或手动移位转换。