面灵AI→

10.20 德明利固件工程师一面:FreeRTOS 调度与指针数组

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

《面试题目》

  1. 做一下自我介绍。
  2. 项目细节拷打。
  3. 互斥锁的作用是什么?
  4. 信号量与互斥锁的区别?
  5. FreeRTOS 多任务如何设计?
  6. 讲一下抢占式调度。
  7. 数组指针与指针数组,以及分别加 1 的区别?
  8. 结构体内存对齐。
  9. volatile 的作用以及用法。
  10. 实习工作内容。
  11. 反问。

《参考解析》

互斥锁 vs 信号量:互斥锁保护共享资源,有所有权,谁加锁谁解锁,带优先级继承;信号量是计数器,用于同步或资源计数,没有所有权,可在中断中释放。二值信号量看着像锁,但语义不同,不能替代互斥锁做资源保护。

FreeRTOS 多任务设计:按职责和实时性拆任务,给每个任务定优先级和周期;用队列传数据、信号量同步、事件组做多条件等待;共享资源用互斥锁;栈大小按最坏调用深度估算并开栈溢出检测;避免在中断里做耗时操作,用 FromISR 接口。

抢占式调度:高优先级任务就绪立即抢占低优先级任务,同优先级按时间片轮转;调度发生在中断返回、系统调用(延时、阻塞)时。要提一句「优先级反转」和「临界区关中断的时间」。

数组指针 vs 指针数组:int (*p)[10] 是数组指针,指向一个含 10 个 int 的数组,p+1 前进 40 字节;int *p[10] 是指针数组,是 10 个 int* 的数组,p+1 前进一个指针大小(8 字节)。

内存对齐:结构体成员按自身对齐值对齐,结构体总大小是最大对齐值的整数倍;用 offsetof 和 sizeof 验证;调整成员顺序可以减小 padding;跨平台通信要 pack 或手动序列化。

volatile:防止编译器优化掉对硬件寄存器、中断共享变量的读写;不保证原子性和内存序。