电子产业一站式赋能平台

PCB联盟网

搜索
查看: 12|回复: 0
收起左侧

嵌入式大厂地狱级面试题曝光:ST、大疆、华为最看重哪些底层能力?

[复制链接]

296

主题

296

帖子

2321

积分

三级会员

Rank: 3Rank: 3

积分
2321
发表于 昨天 08:00 | 显示全部楼层 |阅读模式
关注公众号,回复“入门资料”获取单片机入门到高级开挂教程
开发板带你入门,我们带你飞

文 | 无际(微信:2777492857)
全文约4366字,阅读大约需要 10 分钟
雷猴啊,相信你一定经历过投简历投到手软,笔试做得头昏脑胀,好不容易挤进面试环节,结果被面试官几个问题问得怀疑人生。
           
尤其是嵌入式领域的大厂,像ST(意法半导体)、大疆、华为等等,甚至是一些中型公司,面试题简直是“地狱级”难度,像亲身体验西游记,九九八十一难等着你去闯。
           
今天,作为一个在嵌入式圈子里摸爬滚打过、也帮不少朋友改过简历、聊过面试的技术朋友,我来给你们扒一扒这些大厂最看重的底层能力,顺便曝光一些让人瑟瑟发抖的面试题。
           
无论你是应届生、转行者,还是单片机工程师,这篇文章都能让你少走点弯路,离offer近一步。
           
1. 嵌入式面试:不是“你会不会”,而是“你行不行”
嵌入式开发是个硬核领域,门槛不低,技术栈又深又广。大厂面试官可不是来跟你聊人生的,他们的目标很明确:用最短的时间搞清楚你的底层能力够不够硬,能不能扛得住实际项目的折腾。
           
所以,他们的问题往往不是“你会不会用STM32点个灯”,而是“你能不能在资源紧张、项目周期逼死人的情况下,把代码写得又快又稳,还不崩”。这就要求你对底层原理有深刻的理解,而不是只会调库、抄例程。
           
假设你现在刚毕业,觉得自己STM32玩得溜,51单片机也刷过几个项目,结果去面某大厂,被问了个问题直接懵了:“假设你手头有个MCU,Flash只有32KB,RAM 4KB,现在要实现一个实时采集加处理的系统,你会怎么设计内存分配?”   
           
然后你支支吾吾半天,说“我可以用FreeRTOS,任务分开跑”。
           
面试官冷笑一声:“32KB Flash能放下FreeRTOS加你的应用代码?再说一遍约束条件。”
           
你当场就哑了,最后连个“再见”都没捞到。
           
这事儿告诉我们什么?大厂不看你花里胡哨的“技能树”,他们要的是你解决实际问题的能力,尤其是底层的那一套:内存管理、中断机制、硬件调试、代码优化。这些东西,才是面试官眼里的“硬实力”。
           
2. 芯片厂
先说说ST(意法半导体),这家公司的STM32系列单片机几乎是嵌入式工程师的“初恋”,谁还没点过那颗跑马灯呢?但你以为ST的面试会让你舒舒服服聊聊GPIO配置?太天真了!ST作为一家硬件起家的公司,面试题直指你的硬件功底,尤其是对寄存器的掌控能力。
           
我听过一个经典的ST面试题,面试官上来就扔了个场景:“STM32F103的ADC采样,你用DMA搬数据,假设要连续采集10KHz的信号,怎么配置才能保证数据不丢?”
           
这题乍一看不难,很多人会说:“配置ADC为连续模式,DMA设成循环模式,搞定。”
           
但面试官会追问:“那如果DMA缓冲区溢出了怎么办?你怎么知道溢出发生了?能不能写个代码片段检测一下?”这时候,如果你只知道API调用,估计就得翻车了。   
           
答案的关键在于,你得熟悉STM32的参考手册,知道DMA的传输完成标志位(TCIF)和半传输标志位(HTIF),还得会用中断或者查询的方式去检查溢出。
           
更狠的是,面试官可能会再加码:“如果系统还有其他高优先级中断打断DMA,你会怎么优化?”这就考验你对NVIC(嵌套向量中断控制器)的理解了,能不能合理分配优先级,保证实时性。
           
像这种芯片厂,对底层能力要求比较高,你得对硬件寄存器了如指掌,能手写代码直接操作外设,而不是依赖HAL库那种“保姆式”工具。
           
所以,应届生和转行者们,去这种芯片厂,可以多刷刷题,尤其是外设那一章,GPIO、TIM、ADC、DMA这些常用模块的寄存器表。
           
3. 实时性
前面说了芯片厂对底层能力的要求,而有些大厂则对实时性有较高的要求,比如无人机之类的产品,实时性的要求简直到了变态的地步。
           
