嵌入式面经第五弹:Momenta、瑞晟、OPPO、VIVO

本篇涉及的所有问题概要:大家可以试试在看参考答案前,提前尝试解答,以便明确自身知识点的不足部分!

想进大厂做嵌入式?想一次性拿下华为、博世、理想、韶音等20+公司的面试?这份超全嵌入式面经就是你的制胜法宝!

提前模拟来练习这些问题,面试不再慌!

剩下内容都在👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇

嵌入式面经第五弹:(嵌入式面经)第11章 20+公司面经杂谈(五):Momenta、瑞晟、OPPO、VIVO

1.中断里面通常可以睡眠吗,为什么?

2.什么是栈溢出,有什么方法检测?

3.MCU 与 MPU 的区别是什么?

4.讲一下Linux中断分为上半部和下半部的原因?

5.如果给线程访问加锁,是在驱动层实现还是应用层实现?

6.现在需要一个常量5来做一些运算,你会使用const还是define?为什么?

7.项目里的ADC多通道采集是具体采用什么方式?

8.说一下互斥锁,自旋锁的区别,在中断中可以用哪个锁?

9.怎么保证原子性操作?

10.专栏订阅奖励(支持模仿)——个人创新点问答:在你设计的FreeRTOS PLUS中提及修改任务控制块,增加优先级阶段继承属性,来进一步降低“优先级反转”的影响,展开说说?

---------------------------------------------------------------------------------------------------

1.中断里面通常可以睡眠吗,为什么?

在 Linux 内核或嵌入式 RTOS(如 FreeRTOS)中,中断处理程序(ISR) 不能进入 睡眠(sleep/wait) 状态。

主要有 两大原因

  1. 中断上下文的限制(缺乏调度支持)
  2. 中断设计的初衷——高实时性、不可阻塞

1. 中断上下文限制,缺乏调度支持

📌 什么是中断上下文?

  • 内核中的中断处理程序不属于某个特定进程,而是独立的执行实体,没有进程调度信息。
  • 没有进程的内核栈、调度信息、文件描述符 等数据结构,无法像普通进程一样被调度。
  • 缺少进程控制块(PCB),无法进行任务切换。

✅ 具体分析

  • 进程上下文(Process Context) → 进程有自己的 调度信息、内核栈、寄存器保存,可以被挂起并恢复。
  • 中断上下文(Interrupt Context)没有这些信息,如果 ISR 进入睡眠,就无法被调度器重新唤醒。

🚨 问题:

  • 进入睡眠后 找不到中断的上下文信息,唤醒后无法恢复,系统可能会崩溃。

2. 中断设计的初衷:高实时性,不可阻塞

📌 中断的核心任务

  • 中断的目的是 快速响应硬件事件,执行最小化的任务,然后尽快恢复系统运行
  • 如果中断中调用 sleep(),会导致 CPU 挂起整个系统,影响其他任务的执行。

✅ 为什么要避免阻塞?

  • 中断优先级比普通进程高,如果中断中进入睡眠,会导致 CPU 被占用,进程调度器无法调度其他任务。
  • 高优先级中断可能会阻塞低优先级进程,影响系统性能

3. 实例:为什么 ISR 不能调用 sleep()

📌 错误示例

