尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

嵌入式校招笔试客观题核心考点解析与备考指南

嵌入式校招笔试客观题核心考点解析与备考指南 1. 先说说嵌入式校招的笔试这道坎最近好多准备秋招的学弟学妹来问我嵌入式软件开发工程师的笔试到底考什么。正好手头有一份顺丰科技2019秋招嵌入式软件开发工程师的客观题合集我重新翻了一遍发现这类题目放在今天依然有很强的参考价值。嵌入式这个方向不像纯后端那样大面儿铺开考框架也不像纯算法岗那样死磕手撕代码它考的东西杂而深C语言、操作系统、Linux、数据结构、通信协议、硬件基础都会来一点表面看是选择题判断题实际上每一道都在筛你的底子够不够厚。当时顺丰科技做嵌入式背后的业务场景很明确物流自动化设备、智能分拣系统、手持终端、AGV小车、传感器采集节点这些设备全部跑在嵌入式平台上。笔试出题自然不可能脱离这些场景乱考。所谓客观题就是选择、判断、填空这类有标准答案的题目看似只考记忆其实题干里埋着大量考察分析能力的坑。本文适合正在准备嵌入式校招或社招笔试的同学也适合想系统补一遍嵌入式基础知识的开发者。我会把这类笔试最常出现的考点和解题思路拆开结合题目实例来讲后面还会给出一套实际可执行的备考方法文末整理了几个高频掉坑点希望能帮你少走弯路。2. 客观题到底在筛什么考核框架与考点分布2.1 基础知识、代码功底和思维习惯的三重筛选先说一个很多人误解的地方嵌入式笔试的客观题不是用来刷人的它是用来做第一层筛选的。投递嵌入式岗位的人里简历上写着“熟悉C语言”“了解Linux”“做过STM32项目”的太多了但到底熟到什么程度笔试是最快、成本最低的验证方式。客观题的好处是标准统一、判定客观一张卷子能同时覆盖几百个初筛候选人的基础维度。以嵌入式软件工程师的日常来看硬性的技能要求包含几个层次第一层是语言层C语言是绝对的主流考指针、考内存、考结构体、考位运算这些是嵌入式开发的基本功第二层是系统层包括操作系统原理、进程线程、同步互斥、内存管理、中断机制因为嵌入式设备上跑着RTOS或者嵌入式Linux你不懂系统就写不好驱动和业务逻辑第三层是工具链层编译、链接、Makefile、调试器、Linux常用命令这些是实际干活的工具第四层是硬件层寄存器操作、通信协议、时钟树、GPIO复用这些决定了你能否让代码在真实硬件上跑起来。2.2 高频考点与大致占比根据我对这份合集以及同类笔试的观察嵌入式客观题的考点分布大致如下表所示实际不同公司会有浮动但整体框架差异不大考点板块大致占比常见出题方向C语言基础25% - 30%指针、数组、结构体对齐、const/volatile/static、位运算操作系统15% - 20%进程与线程、信号量/互斥锁、死锁、虚拟内存、调度Linux与开发工具10% - 15%常用命令、文件系统、编译链接、GDB调试、Makefile数据结构与算法10% - 15%链表、栈队列、二叉树、时间空间复杂度、排序硬件与通信协议10% - 15%I2C/SPI/UART、中断、ARM架构基础、寄存器计算机网络5% - 8%TCP/IP、网络模型、socket基础其他5%嵌入式系统概念、RTOS、项目场景分析这张表的意义在于告诉你复习顺序。如果你时间有限C语言和操作系统必须优先搞定这两个板块加起来接近一半的分数而且它们也是后面所有板块的基础。很多同学花大量时间背通信协议结果C语言指针题做错两三道捡了芝麻丢了西瓜。3. 五大核心考点的典型题目与解题思路3.1 C语言指针、内存布局与频率极高的陷阱C语言在嵌入式笔试中的地位不需要多解释。这里挑几类出现频率极高的题目每类都讲讲它背后的考察逻辑。第一类sizeof与strlen的区别。这是老生常谈到几乎每一份嵌入式笔试都会出现的题。比如char str[] hello; 问sizeof(str)和strlen(str)分别是多少。答案是6和5。注意sizeof在编译期就计算好了它统计的是数组占用的总字节数字符串末尾的\0也算在里面strlen是运行时函数遇到\0才停下所以只数到5。类似的还有char *p hello; printf(%d %d, sizeof(p), strlen(p));64位系统下指针本身占8字节所以结果是8和5。这题的坑在于很多人把sizeof(p)误以为是在算字符串长度实际它算的是指针变量本身的大小。第二类结构体字节对齐。嵌入式开发里结构体用得太多了协议帧、设备参数表、传感器数据都是结构体而内存对齐直接关系到一个结构体占用多少字节这在分配缓冲区和做通信协议解析时非常关键。看一个经典例子struct test1 { char a; int b; char c; }; struct test2 { char a; char c; int b; };默认4字节对齐且按最大成员对齐的情况下sizeof(struct test1)是12sizeof(struct test2)是8。原因很简单test1里a占1字节后要填充3字节对齐到4b占4字节c再占1字节后整个结构体还要填充3字节补齐到4的整数倍一共12test2里两个char连续占用2字节再补2字节给int一共8。这类题考察的是你对内存布局的敏感度因为嵌入式设备内存宝贵结构体成员顺序写得好不好直接影响占用空间在通信协议解析中更是如此。第三类const、volatile、static这些关键字的作用。嵌入式笔试几乎必考而且经常组合起来出。const修饰变量表示只读修饰指针时要注意const int *p和int * const p的区别volatile告诉编译器这个变量可能被硬件或中断修改禁止优化寄存器映射、多线程共享变量、中断服务程序里访问的全局变量都必须用volatile修饰static修饰局部变量时延长生命周期但在函数内保持作用域修饰全局变量或函数时限制在本文件内可见。我见过一道很经典的判断题一个变量既被const修饰又被volatile修饰问合不合理。答案是完全合理典型场景是只读的硬件状态寄存器程序不能写它但它的值会被硬件随时改变。第四类指针数组与数组指针、函数指针。嵌入式里函数指针用得很多比如回调函数、中断向量表、状态机跳转表。面试官特别喜欢用这类题考察你是否真的理解了C语言的类型系统。比如int *p[10]和int (*p)[10]的区别前者是包含10个int指针的数组后者是指向包含10个int元素数组的指针。很多人一看到带指针的定义就晕其实口诀就一句先看标识符右边有方括号就是数组有圆括号且里面是星号就是指针。3.2 操作系统进程线程、同步互斥与死锁必考组合嵌入式软件分两类方向一类跑裸机或RTOS一类跑嵌入式Linux。不管哪种操作系统原理都是笔试回避不了的板块而且出题面非常集中。进程与线程的区别是出现概率最高的一道题。考点很明确进程是资源分配的基本单位有独立的地址空间线程是CPU调度的基本单位同一进程内的线程共享地址空间。放到嵌入式场景里理解一个跑Linux的工控板上每个业务进程都有自己的地址空间其中一个进程崩溃不会直接拖垮其他进程而进程内的多个线程共享内存通信方便但一个线程越界写可能就把整个进程搞挂了。同步互斥这块信号量和互斥锁的区别也是高频考题。很多人把两者混为一谈实际上互斥锁强调资源的独占性谁拿了谁访问同一个线程不能重复加锁否则容易死锁信号量强调资源的数量控制初始值可以大于1可以用于计数场景比如一个缓冲区最多放5个数据包信号量初值设为5每放入一个包执行一次P操作每取走一个执行一次V操作。顺丰科技这种物流场景的设备多路传感器数据同时入队多线程消费者处理信号量几乎是标准答案。死锁这块四个必要条件必须会背更要会判断互斥、持有并等待、不可剥夺、循环等待。笔试喜欢给一个场景让你判断是否可能死锁或者问破坏哪个条件能避免死锁。比如把资源按编号排序每个线程只能按递增顺序申请资源这就是破坏了循环等待条件。还有一个常考的概念是银行家算法它会问系统当前是否处于安全状态、能否满足某进程的资源请求这类题只要把剩余可用资源算清楚再按安全序列推一遍就能做对。调度算法也考得勤。先来先服务、短作业优先、时间片轮转、优先级调度各自的优缺点要清楚。嵌入式实时系统里特别关注优先级反转问题比如一个低优先级任务持有了高优先级任务需要的锁导致高优先级任务被阻塞优先级继承和优先级天花板是两种典型解法这些概念在实时系统题目里反复出现。3.3 Linux系统与编译链接从命令到ELF的一整条链路嵌入式Linux方向的同学对这部分要格外重视。即使你做的是RTOS或裸机开发Linux也是绕不开的开发环境。先看Linux常用命令笔试一般不会直接考命令参数的背诵而是给一个场景让你选出正确的命令。查看端口占用用什么netstat或ss查找文件用什么find加-name参数按内容搜文件用什么grep -r查看进程用什么ps -ef或top。最有迷惑性的一类题是把ls、cat、more这些和文件内容相关的命令混在选项里让你判断某个场景该用哪个。我的建议是不要死记参数而是多用实际场景去理解比如“我想在/var/log目录下找所有包含error的日志文件”你自然就想到grep -r error /var/log。编译链接过程是另一个重点。从源文件到可执行文件要经过预处理、编译、汇编、链接四个阶段每个阶段干什么要清楚。预处理处理宏定义、头文件包含、条件编译生成.i文件编译把C代码翻译成汇编生成.s文件汇编把汇编代码转成机器码生成.o文件链接把多个.o文件和库文件合并成可执行文件。笔试常考题包括-I、-L、-l这三个编译选项分别指什么答案是头文件搜索路径、库文件搜索路径、要链接的库名。宏定义和条件编译的题也常出现比如#define SQUARE(x) ((x)*(x))调用SQUARE(ab)时为什么外层必须再加一层括号。静态库和动态库的区别也值得单独说。静态库在链接时被完整拷贝进可执行文件后缀是.a动态库在运行时加载后缀是.so。静态库生成的程序大但部署简单动态库节省空间但依赖环境。嵌入式设备上经常为了减小flash占用选择动态库但又要处理库版本兼容问题笔试就爱考这种权衡取舍。3.4 数据结构与算法链表的地位无人能撼嵌入式笔试的数据结构题目相对基础但链表是绝对的主角因为它太贴合嵌入式场景了内核的任务队列、驱动的请求链表、内存管理中的空闲块链表处处都是链表。链表相关的客观题主要集中在数组和链表的优缺点对比、单链表反转的思路、判断链表是否有环、链表中间节点怎么找。客观题一般不会要求完整写代码但会把关键步骤拆成选项让你选。比如判断链表是否有环最经典的做法是快慢指针快指针每次走两步慢指针每次走一步如果存在环两者必然相遇。这题如果你不懂原理光靠背结论面试官换一个问法你就懵了比如把“快指针走三步可以吗”这就要推到时间复杂度和是否可能跳过的数学问题上去。栈和队列的题也常见主要考应用场景。栈适合函数调用、表达式求值、括号匹配检验队列适合先来先处理的场景比如串口数据缓冲、任务调度队列。环形队列则是嵌入式里的高频考点因为它的读写索引回绕逻辑非常典型而且能充分利用固定大小的缓冲区理解isEmpty和isFull判断条件是关键。排序和时间复杂度属于送分题但送分也总有人丢。冒泡、插入、选择、快排、归并的时间复杂度和稳定性要背熟。快排的平均时间复杂度是O(n log n)最坏是O(n^2)不稳定归并平均和最坏都是O(n log n)稳定但需要额外内存。嵌入式场景里还经常问一种特殊问题内存极小的情况下如何排序答案往往涉及外排序或者在原数组上做原地排序这类题考察的是资源受限条件下的方案设计能力。3.5 硬件基础与通信协议嵌入式岗位的压轴差异项为什么嵌入式笔试会考硬件题因为嵌入式软件工程师写的代码最终是跑在真实硬件上的你必须看得懂原理图、知道寄存器怎么操作、明白外设是怎么工作的。这一块也是嵌入式岗位和其他软件开发岗位笔试最大的区别所在。中断是重中之重。中断和轮询的区别、中断服务程序里能不能调用printf、中断服务程序应该尽量短的原因这些几乎年年考。中断服务程序的约束要从实时性和可重入性两个角度理解中断可能打断主程序的任意位置所以ISR里不能调用不可重入函数不能使用非异步信号安全的函数不能做耗时操作否则会导致中断响应超时严重时系统直接崩溃。还常考中断向量表、中断优先级、上下文切换开销等概念。通信协议主要考I2C、SPI、UART三者的区别。可以从几个维度记忆UART是异步串行通信全双工点对点靠起始位和停止位同步速率通常较低I2C是同步通信半双工两根线SDA和SCL支持多设备挂载通过设备地址寻址有应答机制SPI是同步通信全双工四根线MOSI、MISO、SCLK、CS一主多从通过片选线选设备速率通常比I2C快。笔试多选题容易把“SPI是半双工”这种错误表述混进选项注意别被带偏。ARM架构的基础知识也会涉及。Cortex-M系列是MCU的主流核心Cortex-A系列跑应用处理器两者的定位差异要清楚。寄存器组、堆栈指针MSP和PSP、工作模式、NVIC嵌套向量中断控制器、SysTick定时器这些概念在嵌入式开发里经常提到选择题里出现时不要慌按“硬件资源软件控制方式”的思路去分析。4. 实战答题策略与备考路线4.1 做题顺序、时间分配与检查方法嵌入式笔试的客观题通常题量不小我记得这类笔试一般给60到90分钟题目数量在40到60道之间平均每道题只有一分多钟。时间紧做题顺序就很重要。我的建议是先把有把握的题快速做完尤其是记忆性题目比如Linux命令、数据结构定义、协议特点这类题看一眼就能答不需要纠结。接着做计算分析题比如sizeof、结构体对齐、位运算这些需要动笔推但一旦算出来答案就确定。最后做那些模棱两可的题先排除明显错误的选项再用知识储备判断剩下的。千万不要在一道题上卡超过三分钟笔试不要求满分保证整体得分率比死磕一道难题更重要。检查阶段重点检查两类题一是多选题嵌入式笔试的多选题往往有一两个选项极具迷惑性比如把“SPI半双工”写进去把“volatile可以保证原子性”写进去这种表述看着专业实际错误要专门过一遍二是计算题sizeof和结构体对齐这种题最后检查时重新算一遍很容易发现自己漏了字节对齐的补齐规则。4.2 一份可落地的四周备考路线很多同学问嵌入式笔试到底怎么准备才高效。我结合自己的备考经验给一条四周时间、每天两到三小时的路线。第一周主攻C语言把指针、结构体、内存管理、位运算、预处理这几块系统的过一遍。推荐的方式是边看书边做题每学一个知识点立刻找对应的客观题练手而不是只看讲义不做题。复习重点放在“平时写代码不太注意”的知识点上比如sizeof的编译期特性、volatile的编译器优化抑制原理、static在不同位置的语义差异。第二周主攻操作系统和Linux进程线程、同步互斥、死锁、内存管理、任务调度这五块是核心。Linux部分把常用命令过一遍特别是文件权限、进程管理、网络排查、日志查找相关命令。编译链接的过程要理解到位静态库动态库的区别要能用自己的话讲清楚。第三周主攻数据结构和硬件协议。数据结构重点吃透链表、栈、队列、二叉树基础排序算法的时间和空间复杂度表必须背下来。硬件协议重点掌握UART、I2C、SPI、中断机制、GPIO操作模式能画出来每种协议的时序图和接线方式最好。第四周做模拟题和查漏补缺把前面三周整理出的错题重新做一遍对薄弱知识点进行针对性补强。网上有大量嵌入式笔试真题和面经刷题的时候不要只看答案每道题都要追问自己这个考点背后的原理是什么出题人想考察什么能力下次换一个场景我还能不能做对。5. 高频失分点与避坑经验整理了一些我在刷题和实际辅导过程中反复遇到的坑以表格形式列出方便你对照检查序号高频失分点典型表现避坑方法1sizeof与strlen混用计算字符串长度时选了sizeof记住sizeof是编译期运算符strlen是运行时函数2结构体对齐忽略填充算出的结构体总字节数偏小画内存布局图按对齐规则逐字节推演3指针自增方向搞反混淆p与p对指针的影响明确p先返回旧值再移动p先移动再返回新值4volatile和const组合不理解认为两者互斥或不可能共存记住硬件状态寄存器的典型场景5信号量与互斥锁概念混淆把互斥锁当作计数为1的信号量从所有权角度区分互斥锁有持有者概念6死锁条件只会背不会判断给定场景无法判断是否死锁逐个核对四条件全部满足才是死锁7Linux命令参数记混find和grep场景错用总结高频命令的场景记忆法8I2C与SPI特性记反以为I2C是全双工或SPI是半双工从物理线数量推导四线多半是全双工9中断服务程序调用非安全函数认为ISR里可以随意printf理解可重入性问题ISR尽量只置标志位10快慢指针判断环的原理不清只会背结论不会推导手动模拟几轮指针移动过程加深理解除了表格里列的这些问题我还想多说一个比较隐蔽的坑很多人复习嵌入式笔试时只追求“刷题量”不追求“建立知识体系”。一位同学刷了三百道题结果笔试时遇到一个从没见过的场景描述题不会迁移知识整道题靠猜。真正的准备方式是把知识点串联成网络比如你看到“volatile”这个词能想到编译器优化、寄存器映射、多线程共享、中断服务程序、硬件状态寄存器这一整串相关的概念而不是单独记一个词的定义。这种结构化记忆在考场上特别管用因为客观题很少直接考定义它总是把概念嵌套在一个具体场景里。再补充一个小技巧做选择题时如果遇到完全没头绪的题优先从矛盾选项入手。嵌入式笔试的选项设置往往是四个选项里有两对互斥表述比如“A. 全双工 B. 半双工”“C. 支持多设备 D. 仅支持点对点”这时候只要能判断出其中一个维度就能同时排除两个选项再结合题干信息锁定答案。这个技巧在通信协议类题目中尤其好用。6. 最后分享一点我的个人体会翻完这份顺丰科技2019秋招的嵌入式客观题合集我的感受是这类笔试题的难度并不在于题目本身有多深而在于它覆盖面太广每道题都在试探你的知识盲区。很多人复习的时候喜欢逮住一个方向往死里钻比如把C语言指针题刷得滚瓜烂熟结果操作系统的题一对三错总分照样上不去。嵌入式这个方向本身就要求你是一个“T型人才”横向知识面要宽纵向在个别领域要有深度笔试的客观题部分恰恰是横向宽度的检验场。我自己当年备考时也踩过不少坑最深刻的教训是“不要只看书不做题”理解的深度和你做题时暴露出来的问题完全是两码事。你觉得自己看懂了结构体对齐合上书一做题填充规则立马出错你觉得理解了信号量的计数逻辑场景题一变形又分不清P操作和V操作了。如果你现在正处于准备阶段时间充裕就先过一遍基础知识时间紧张就直接刷题从错题中反推知识点补漏两种路线都比单纯看书高效得多。希望这篇对客观题的解析和备考建议能帮你在笔试中少踩一些坑顺利拿到心仪的offer。
返回列表