大厂面经:大疆嵌入式面试题及参考答案(4万字长文:持续更新)

目录

                  Linux 中断流程,谈谈你对中断上下文的理解

Linux schedule() 函数的原理和调用的时机

页表实现机制,分页的缺点?

介绍操作系统的多级反馈调度策略,时间片轮转,在项目中如何指定优先级来调度进程完成快速响应(nice 命令)

聊内存分配,进程内存分配,段页式存储,缺页中断,进程间通信的方式,为什么分用户空间和内核空间

详细说下进程间共享内存的分配,在哪个空间,读写速度怎么样,通信是否需要经过内核

实时操作系统的调度器设计细节?包括调度算法设计和上下文保存中的细节

一个操作系统中哪些地方会调用调度器?

一个信号量释放之后,在调度下一个线程的时候是如何选择的?

如何去评估一个操作系统的实时性是否满足要求?如何去测算中断响应时间?

MCU 上如何设计用户态和内核态?如何保障操作系统的安全性?

如果让你去开辟一个新的产品,你会想做什么?

平时做驱动外设的时候,有没有遇到过一些棘手的问题?如何解决的?

C++多态怎么理解?C++有哪些多态的典型例子?

C++了解吗?C++11 新特性用的多吗

C 语言字节对齐的规则,为什么要字节对齐?

C 语言程序运行时的内存分配

const 关键字的用法

copy_from_user 实现的原理?如果需要从内核中传递大量数据怎么办?

extern C 有什么用?为什么要和编译器声明 C 语言环境?C 语言环境和 C++有什么不同?

delete []和 delete 的区别?

C++为什么有指针还要引用?

线程切换是怎么设计的?

信号量、互斥量底层是怎么设计的?

内存管理是如何设计的?

中断管理是如何设计的?

你自己设计的 OS 相比于别人的,有哪些创新之处?

线程同步用过什么?

互斥锁注意过高低优先级翻转吗

自旋锁和互斥锁的区别,在中断中使用自旋锁要怎么避免死锁

U-cos 系统滴答时钟设置频率

多任务运行同步机制

能简单说一些你用过的 STM32 的一些芯片的配置吗?CPU 主频,Flash 和 RAM 分别都是多大的?

你在 STM32 上都做过哪些开发?

你开发过哪些驱动吗?

你了解整个 SPI 的通信过程吗?SPI 有几根线,分别是什么?你使用 SPI 的时候速率配置的是多少?

有使用过 DMA 吗?解释一下什么是 DMA?

SPI 有 4 种模式你知道是那 4 种模式吗?

你用过 GDB 调试吗?讲一讲常用命令。如果我编译报错,怎么定位错误位置,你知道 gdb 怎么进行多线程调试吗?

你知道回溯的概念吗?谈一谈栈回溯,采用 gdb 怎么调试?

在用户态开发中程序跑飞,出现段错误等情况,你通过什么方式去定位?

运行态的错误怎么调试?

对于一个无人机产品,基于目前市面上已有的产品,你还有什么新的设计想法?

如果要设计一个操作系统实现多线程,你会需要几个模块?

用过大疆哪些产品?RoboMaster S1

互斥量和信号量区别

项目中碰到的困难,怎么解决的。

无人机的未来(大疆产品优缺点)

对于临界区数据的处理,使用互斥锁和自己通过条件来判断,哪样更好,为什么?

上下文切换的时候系统做了些什么?

中断是如何产生的,具体的工作原理知不知道?

MMU 是什么东西?MMU 是如何实现虚拟内存和实际物理内存的切换的?

未初始化的全局变量放在什么地方?bss 段省的空间是什么空间?

说说 u-boot 启动流程。为什么 bootloader 要分两个阶段?

bootloader 第一个阶段为什么要足够的小?

对总线协议有哪些了解?I2C 和 SPI

I2C 的读写数据的步骤

虚拟地址如何转换成物理地址?MMU?

操作系统如何判断想要访问的物理地址是合法的还是非法的?

需要将所有的合法地址标记为合法的吗?

页表是如何初始化?

一个 ELF 文件加载到内存后,各个段的分布?

堆区和栈区之间还有什么区?

mmap 匿名页的映射?

mmap 返回的虚拟地址如何和具体文件关联起来?

gdb 使用过吗?

阅读过汇编代码吗?

c 语言函数的入参在汇编语言中是如何导入函数主体的?

用到的 STM32 芯片硬件有了解过吗?

STM32 中断控制器是什么?

对嵌入式开发有哪些了解?做了哪些准备?

FreeRTOS 的内存管理怎么实现的?

线程之间的通信方式?

FreeRTOS 任务抢占的机制

FreeRTOS 内存分配

未初始化的变量的初值是怎么样的?

### 如何在Keil中安装配置FreeRTOS #### 使用Keil内置工具一键为工程安装FreeRTOS 对于希望简化FreeRTOS集成过程的开发者来说,可以直接利用Keil MDK中的Pack Installer来获取并安装FreeRTOS。通过这种方式,无需手动下载和配置源代码件,只需几个简单的步骤即可完成整个设置过程[^1]。 #### 手动添加FreeRTOS至现有项 如果偏好于更传统的做法,则可以选择从官方网站下载最新的FreeRTOS压缩包,并按照特定路径将其加入到当前使用的开发环境当中。具体而言: - 将`FreeRTOSConfig.h`放置于项的适当位置以便后续修改中断优先级等相关参数; - 把针对标处理器架构优化过的端口层实现(例如ARM Cortex-M系列)复制过来以确保操作系统能够正常运行; - 创建名为`FreeRTOS`的新件夹用于容纳上述所有资源,并合理规划其结构使得管理更加便捷高效; 最后,在IDE里更新包含关系以及链接器脚本等内容,从而让编译器知道去哪里寻找这些新增加的部分[^2]。 #### 利用在线库创建含FreeRTOS支持的新STM32项 除了以上两种方式外,还有另一种更为简便的选择——借助Keil5提供的Online Packs功能直接基于模板构建带有实时调度能力的应用程序框架。这种方法不仅省去了繁琐的手工劳动环节,而且还能享受到官方维护团队所提供的持续更新服务[^3]。 #### 解决CubeMX生成代码与不同编译器之间的兼容性问题 当遇到由HAL库自动生成但仅适用于某些特定工具链(比如IAR EWARM而非GCC ARM Embedded Toolchain)的情况时,应当仔细检查涉及底层硬件访问部分的源码片段,必要时替换掉那些可能引起冲突的关键字表达式或是重写整段逻辑直至满足预期需求为止[^4]。 ```c // 示例:调整后的port.c (假设使用的是GCC) #include "stm32f1xx_hal.h" void vPortSVCHandler(void) __attribute__((naked)); __asm void vPortSVCHandler(void){ /* SVC Handler code here */ } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大模型大数据攻城狮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值