10.20 德明利固件工程师一面:FreeRTOS 调度与指针数组
- 轮次
- 一面
- 时间
- 2026-10
- 来源
- 牛客网
《面试题目》
- 做一下自我介绍。
- 项目细节拷打。
- 互斥锁的作用是什么?
- 信号量与互斥锁的区别?
- FreeRTOS 多任务如何设计?
- 讲一下抢占式调度。
- 数组指针与指针数组,以及分别加 1 的区别?
- 结构体内存对齐。
- volatile 的作用以及用法。
- 实习工作内容。
- 反问。
《参考解析》
互斥锁 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:防止编译器优化掉对硬件寄存器、中断共享变量的读写;不保证原子性和内存序。