恒玄科技 嵌入式软件 笔试面经:选择 + 环形缓冲区与协议解析
- 轮次
- 笔试
- 时间
- 2026-10
- 来源
- 牛客网
《面试题目》
- 结构体对齐规则是什么?为什么要做内存对齐?
- RTOS 的任务就绪态是什么?调度器如何从就绪任务中选择下一个运行的任务?
- 优先级反转是怎么产生的?有哪些解决办法?
- 什么是临界区?中断和任务之间如何保护共享数据?
- 常量指针和指针常量有什么区别?
static修饰局部变量、全局变量和函数分别有什么作用?- 如何实现一个环形缓冲区,并安全地和 ISR 通信?
- 如何设计一个通信协议解析器,处理粘包和半包?
- 如何判断当前平台是大端还是小端?
- 如何用宏实现常用的位操作?
《参考解析》
结构体对齐:规则可以记成三条。第一,每个成员的偏移量必须是该成员自身对齐数的整数倍;第二,结构体总大小必须是最大成员对齐数的整数倍;第三,嵌套结构体按内部最大对齐数参与外层计算。对齐的硬件原因是 CPU 访问内存通常按字或半字进行,未对齐地址可能被拆成多次总线访问,某些架构上还会直接触发异常。代价是填充字节浪费空间,所以跨设备通信或落盘时要显式约定紧凑布局,并单独处理字节序。
RTOS 就绪态与调度:任务创建后先进入就绪态,等待 CPU;调度器从就绪链表里按优先级选最高优先级任务,同优先级再按时间片轮转。抢占式内核里,中断或系统调用唤醒了一个更高优先级任务时,会在退出临界区或中断时触发一次调度。答题时要区分「就绪」和「运行」:就绪只代表除 CPU 外的资源都满足,运行才是真正占着 CPU。
优先级反转:低优先级任务持有互斥量时被中优先级任务抢占,高优先级任务又等这把锁,于是高优先级被中优先级间接阻塞。解法是优先级继承和优先级天花板:前者在高优先级任务等待时临时把持锁任务提升到等待者的优先级,释放后恢复;后者给每把锁预设一个上限优先级,任务持锁时直接提升到该值。FreeRTOS 的互斥量默认带优先级继承。
环形缓冲区与 ISR:核心是单生产者单消费者模型。读写下标只由一方修改,避免同时写同一个变量;用 volatile 防止编译器把共享变量优化进寄存器;容量取 2 的幂,用位掩码代替取模;判断空满时留一个空位,或者额外维护计数。ISR 只做搬数据和更新写指针,解析和业务处理放到任务里。多核或带 Cache 的平台还要加内存屏障,必要时对缓冲区做 Cache 维护。
协议解析:先定帧格式,常见的是帧头 + 长度 + 命令 + 负载 + CRC。接收侧用一个状态机或环形缓冲区累积字节,先找帧头,再读长度,长度合法且整帧到齐后才交给业务层;校验失败就丢帧并重新同步。粘包靠长度字段切分,半包靠缓存等待,超时则丢弃残帧。答题时补一句:长度字段要做上限校验,否则恶意帧会把缓冲区撑爆。