🚨 在中断处理中调用 sleep()

  • msleep()会导致任务挂起,但中断上下文没有进程调度信息,无法恢复。
  • 可能导致系统崩溃Kernel Panic
  • 📌 正确做法:使用 workqueuetasklet

    中断处理程序中,只做必要的工作,然后将复杂任务交给其他线程(如 workqueue)。

    解决方案:使用 workqueue

  • ISR 只负责触发任务,不会阻塞中断
  • workqueue 运行在进程上下文,可以 sleep()
  • 结论

    使用 workqueuetasklet 处理复杂任务

    避免在 ISR 中使用 sleep(),改为调度后台线程处理

    2.什么是栈溢出,有什么方法检测?

    1. 什么是栈溢出?

    栈溢出(Stack Overflow)是指程序在运行过程中,函数调用栈空间超出系统分配的范围,导致程序崩溃或行为异常。

    由于栈空间是有限的,如果程序需要的栈空间超过了系统分配的最大限制,就会发生栈溢出

    2. 栈溢出的常见原因

    📌(1)函数调用层数过深

    无限递归/深度递归 会不断地向栈中压入新的栈帧,最终超过栈的最大空间,导致栈溢出。

    示例:递归导致的栈溢出

    由于 stack_overflow_function()没有终止条件,递归会无限增长,最终导致栈空间被耗尽,程序崩溃。

    📌(2)占用栈空间过大的局部变量

    如果一个函数中的局部变量过大,尤其是大数组结构体,也可能导致栈溢出。

    示例:局部变量过大导致栈溢出

    🚨 问题:

    • 局部数组 buffer 占用了 10MB 的栈空间,大于默认栈空间,导致栈溢出。

    3. 栈溢出的后果

    4. 栈溢出的检测方法

    📌(1)哨兵检测(Stack Sentinel)

    • 在栈的起始地址结束地址放置特定的标志值(哨兵值),然后在任务切换或关键点检查这些值是否被修改。
    • 如果哨兵值被改写,说明发生了栈溢出!

    示例:哨兵检测

    • 只适用于单任务环境,如果多个任务共用栈空间,可能检测不到问题。

    📌(2)栈指针范围检测

    • 在任务切换时检查 SP(栈指针) 是否越界
    • 如果 SP 低于分配的栈空间,说明栈溢出

    示例:FreeRTOS 栈溢出检测

    📌 FreeRTOS 需要在 FreeRTOSConfig.h 启用检测

    📌(3)使用 ulTaskCheckFreeStackSpace() 监测任务栈

    FreeRTOS 提供的栈检查 API

    📌 如果 freeStack 过小(如 <20),可能需要增加栈空间!

    📌(4)GCC 编译器保护(-fstack-protector

    • 启用 -fstack-protector 选项,可以在函数返回时检测栈溢出
    • 原理:编译器在栈上存放"Canary" 保护值函数返回时检查 Canary 是否被修改如果被篡改,则触发 stack smashing detected

    启用 -fstack-protector

    gcc -fstack-protector -o test test.c

  • 只能检测函数返回时的溢出
  • 不能检测无限递归
  • 5. 如何预防栈溢出

    (1)避免深度递归

    • 用循环代替递归
    • 尾递归优化

    (2)减少局部变量的栈空间

    • 大数组使用 malloc() 在堆上分配
    • 减少函数嵌套调用

    (3)合理分配栈大小

    • 在 FreeRTOS/Linux 任务创建时,合理设置 STACK_SIZE
    • 监测 uxTaskGetStackHighWaterMark() 确保栈足够

    (4)使用 -fstack-protector 进行编译器保护

    gcc -fstack-protector -o my_program my_program.c

    (5)启用 configCHECK_FOR_STACK_OVERFLOW

    结论

    🚀 防止栈溢出,需要合理分配栈大小、优化代码结构、并启用硬件和软件监测机制! 🎯

    3.MCU 与 MPU 的区别是什么?

    • MPU(Microprocessor Unit) 适用于复杂运算的大型程序,通常需要外挂 RAM 和 ROM
    • MCU(Microcontroller Unit) 适用于中小型控制程序内部集成 RAM 和 ROM,无需外挂存储器。

    1. MCU(微控制器)

    特点:

    • 集成度高:MCU 典型地将 CPU、RAM、ROM、GPIO、定时器、ADC、PWM、串口(UART/I2C/SPI) 等外设集成在一颗芯片内
    • 成本低:由于 MCU 的所有组件都集成在同一芯片中,硬件设计成本较低。
    • 低功耗:适用于低功耗设备(如 IoT 设备、工业控制、汽车电子)。
    • 高实时性:一上电即可运行,无需操作系统,也可以跑 RTOS(如 FreeRTOS)。
    • 典型应用
  • 传感器数据采集(如 STM32 采集温湿度传感器)
  • 电机控制(如 STM32 驱动步进电机)
  • 显示控制(如 LCD、OLED、数码管控制)
  • 无线通信模块(如 ESP8266 进行 Wi-Fi 通信)
  • 例子

    • STM32F4(Cortex-M4)
    • AVR ATmega328(Arduino 用的芯片)
    • GD32F3(国产 MCU)

    2. MPU(微处理器)

    特点:

    • 高性能:MPU 适用于复杂计算,如 AI、图像处理、多任务操作
    • 需要外挂 RAM 和 ROM
  • RAM 作为运行时存储(DDR3/DDR4)
  • ROM(Flash/eMMC)存储操作系统和程序
  • 运行完整的操作系统

  • Linux、Android、Windows CE、FreeBSD 等
  • 适用于需要 UI、多任务、复杂运算的设备

  • 智能手机、嵌入式 Linux 设备、工控机、网络路由器
  • 典型应用

  • 图像处理(如 AI 摄像头)
  • 多媒体播放(如智能电视)
  • 网络通信设备(如 OpenWRT 路由器)
  • 例子

    • 树莓派(Raspberry Pi)
    • NXP i.MX 6/8(Cortex-A 系列)
    • Allwinner H3/H5(电视盒子芯片)
    • Rockchip RK3399(安卓平板/开发板)

    3. STM32(MCU) vs 树莓派(MPU)

    4. 为什么导弹、工业控制用 MCU?

    1. 高实时性:MCU 上电即运行,而 MPU 需要加载操作系统,延迟高
    2. 功耗低:MCU 可以低功耗运行,而 MPU 需要较大功耗运行。
    3. 稳定可靠:MCU 运行裸机或 RTOS,没有 OS 崩溃的风险

    总结:

    • MPU 适合需要操作系统、复杂运算(如 AI、Linux 设备)
    • MCU 适合实时控制、低功耗应用(如 STM32 控制电机、传感器)

    剩下内容都在👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇

    嵌入式面经第五弹:(嵌入式面经)第11章 20+公司面经杂谈(五):Momenta、瑞晟、OPPO、VIVO

    #牛客在线求职答疑中心##嵌入式转岗的难度怎么样##嵌入式操作系统开发工程师##嵌入式笔面经分享##嵌入式#
    全部评论

    相关推荐

    韶音科技-嵌入式面经韶音给我的感受还是很不错的,分享一手面经一面-hr面-30分钟主要聊聊家常,问题都比较常规吧,真诚回答就行二面-专业面-30分钟自我介绍想聊一聊哪个项目?项目是如何进行通信的?有哪些措施来保证数据的可靠性?讲一讲CRC校验讲一讲你了解的linux操作系统项目能实现哪些功能?多线程开发需要注意些什么?遇到哪些困难?为什么选择嵌入式开发方向?反问三面-专业面-30分钟自我介绍项目介绍介绍一下Linux操作系统线程和进程的区别,分别是怎么通信的用户空间和内核空间的访问方式内存映射的适应场景?内存映射可能出现什么问题?自旋锁和互斥锁的概念是什么对epoll的理解EMMC读写是怎么用的?手撕:一道简单链表题(口述思路)反问战略和营销很多HC!韶音科技25届补招内推启动拉!!!深圳市韶音科技有限公司(简称“韶音科技”)创立于2004年,是一家专注于电、声产品研发、设计、生产和营销的专精特新重点“小巨人”企业。还有大量需求!使用内推码简历优先筛选,有任何问题包括进度查询可以私信我,内推后在评论区留言【姓名缩写+岗位】,方便捞人和确认投递状态研发,营销,供应链,财务,法务,专利,人资,IT,设计超多米哈游岗位近7年营收增长超百倍的科技公司等你加入!【内推链接】https://app.mokahr.com/m/campus-recruitment/aftershokzhr/36940?recommendCode=DSe1vF9A&amp;amp;amp;hash=%23%2Fjobs#/jobs【内推码】DSe1vF9A(内推简历有免笔试的机会!)使用内推码简历优先筛选,有任何问题包括进度查询可以私信我,内推后在评论区留言【姓名缩写+岗位】,方便捞人和确认投递状态 #春招#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#内推#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#内推码#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#秋招#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#韶音科技#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#牛客创作赏金赛#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    点赞 评论 收藏
    分享
    评论
    7
    38
    分享

    创作者周榜

    更多
    牛客网
    牛客企业服务