面试这类大厂,你得做好被“虐”的心理准备,他们的问题往往围绕实时操作系统(RTOS)和资源优化展开,稍微不留神就被打得满地找牙。
           
有个流传很广的大疆面试题,听起来简单,实则暗藏杀机:“用FreeRTOS实现两个任务,一个采集传感器数据,一个处理数据并发送,怎么保证采集任务不会被处理任务抢占时间,导致数据丢失?”
           
这题初看像是送分题,不就是设置任务优先级嘛,高优先级给采集任务,低优先级给处理任务,完事儿。   
           
但大疆面试官可没那么好糊弄,他们会追着问:“如果处理任务里有复杂的计算,阻塞时间超长,采集任务还是会被饿死,怎么办?你能写个伪代码展示一下调度策略吗?”
           
这时候,如果你只会调API,比如vTaskDelay()或者osDelay(),估计就得凉凉了。
           
正确的思路是,得用信号量或者消息队列来同步任务,确保采集任务的数据缓冲区不会溢出。
           
比如,可以用一个队列,采集任务把数据塞进去,处理任务从队列里取出来,这样即使处理任务卡住了,采集任务也能继续跑。伪代码大概长这样:
  • QueueHandle_t sensorQueue;void Task_Sensor(void *pvParameters){    while (1)     {        int data = read_sensor(); // 假设读取传感器数据        xQueueSend(sensorQueue, &data, portMAX_DELAY); // 塞进队列    }}void Task_Process(void *pvParameters) {    int data;    while (1)     {        if (xQueueReceive(sensorQueue, &data, portMAX_DELAY))         {            process_data(data); // 处理数据            send_data(data);    // 发送数据        }    }}void main() {    sensorQueue = xQueueCreate(10, sizeof(int)); // 创建队列    xTaskCreate(Task_Sensor, "Sensor", 128, NULL, 2, NULL); // 高优先级    xTaskCreate(Task_Process, "Process", 128, NULL, 1, NULL); // 低优先级    vTaskStartScheduler();}
    这代码不复杂,但你得在面试现场手写出来,还得解释清楚为什么这么设计。大疆想要的,是你对RTOS的调度机制、任务间通信、中断管理的理解。
               
    别以为背几个API就行,他们更看重你能不能在资源有限的情况下,把系统跑得又稳又快。
               
    还有个更狠的题:“如果MCU跑在低功耗模式下,突然来了个外部中断,怎么让系统快速唤醒并处理?”
               
    这题直接把你丢进功耗和实时性的两难境地,既要省电,又不能掉链子。
               
    答案得涉及低功耗模式的退出机制(比如STM32的STOP模式怎么配置EXTI唤醒),还有中断响应后的任务调度优化。大疆的无人机可不等人,实时性是命根子,你得证明自己能hold住。
               
    4. C语言功底够硬吗?   
    华为就不用多介绍了吧,嵌入式领域的大佬,业务覆盖从单片机到Linux驱动再到芯片设计,面试题自然也是“全面开花”。
               
    但不管你面的是单片机岗还是BSP岗,华为对C语言的考察都是重中之重。
               
    别以为会写个for循环就够了,他们要的是你对C语言底层机制的掌控力。
               
    有个华为经典面试题,估计不少人听过:“给你一个单链表,怎么判断里面有没有环?”这题在算法岗很常见,但在嵌入式岗也经常出现,因为它能测出你的指针操作能力。
               
    简单点的解法是快慢指针(Floyd判圈法),代码大概这样:
  • struct Node {    int data;    struct Node* next;};int hasCycle(struct Node* head) {    struct Node* slow = head;    struct Node* fast = head;    while (fast != NULL && fast->next != NULL)     {        slow = slow->next;        // 慢指针走一步        fast = fast->next->next;  // 快指针走两步        if (slow == fast) return 1; // 相遇说明有环    }    return 0; // 没环}
    这题不难,但华为面试官会加难度:“如果链表很长,内存很小,你会怎么优化?能不能不用额外变量?”   
               
    这时候,你得想到用位操作或者临时改动链表结构(比如把next指针反向),但得说明优缺点,比如改链表可能会破坏原始数据。
               
    华为想要的,是你对内存效率和代码健壮性的权衡能力。
               
    还有个更“阴险”的题:“写一个宏定义,交换两个变量的值,不用临时变量。”很多人的第一反应是:
  • #define SWAP(a, b) ((a) ^= (b), (b) ^= (a), (a) ^= (b)

    看着挺聪明吧?用异或操作,避免临时变量。
               
    但面试官会冷不丁问:“如果我传进来的是SWAP(x, x),会怎么样?”
               
    答案是灾难性的,因为同一个变量异或自己会变成0,结果两个值都清零了。
               
    这题考的就是你对C语言宏的副作用和边界条件的理解。
               
    正确的做法是老老实实加个临时变量,或者明确告诉面试官这种写法的局限性。
               
    华为的面试还有个特点,会结合岗位挖你简历里的项目。
                   
    比如你写了个I2C通信的项目,他们可能会问:“如果I2C从设备没响应,你怎么调试?”这就要求你不仅会写代码,还得懂硬件调试,比如用逻辑分析仪抓波形,或者手写个超时检测机制。
               
    总之,C语言得硬,硬件得熟,实战得强。
               
    5. 三家大厂的共性:底层能力是“敲门砖”
    看完ST、大疆、华为的面试题,你有没有发现点规律?不管他们问得多花哨,核心都在考察你的底层能力。
               
    啥叫底层能力?简单说,就是你对硬件、操作系统、编程语言的核心原理的掌握程度,而不是浮在表面的“调包侠”水平。
               
    这些能力,不是靠刷几道LeetCode或者背几个库函数就能搞定的,得靠平时积累。
               
    应届生可能觉得时间不够,但其实从现在开始,每天啃一点参考手册、写点裸机代码、调调中断,三个月就能有质的飞跃。
               
    转行者更得抓紧补基础,别指望“速成班”救命,面试官一眼就能看出你是不是“半吊子”。
               
    至于单片机工程师,恭喜你们已经有一定底子了,但别满足于“会用”,得往“精通”努力,尤其是优化和调试的实战经验。
               
    6. 如何备战:从“慌得一批”到“稳如老狗”   
    说了这么多“地狱级”面试题,你是不是有点慌?别怕,我给你支几招,让你从“慌得一批”变成“稳如老狗”。
               
    6.1 硬件基础:啃手册,写裸机代码
    参考手册虽然枯燥难懂,那是嵌入式工程师的“圣经”。
               
    挑个常见的MCU,比如STM32F103,从GPIO开始,一个外设一个外设地啃,写点裸机代码验证。比如自己实现个串口收发,别用库,直接操作寄存器,跑通了再加中断试试。
               
    时间不够?有个小技巧,可以通过标准库外设例程,去倒推寄存器配置,这样会快一点。
               
    实在不行,就多刷点题,碰碰运气吧,毕竟实际开发,其实也很少深入寄存器开发,太影响效率了。
               
    6.2 RTOS实战:玩转FreeRTOS
    有些厂喜欢考RTOS,那就找个项目,加个FreerRTOS玩玩,记住一定要深入做项目,因为开发板配套那些FreeRTOS教程,只是把每个功能介绍一遍,而实际项目开发,往往有特定资源、特定功能的限制,会让你学到很多细节。
               
               
    6.3 C语言特训:刷题+手写
    C语言是绕不过去的坎,可以多刷点指针和内存相关的题。   
               
    有些大厂面试时多半要手写代码,找张白纸练练,别到现场手抖写不全。
               
    像链表操作、宏定义、位操作这些,写熟练了再去面。
               
    6.4 项目复盘:把简历变成“防弹衣”
    简历上写的项目,面试官肯定会挖,挖到你答不上来就尴尬了。
               
    赶紧把每个项目复盘一遍,问自己:这个功能怎么实现的?遇到啥问题怎么解决的?能不能优化?最好准备个STAR法则(情境-任务-行动-结果)的回答框架,讲得有逻辑,面试官听着也舒服。
               
    6.5 调试能力:别只会printf
    大厂爱问调试,学会用调试工具,比如Keil的仿真模式,或者接个逻辑分析仪抓波形。
               
    至少得会看时序图,知道I2C、SPI这些协议长啥样。
               
    面试时随便甩一句“我用示波器测过SCL和SDA的时序,发现从机地址没响应”,保管让面试官眼前一亮。
               
    7. 技术是硬仗,态度是加分
    嵌入式大厂的面试确实难,但也没到“上天”的地步。
                   
    只要你肯下功夫,把底层能力练扎实,面试时再带点自信和条理,加上有学历加持的话,offer迟早是你的。

    end

    rxvaiqim5of640204505.jpg

    rxvaiqim5of640204505.jpg


    下面是更多无际原创的个人成长经历、行业经验、技术干货。
    1.电子工程师是怎样的成长之路?10年5000字总结
    2.如何快速看懂别人的代码和思维
    3.单片机开发项目全局变量太多怎么管理?
    4.C语言开发单片机为什么大多数都采用全局变量的形式
    5.单片机怎么实现模块化编程?实用程度让人发指!
    6.c语言回调函数的使用及实际作用详解

    7.手把手教你c语言队列实现代码,通俗易懂超详细!

    8.c语言指针用法详解,通俗易懂超详细!
  • 回复

    使用道具 举报

    发表回复

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则


    联系客服 关注微信 下载APP 返回顶部 返回列表