嵌入式面经第四弹:兆易创新、联影医疗、诺瓦星云、经纬恒润

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

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

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

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

嵌入式面经第四弹:(嵌入式面经)第11章 20+公司面经杂谈(四):兆易创新、联影医疗、诺瓦星云、经纬恒润

1.说一下局部变量与全局变量的区别。在MCU上空间上有什么不同吗?

2.内联函数和宏函数的区别,你知道吗?

3.进程与线程:区别与应用?

4.数组和链表有什么区别?

5.智能指针是什么,智能指针有哪些?

6.GD32/STM32的启动文件 (startup_stm32xxxx.s)了解吗 ?

7.中断与异常的区别?

8.你在FreeRTOS中如何给任务合理分配栈?

9.简单讲一下整个字符驱动怎么实现的?过程中实现了什么驱动功能?

10.专栏订阅奖励(支持模仿)——个人创新点问答:你机器人小车竞赛中的动态PD差速控制算法是什么,介绍一下设计思想?

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

1.说一下局部变量与全局变量的区别。在MCU上空间上有什么不同吗?

局部变量(Local Variable)和全局变量(Global Variable)是 两种不同作用域的变量,

它们在存储方式、生命周期、访问权限等方面存在显著区别,

尤其在 MCU(微控制器) 上,由于资源有限,二者的 空间占用 也存在明显不同。

1. 局部变量(Local Variable)

📌 特点

📌 示例

📌MCU 上的存储

  • 局部变量默认分配在栈(Stack),函数调用时自动分配空间,函数返回后自动释放
  • 栈空间有限(通常只有几 KB),如果使用过多局部变量,可能导致 栈溢出(Stack Overflow)
  • 局部变量在多次调用时不会保留上次的值(除非使用 static 关键字)。

2. 全局变量(Global Variable)

📌 特点

📌 示例

📌 MCU 上的存储

  • 全局变量存放在 RAM 的数据区(BSS 或 DATA 段)
  • BSS 段:未初始化的全局变量(默认初始化为 0)。
  • DATA 段:已初始化的全局变量。
  • 占用 RAM 的空间固定,如果 RAM 资源紧张,会影响系统性能。

3. 局部变量 vs. 全局变量的空间分布(MCU)

在 MCU(如 STM32)中,RAM 的存储结构一般如下:

📌 空间上的不同点

  • 局部变量存储在栈中,每次函数调用时动态分配,函数返回后释放
  • 全局变量存储在 BSS 或 DATA 段中始终占据 RAM 空间,不会自动释放。

4. static 变量

static 变量在局部变量和全局变量之间提供了折中方案

  • 局部 static 变量:作用域仍然是局部,但生命周期变成 全局
  • 全局 static 变量:作用域限制在当前文件,不能被其他文件访问(避免变量冲突)。

📌 示例

📌 局部 static 变量存储在 DATA 段,不在栈中,所以不会随着函数调用和返回而释放。

