晶晨半导体嵌入式软件笔试
- 轮次
- 笔试
- 时间
- 2026-09
- 来源
- 牛客网
《面试题目》
- 给出一段程序,说明这段程序的作用是什么?
- Makefile 是什么,它如何决定哪些文件需要重新编译?
- 操作系统的管道是什么原理?
- 翻译题:将给定的一段英文材料译成中文。
- 编程题:统计一个字符串里大写字符和小写字符的数量。
- 编程题:给定两个字符串,如何删除重复字符?
- 编写中断服务程序(ISR)时需要注意什么?
- 给出一段材料,结合材料说明 AI Agent 的核心是什么?
- 嵌入式与 Agent 结合可以怎么设计一个系统?
《参考解析》
-
程序的整体作用怎么答:这类题不是逐行翻译代码,而是先归类再讲细节——它在算什么(算法/数据结构)、用了什么机制(循环、递归、指针、位运算、宏)、入参出参与边界条件、以及有没有隐藏的坑(越界、溢出、未初始化、
sizeof用于指针)。回答顺序建议是「一句话说结论 → 关键语句逐段说作用 → 指出边界行为」,比如「这段是字符串反转,用双指针从两端交换,遇到空指针会崩」。面试官通常还会追问「这段代码有什么问题」,提前把内存与边界风险点出来比只讲功能得分高。 -
Makefile 的依赖与增量构建:Makefile 描述「目标—依赖—命令」三元组,make 据此建出依赖图,比较目标与依赖的时间戳决定哪些目标过期需要重建,所以只会重编改动的部分。常用要素有变量与自动变量(
$@、$<、$^)、模式规则、.PHONY伪目标、-j并行构建。两个必踩的坑:命令行前必须是真 TAB 而不是空格;依赖写漏会导致改了头文件却不重编,可以用gcc -MMD -MP自动生成头文件依赖再include进来。 -
管道的原理:管道是内核里的一块环形缓冲区加一对文件描述符(读端、写端)。父进程
pipe()之后fork(),子进程继承这两个 fd,于是有了单向的字节流;写满会阻塞或返回 EAGAIN,读空同理,所有写端关闭后读端读到 EOF。它没有消息边界——字节流语义,结构化数据要自己加长度前缀或分隔符。它只能用于有亲缘关系的进程,命名管道 FIFO 才能让无关进程共享;底层实现与 socket 类似,都是内核缓冲区加阻塞/唤醒机制。 -
删除重复字符:要求保序时,用一张 256 槽的布尔表或位图记录出现过的字符,扫一遍,没见过的输出并打标记,时间 O(n)、额外空间 O(1);不要求保序就排序后相邻去重,O(n log n)。语言允许的话直接用哈希集合,写法最短。追问一般落在三点:是否区分大小写、能否原地修改(双指针 + 位图原地压缩)、内存受限怎么办(位图占 32 字节即可覆盖 ASCII,哈希集合则不可接受)。
-
统计大小写字符:一趟扫描,逐个判断
'A' <= c <= 'Z'与'a' <= c <= 'z'分别计数即可。要注意别直接依赖isupper/islower的行为——它们受 locale 影响,在非 C locale 下可能把带重音的字符也算进去。如果输入可能含 UTF-8 多字节字符,按字节判断会数错,需要先按字符解码,或者明确说明只处理 ASCII。 -
ISR 的编写规范:ISR 跑在中断上下文里,跑久了会增加中断延迟甚至丢中断,所以只做最必要的动作——清中断标志、把数据搬进缓冲区、置个标志或 give 一个信号量,耗时处理交给任务。硬性约束是不能阻塞、不能睡眠、不能调用可能引发调度的接口(带阻塞的互斥锁、动态内存分配、
printf这类重入不安全的函数)。与任务共享的变量要用volatile并在临界区里访问;用 FreeRTOS 时要调FromISR版本并在退出时判断是否需要触发一次切换;可重入与中断嵌套、以及中断优先级的分配也要考虑到。 -
嵌入式与 Agent 结合的系统设计:可以按三层拆。端侧只做采集与执行,跑轻量协议栈上报结构化状态、接受下发的动作指令,算力不够就不放模型;边缘网关侧做本地推理与规则兜底,保证断网可用,把时序数据窗口化后再上送;云端 Agent 负责意图理解、工具调用与多步规划,通过工具接口把动作下发到边缘。设计要点是控制回路不能依赖云端往返、必须有本地闭环与超时降级;下发指令带唯一 id 并做幂等与回执;把模型的输出限制在结构化的动作集合内,越界的直接拒绝,而不是让它直接写寄存器。这是这类岗位最想听的「边界感」。