5. 何时使用局部变量 vs. 全局变量

  • 优先使用局部变量,避免全局变量污染命名空间。
  • 使用 static 修饰局部变量,如果需要长期存储但不想影响全局空间。
  • 全局变量应谨慎使用,否则可能导致数据竞争或难以维护的代码。
  • 结论

    📌 在 MCU 上,由于 RAM 资源有限,应避免全局变量过多,以免影响系统性能!

    🚀 总结

    • 局部变量更节省空间(栈自动管理)。
    • 全局变量更占用 RAM(始终驻留)。
    • 合理使用 static,避免全局变量污染
    • MCU 资源有限,应优先使用局部变量,避免栈溢出或 RAM 过度占用!

    2.内联函数和宏函数的区别,你知道吗?

    在 C 语言和 C++ 中,内联函数(inline)宏函数(#define 宏) 都用于减少函数调用开销

    但它们在实现方式、编译过程、安全性等方面有显著区别。

    1. 内联函数(Inline Function)

    📌 定义

    • 通过 inline 关键字定义的函数,编译时会直接展开到调用处,避免普通函数的调用开销。
    • 适用于 短小、频繁调用 的函数,提高执行效率。

    📌 示例

    📌 运行机制

    • 编译时 square(5) 替换为 5 * 5,避免了普通函数的 入栈/出栈 开销。
    • inline仅是建议,编译器可能忽略,特别是当函数过于复杂时。

    📌 优势

    避免普通函数调用开销(如入栈、出栈、参数传递)。

    有类型安全检查(确保参数和返回值匹配)。

    支持调试(能够查看展开后的代码,支持 gdb 调试)。

    适用于 C 和 C++,特别是 C++ 中的类内联函数

    📌 限制

    无法递归调用(编译器不会无限展开)。

    仅适用于短小函数,否则代码膨胀(Code Bloat)

    编译器可能忽略 inline 关键字,最终仍然按普通函数处理。

    2. 宏函数(Macro Function)

    📌 定义

    • 使用 #define 预处理指令定义的函数在预处理阶段直接替换
    • 无类型检查,仅仅是文本替换

    📌 示例

    ⚠️ 如果调用 SQUARE(5+1),会被展开为 (5+1 * 5+1),结果错误。

    📌 运行机制

    • 预处理阶段,编译器直接将 SQUARE(5) 替换为 (5 * 5)
    • 不会进行类型检查,也不会在符号表中创建函数。

    📌 优势

    无函数调用开销(因为是简单的文本替换)。

    比内联函数更早处理(预处理阶段)

    适用于简单的数学运算和编译开关(如 #ifdef

    📌 限制

    无类型检查,可能导致错误,例如 SQUARE(5+1)

    无法调试(无法在 gdb 里设置断点)。

    3. 内联函数 vs. 宏函数

    4. 适用场景

    适合使用 inline 内联函数

    • 短小、逻辑简单的函数,如:

    • C++ 类成员函数

    • 需要调试、类型安全 的函数。

    适合使用 #define

    • 编译开关

    • 简单的数学计算(但要小心副作用)

    结论

    推荐使用 inline 代替 #define,因为:

    • 更安全(有类型检查)
    • 可调试
    • 避免 #define 的副作用

    仅在编译开关等场景下使用 #define

    🚀 最佳实践

    • 短小计算函数:用 inline
    • 编译选项:用 #define
    • 避免宏副作用,如 #define SQUARE(x) (x*x)

    🎯 总结:inline#define 宏的安全替代方案,优先使用 inline,避免 #define 带来的问题!

    3.进程与线程:区别与应用?

    在操作系统中,进程(Process)线程(Thread)并发执行的基本单位

    但它们在资源管理、执行方式、通信方式等方面有显著区别。

    1. 进程(Process)

    📌 定义

    • 进程是程序执行的独立单位,它拥有自己的地址空间,是操作系统进行资源分配和调度的基本单位。
    • 每个进程至少包含一个线程(主线程),但也可以包含多个线程(多线程进程)。

    📌 特点

    📌 示例

    🚀 执行 fork() 后,进程会被复制,父进程和子进程拥有独立的地址空间

    2. 线程(Thread)

    📌 定义

    • 线程是进程的最小执行单元一个进程可以包含多个线程,这些线程共享相同的地址空间
    • 线程是更轻量级的并发执行单元,能比进程更快地创建和切换

    📌 特点

    📌 示例

    🚀 pthread_create() 创建的线程与主线程共享数据,可快速切换

    3. 进程 vs 线程:详细对比

    4. 进程 vs 线程的应用场景

    使用多进程(Process)

    • 独立任务(数据库服务器、浏览器进程)
    • 需要高稳定性(避免一个进程崩溃影响其他进程)
    • 分布式计算(不同进程运行在不同服务器上)

    使用多线程(Thread)

    • 高效并行计算(Web 服务器、多线程下载)
    • 共享数据(游戏引擎、图像处理)
    • 降低开销(线程切换比进程快)

    结论

    🚀 进程 提供独立的执行环境,适用于需要隔离的任务

    🚀 线程共享地址空间,适用于需要快速共享数据的任务。

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

    嵌入式面经第四弹:(嵌入式面经)第11章 20+公司面经杂谈(四):兆易创新、联影医疗、诺瓦星云、经纬恒润

    #牛客激励计划##嵌入式转岗的难度怎么样##通信/硬件秋招总结##嵌入式笔面经分享##嵌入式#
    全部评论

    相关推荐

    25春招笔试完就开始面试了,提前给大家分享个去年的面经1.自我介绍2.可以说一下IOC和AOP吗?3.IOC有什么好处?3.Spring aop有几种代理模式?4.第二个项目是个人项目吗?5.Java的面向对象有几大特性?并说说你对这几个特性的理解6.关于Redis的了解,你在这个项目中用Redis做了什么?7.aof和rdb是什么技术?区别是什么?8.redis集群技术你了解吗?9.redis的一个key过来会分配到哪个机器上,算法是怎么样的呢?它有一套自己的算法,做一个映射10.hashmap和hashtable的区别?11.concurrent hashmap的阈值是多少?12.hash冲突的话有几种解决方式线性探测,平方探测,拉链法13.介绍一下hashmap的扩容因子,初始扩容因子是多少,初始数组容量是多少14.在你的项目中,kafka是用来做什么的?15.说一下redis的缓存雪崩,缓存穿透怎么解决的?16.缓存穿透怎么解决的?答:布隆过滤器 追问:有其他的解决方案吗?17.redis热点key过期了,怎么处理?大量用户同时访问一个key,热点失效了,动态调整失效时间18.项目中的es是做什么的?问了论文,专利19.Java用了多久了?平时遇到过OOM的状况吗?介绍了一次full gc20.介绍一下JVM的内存模型21.CMS垃圾回收和G1垃圾回收的区别22.关于Zookeeper?23.介绍一下Spring, Spring MVC, Spring Boot, Spring Cloud?24.微服务之间的通信方式?RPC25.数据库用的是什么?MySQL 哪个版本?26.讲一下数据库的事务?ACID特性27.MySQL事务的隔离级别:读未提交,读已提交,可重复读(默认隔离级别),串行化四个隔离级别分别解决了什么问题28.介绍一下七层网络架构29.介绍一下ARP协议,这是哪一层协议30.关于传输层协议了解哪些?TCP和UDP,介绍一下应用场景31.说一下Https和Http的区别32.Https的加密方式? 对称加密+非对称加密33.说一下Http请求建立时候的错误代码34.手撕一下二叉树的中序遍历?先写递归,再写非递归小米公司校招内推码: BAD31ZQ 投递链接: https://xiaomi.jobs.f.mioffice.cn/referral/campus/position/?token=NTsxNzQxNjU5NDI4MzU5OzcyNTI2MjA3NTAxMzI5MDQwNDQ7NzQyNzMxNTUyNTI5NjI5MTk0OA小米公司社招内推码: BAD31ZQ 投递链接: https://xiaomi.jobs.f.mioffice.cn/referral/position/?token=NTsxNzQxNjU5NDgzMTM1OzcyNTI2MjA3NTAxMzI5MDQwNDQ7NzQyNzMyNzM3MjQyNzYyNDU1Ng#小米内推##小米##春招##面经##内推#
    小米集团
    |
    校招
    |
    超多精选岗位
    点赞 评论 收藏
    分享
    卓驭就是以前的大疆车载事业部,后来拆分出去成独立的子公司了。我去年十一月的时候Boss上联系过卓驭的HR,结果让我投,交过去就什么反应都没有了。这次实习一开我就投了,投了底软开发和中间件开发。周三下午HR突然打电话来说看了简历觉得我和中间件岗位很合适,让我准备一下周四的面试,并且告诉我这个岗位只有一轮面试,过了就能去上班。(bg双偏上9,喜欢嵌入式和底软,其他的在我其他面经里面也能找到。)于是周四早上十点半我就等在那里了,面试官看上去比较友好,没有迟到。1.简单自我介绍,那我就简单说了说我的学历,以及我的项目。2.看到我简历上有实习经验(其实是我导师的公司,横向做过两个项目开发),问了问我具体在这两个项目中的作用,我就稍微解释了一下我在实验室做的一些东西。3.C++八股,首先问了一下内存管理相关的东西。然后智能指针,问我shared_ptr可能存在的坑(那当然就是之前说过的要用make_shared来新建智能指针)。然后再问了问进程IPC,那当然还是那六个经典进程。4.我看过MISRA-C,问我有哪些现在经常乱用但其实不规范的事情,我首先说了个i++和++i。然后他让我再举个例子,我就举了Linux-C规范里宏函数的事情,在MISRA-C里面尽量用inline代替。到这里其实就感觉他已经问完了(说实话这也是我立刻觉得很不对劲的地方),接下来的就是聊天+HR面的感觉。5.问我在导师公司里做的东西的难点有哪些,我稍微解释了一下调参的事情。6.问我压力比较大的时候怎么排解。7.问我怎样快速融入一个陌生的工作环境。8.问我觉得公司和学校开发的区别有什么。9.解释了一下卓驭做的东西。后面是反问环节,我就问了一下嵌入式中间件主要做什么。他说嵌入式底层软件是直接和硬件打交道,处理数据,然后交给嵌入式中间件来进行处理,处理完毕之后再交给上层的应用层软件,类似一个配接器的感觉。面试体感还行,但是怪怪的,30分钟就像有20分钟的HR面。——————————————————————————————————————3.28今天HR给我打了电话,相当于是口头offer,让我在周一前给一个答复。我开始其实很纠结去了会不会并不是我喜欢的,以及到底能学到多少东西。结果越查越不对劲,中间件确实如那位面试官所说的那样是中间数据处理,但是卓驭的嵌入式中间件实习生不是——从官网和其他实习生的信息得知,这家公司的中间件实习生实际上更多做的是QA测试和写文档。虽然我是不求实习生能接触核心业务,但是如果去了之后只能写文档的话,我觉得我有点不太能接受。。。可能周一再问问HR确认一下,如果去了真是做测试和文档,那我可能就拒了比较好。
    查看10道真题和解析
    点赞 评论 收藏
    分享
    评论
    4
    7
    分享

    创作者周榜

    更多
    牛客网
    牛客企业服务