第一章-非RTOS
-
bootloader工作流程
-
MCU启动流程
-
通信协议,SPI IIC
-
MCU怎么选型,STM32F1和F4有什么区别
-
外部RAM和内部RAM区别,怎么分配
-
外部总线和内部总线区别
-
MCU上的固件,数据是怎么分配的
-
MCU启动流程
-
IAP是怎么升级的,突然断电怎么办
-
挑了麦轮项目(因为大疆RM也是麦轮,面试官看样子比较感兴趣)
-
为什么用的CAN总线
-
你说一下spi和 i2c和 UART的 各自的工作方式优缺点?
-
你知道怎么判断栈溢出吗?
-
能简单说一些你用过的stm32的一些芯片的配置吗?CPU主频,flash和RAM分别都是多大的?
-
你在stm32上都做过哪些开发?
-
你开发过哪些驱动吗?
-
你了解整个SPI的通信过程吗?SPI有几根线,分别是什么?你使用SPI的时候速率配置的是多少?
-
有使用过DMA吗?解释一下什么是DMA?
-
SPI有4种模式你知道是那4种模式吗?
-
你在开发调试过程中有遇到过哪些难以解决的问题可以分享一下吗?
-
.你有做过一些比较大型的软件开发吗?就是一些比较大的功能需要做一些设计、分层的东西。
我说了其中一个项目分层驱动层、中间层和应用层。 -
中间层的设计你考虑了哪些因素?
-
堆和栈有什么区别?
-
先问点iic,spi基础知识,速率,工作模式。
-
ARM体系结构。然后被逮住问:7种异常是什么(没答全),中断触发到返回的具体行为(CM3权威指南里有),中断嵌套如何实现(NVIC相关),中断机制的具体实现(还在答中断具体行为,他问的应该是两级向量表如何查找),中断部分结束。
-
c知识指针与引用的区别
-
答了点单指令多数据流,感觉不感兴趣,又说了流水线冲突与解决,反问cache-miss什么情况,分支预测什么原理(高级计算机结构课上内容)。看来芯片方向看重体系结构的知识,课上学的终于有用了。
-
之后我就把自己的优势定位在ARM体系结构和CPU原理/OS任务切换与调度原理/静态链接知识(这里推荐《程序员的自我修养》)。
-
笔试考了DMA与中断传输的比较
-
画项目框图、我开始把所有项目叙述和重点问题全部写纸上,每天背一遍。
-
什么叫软硬实时、m4内核双堆栈机制、顺便答了arm模式切换和上下文切换,bootloader,链接原理,
-
在职学姐告诉我,应该答不喜欢华为的文化。
-
大华股份、算法工程化岗。提前准备了一些ucos移植,arm指令集流水线和静态链接的知识,事实证明,准备的方向很对,他很感兴趣。
-
问了ucos移植的细节,提到了一种并发的指令集
-
最后问我的优势劣势分别是什么,答优势是对底层原理的理解和对编译器的了解,劣势是不懂Linux。
-
中断机制,大概有多少中断,可修改向量表吗(通常不可,有例外),又问m4内核的双堆栈机制。BL指令的跳转范围(32MB)。
-
静态链接,深挖强弱符号的东西,最后说我对底层还是比较了解。
-
IIC与SPI的不同(片选方式,异步同步),IIC读写方向如何区分(地址位最后一位的高或低)
-
9轴数据的意义,答了姿态解算中队数据的融合。
-
手撕代码环节,特意找了个最简单的给我,牛客原题链表表示的两数相加
-
问信号量,进入临界区的操作,为什么关中断可以保护临界区,cpsr如何保存。
-
问静态链接,预处理是什么编译选项,-g是什么意思,如何使用ar生成库文件,这块不熟,会不会gdb(不会)。那就说说makefile一条指令的格式,.c生成.o什么选项,.o生成.elf什么选项,.o与.elf的区别联系,举个区别的例子。
-
项目,直接画个框图给他,说的熟的不能再熟了。然后提问中断机制,这就进入了我的“模板”,然后重点问了流水线效率问题,为什么中断返回PC要减4,拿出试卷让我答没写完的题。然后让结合项目代码分析如何避免流水线冲突(调整指令执行顺序,分支预测,增加部件)
-
静态链接,也是熟的不能再熟的东西,是我亮点之一。
-
老生常谈,叙述中断机制,bootloader,模板开启引出流水线
-
如果使用C++导致MCU资源不够如何解决(答:直接操作寄存器)
-
相关的通信协议I2C;SPI;串口有没有用过
-
讲一下串口通信协议,串口通信如何校验,原理
-
有没有遇到过IO口输出电压稳定的问题,如何解决的
-
项目中有没有用到I2C,主要用在哪方面,讲一下选择I2C的原因
-
静态局部变量与局部变量的区别(很基础)
-
为什么局部变量未定义时,每次初始化的结果是不确定的?是个真随机数还是个伪随机数?(我答:与栈的工作过程有关)
-
那么嵌入式中栈的工作机制是什么?(不会)
-
我连续调用同一个函数两次,他的局部变量初始化结果是否会一致?
-
远程网络升级嵌入式,他就问我你有考虑过你的固件安全性问题吗?如果有其他人通过网络途径下载一个非官方的固件包,你怎么去判断?
C语言问题
-
函数指针了解么,在哪里有用到?
-
struct字节对齐了解么?
-
什么是大端小端?
-
内存分配函数了解么?如果系统中只有10K内存,而我要分配12K,能分配成功吗?如果能,那么将分配到的区域用memset进行初始化,会成功吗?
-
除了堆区,程序运行的内存中还有哪些区域?
C++问题
- 智能指针有了解吗?
- 容器了解吗?vector实现的机制是怎么样的?
- 迭代器有了解吗?讲解一下你的理解、
-
嵌入式单片机一面
1和32架构的区别
\3. Stm32处理中断的过程
\4. 保护现场保护什么东西(寄存器和堆栈)
\5. 要保护那些寄存器?
\6. Stm32是要中断嵌套的吗,什么时候需要什么时候不需要
\7. Cortex-m系列使用浮点会对stm32中断效率产生什么影响(不清楚)
\8. 对嵌入式哪方面比较深刻,研究比较深入的
\9. Uart是怎么样的接口
\10. Uart异步,不需要时钟,那为什么还要设定波特率
\11. Spi跟uart在使用上有什么区别
\12. Spi和uart需不需要区分主从
\13. Spi的从是否可以主动读写主的数据,怎么做到的
\14. 写iic、spi、uart驱动需要哪些注意的地方
\15. Iic、spi、uart接收方式有三种,轮询,中断和DMA,如果是中断收到的数据要谁去申请谁去释放
\16. 中断里数据往一个buffer去放,这个buffer要谁去申请
\17. 如何保证buffer读和写的互斥
static用法,变量存储位置
C语言编译后的内存分布
volatile变量作用?修饰哪些变量,为什么这些变量要用volatile修饰
SPI四种模式
串口发送一个字节多少位
?在做硬件驱动的时候,碰到的比较困难的问题? 项目中有制定通讯协议,就问有出现过什么通讯错误,出现错误了怎么办?通讯丢失怎么办?
-
STM32启动过程?
-
C++为什么有指针还要引用?
一些总结摘抄‘
作者:DJI小迷弟
链接:https://www.nowcoder.com/discuss/794763?channel=-1&source_id=profile_follow_post_nctrack
来源:牛客网C/C++
- static作用,变量加入static以后在内存中存储位置的变化。
- volatile作用
- C++为什么有指针还要引用,为什么不和JAVA一样抛弃指针
- delete和delete[]的区别
- 虚函数是用来干嘛的?虚函数机制怎么实现的?虚表指针在内存中的存放位置?
- C++多态怎么理解?C++有哪些多态的典型例子?
- 叙述程序编译都包含哪些阶段,每个阶段干了什么?
- CMake是如何包含文件目录的
- 全局变量和局部变量在什么地方?堆栈如何申请资源?
- C语言编译后的内存分布
- 我连续调用同一个函数两次,他的局部变量初始化结果是否会一致?(函数调用的过程)
- 你说静态局部变量存储在静态区,那么静态区的创建和消失是在什么时候?
- 我在windows里面运行了多个进程,其中一个进程执行完了,他的静态区会如何处理?(多进程的内存管理问题)
- 静态局部变量与局部变量的区别?为什么局部变量未定义时,每次初始化的结果是不确定的?是个真随机数还是个伪随机数?
- 嵌入式中栈的工作机制是什么?
- struct字节对齐了解么?
- 容器了解吗?vector实现的机制是怎么样的?
- 迭代器有了解吗?讲解一下你的理解
- 内存分配函数了解么?如果系统中只有10K内存,而我要分配12K,能分配成功吗?如果能,那么将分配到的区域用memset进行初始化,会成功吗?
-
处理器架构
作者:DJI小迷弟
链接:https://www.nowcoder.com/discuss/794763?channel=-1&source_id=profile_follow_post_nctrack
来源:牛客网处理器架构
- 51和32架构的区别
- MCU可以运行Liunux吗,为什么
- STM32启动过程(上电开始->main执行的过程)
- 中断响应执行流程,中断上下文指的什么,保存中断上下文是完成的什么操作,以STM32为例,都有哪些寄存器被保存
- STM32 F1和F4的区别
- Cotex-M系列使用浮点运算对STM32中断效率会产生什么影响
- STM32常见寄存器:R13(SP,堆栈指针),R14(LR,连接寄存器),R15(PC程序计数器)作用
- 什么是大小端模式
常见硬件接口协议/总线
SPI
- SPI有哪四种工作模式
(2)IIC
(3)UART
- Uart异步,不需要时钟,那为什么还要设定波特率
(4)FSMC
(5)AXI
四旋翼中的姿态解算算法是如何运行的?两个部分:一个是数据滤波,一个是姿态解算Mahony。
PID算法的实现是库还是自己写?自己写的,算法不难,难的是参数调试
讲一下PID算法的实现过程?
简单说一下spi协议,spi协议最大传输速度。什么是平衡二叉树,为什么要这样设计平衡二叉树?
链表和数组的区别,优劣?
IIC协议的最大通信速率、你觉得什么因素限制了IIC速度
问:stm32使用了哪些外设协议?
答:串口、iIC、spi、pwm
问:stm32使用了哪些外设协议?
答:串口、iIC、spi、pwm
问:做项目时,stm32芯片的选型?
答:外设数量、内存大小。
问:stm32程序出问题如何解决?
答:通过keil里的debug功能,端点、单步调试。
问:一些传感器的数据采集如何保证实时性?
答:通过在通用定时器的中断中释放信号量同步任务、ucos系统的延时函数实现。
问:如何调试PID参数,仿真还是实测?
答:配合上位机软件,在室内场地实际调试参数。
问:在飞行器遥控中,蓝牙通讯的距离对数据传输有无影响?
答:调试时飞行器与上位机的距离较近,没遇到这个问题。
下面大华单片机的题目
-
如何使用软件实现iic
-
spi有哪些信号线
-
从大一到大三写的代码多少行?手写内存复制函数,提问:s与d重叠时如何处理?
-
说一说c标准库的一些函数名,给我整懵了
深圳小米
-
操作系统的中断上半部和下半部
-
中断中不能执行什么函数
-
(手写笔试题)求斐波那契数列
-
看程序,回答输出。指针相关的题
南京地平线
- 询问飞行器项目,询问 飞行器项目的姿态解算算法,使用解算算法的优点,相比于卡尔曼算法的优点。实时操作系统的实时性是如何实现的。主要是考察对项目的掌握程度。
星宸科技
首先是一个技术官针对笔试提问、一步步引导我做出笔试题。然后提问了一些C语言的知识,内存管理等,RTOS的信号量、竞争等。
随后是主管面试,画图解释C语言实现动态内存分配。
ARM相关的
- ARM是32位,地址空间是
ARM是32位,地址空间是2的32次幂,4G地址空间。所有的外设(FLASH,RAM,SD卡等等)都映射到这4G的空间上。比如大部分ARM7都把RAM映射到0x40000000,所以对RAM的操作就在0X40000000开始的地址上。FLASH从0X0开始。使用FLASH还要考虑地址重映射,就是选择片内FLASH或片外FLASH。
FLASH一般是8位或16位,当它接到32位的ARM上时,地址位就会错位。对于16位FLASH,FLASH的A0要接ARM的A1。对于8位FLASH,FLASH的A0要接ARM的A0。ARM的A0对应8位,ARM的A1对应16位,ARM的A2对应32位,如果FLASH是32位,那么FLASH的A0接ARM的A2.
-
STM32启动方式和程序存储
https://blog.csdn.net/weixin_42279760/article/details/121063006
此文档主要介绍在stm32程序下载与运行时,FLASH和RAM的使用情况
1.背景介绍
因为stm32内部有两个存储空间,一个是片上的FLASH,一个是片上的RAM,其中FLASH相当于硬盘,其空间一般较大; RAM相当内存,其空间一般较小。不过使用者可以通过 BOOT1/BOOT0 引脚选择程序是在FLASH或RAM中运行(RAM运行执行效率较高)。2.存储概况
以stm32f103zet6为例,此芯片的FLASH的起始地址为0x08000000,SIZE = 0x80000共512K字节;RAM的起始地址为0x20000000,SIZE = 0x10000共64K字节(因为不同的SRAM芯片的型号不同,但是在stm32中的起始地址都是0x20000000+SIZE)。除此之外,还有一块为系统存储器起始地址为0x1FFFF000,SIZE = 0x7FF共2K字节,其中内置了ST提供的Boot Loader,可以通过该Boot Loader下载程序到FLASH,详细部分在此不做讨论。3.编译生成信息分析
Keil5 编译生成
compiling stm32f10x_tim.c…
linking…
Program Size: Code=7632 RO-data=336 RW-data=72 ZI-data=55640
FromELF: creating hex file…
After Build - User command #1: CopyHex_Flash.bat1
2
3
4
5
6
上图为Keil5工程编译生成信息,这些信息都代表着程序占用的空间。Code:表示程序代码部分所占空间
Ro-data:表示程序定义的常量所占空间(eg:const定义数据类型)
RW-data:表示已初始化的全部变量所占空间
ZI-data:表示未初始化的静态和非静态全局变量以及堆栈所占空间
在以下三种情况中FALSH和RAM的占用情况:运行时程序占用FLASH的大小 SIZE = Code + RO-data+ RW_data
运行时程序占用RAM的大小 SIZE = RW-data + ZI-data
烧录时程序占用FLASH的大小 SIZE = Code + RO-data + RW-data
4.疑问解析程序运行时RW为什么既在FALSH中出现又在RAM中出现呢?
这是因为FALSH部分属性为只读的,而RAM的属性虽然是读写但是里面的数据不能掉电保存,因此在烧录STM32程序的时候,只能先将RW-data保存到flash中,在上电之后系统再将flash中的RW-data拷贝到RAM中进行读写操作,因此在FLASH和RAM中都要留出RW-data的占用空间。
为什么烧录时没有ZI-data放在flash中呢?
这是因为ZI-data中的数据都是0,没必要包含,只有程序运行之前,将ZI-data所在的区域(这一区域在RAM中)一律清零即可。包含进去反而浪费FLASH的存储空间。 -
STM32F103的RAM和FLASH大小
小米嵌入式面经
1.变量声明和定义的区别
2.const和指针组合有几种情况,分别介绍一下。
3.项目中用到了spi,spi有几种工作模式,简单介绍一下。
4.static关键字
5.volatile关键字,举几个什么时候需要用到volatile关键字的例子。
6.进程与线程区别,通信方式
7.C语言内存分区,未定义的全局变存放在哪个区。
剩下问的问题很基础,就c语言加操作系统基础,太基础了反而记不清了。八股都答出来了,所以印象不是很深。
两面总共手撕三个代码:
1.删除链表重复节点。(剑指offer原题,难度中等)
2.将字符串里的数字提取出来然后转成数字打印。(难度简单,应该是leetcode的题,掌握数组基础即可,记得数字范围很大,用long接收)
3.一个循环输入,满足某某条件跳出结束即可。(难度在于用 scanf(****!=EOF);即可,牛客有输入练习,做多了就会了)
百度 北京 嵌入式linux(提前批
static,vailate,const关键字。
3.栈和队列。
4.数组和链表。
代码:
1.合并两个链表,按顺序。
2.去除字符串里面的空格。
马上面,1.5h
1.还问项目,问里面的难点,还问了一下本科的毕设,因为写在简历上。
2.也问了static关键字,函数里用static定义的变量,存在哪个区?
3.malloc,在函数里定义一个很大的数组,应该直接定义还是用malloc?
代码:
1.复制链表。
2.判断计算机是大端还是小端。
3.两数之和,leetcode第一题。
4.Linux使用多线程,实现软件定时功能。
华为 上海无线 嵌入式软件工程师
9.11 笔试
1.有向无环带权图,找关键路径。
2.内存分配算法。
3.两个数组,给定规则,求最长有连续关联数据的子数组。
9.24 一面,45min
1.介绍项目,问软件部分的结构框架
\2. static关键字
3.大小端,字节对齐,问网络通信一般是什么字节序?
4.存储结构,堆和栈的区别,还有哪些存储区?
5.宏函数和内联函数的区别。#define在编译的那个环节使用?
6.问指针问题,给出四行代码,问含义
int *p[10]
int (*p)[10]
int* (*p)[10]
int (*p)10
7.手撕一个代码,给定数组和一个整数k,问有多少长度至少为2且元素和为k的倍数的子数组。开始写的方法暴力,后面和面试官讨论说出来思路。
当天过了一小时二面,45min
1.介绍项目
2.大小端
3.字节对齐问题,给一个结构体
struct{
char a;
char b;
int c;
}
问在32位机器上,使用sizeof()多大,我说8字节,面试官说还可能是12字节,如果是这种情况:
struct{
char a;
int c;
char b;
}
4.数据结构,问满二叉树,完全二叉树,BST二叉搜索树,说自己的理解和区别。
5.快排,冒泡排序的时间复杂度,什么情况下快排时间复杂度比冒泡高?
6.手撕一个代码,二叉树路径总和位sum的路径有多少,不一定从根节点开始,但一定从上向下。用两层递归写出来。
7.问对无线通信有什么了解。
malloc分配的内存在哪里。
单片机启动程序,在执行main之前的是什么。
keil怎么使用库。
问了堆和栈的区别,static关键字。问到malloc()后不释放会怎样。
第二章-RTOS相关
-
操作系统基础,任务调度,同步,多线程
-
RTOS
-
你知道怎么判断栈溢出吗?
-
进程通信有使用过一些锁和同步的东西吗?
-
多个进程在获取不到锁的时候会进入什么状态?
-
A:阻塞。
-
假设一个低优先的进程A获取先到锁,高优先级的进程B获取不到锁,那高优先级进程B的进行也会阻塞吗?
-
A:还是会阻塞。
-
那如果还有一个任务C,优先级介于A和B之间,那么C任务会去抢占CPU资源吗?
会的.
-
那这样导致B等待资源的时候会越来越长,这样的问题有方法可以解决吗?因为B的优先级才最高。
A:先把A优先级提高,等A释放后再给B。
-
用什么方式提高A的优先级?
RTOS有函数可以提高。
-
那么A的优先级需要提高到多少?
面试过后才突然想起来,从问题15-20,其实面试官想考的是“优先级反转问题”。但是我当时回答的磕磕绊绊,甚至有一些错误。
-
又问我信号量组织方式
-
问单片机与嵌入式系统的最大区别在哪里,答嵌入式系统可以跑多任务,然后逮住OS开始问。任务在内存中的组织方式(TCB-用户栈-用户代码),上下文切换时任务在内存中是如何变动,任务调度点,优先级反转如何解决,任务抢占如何发生,通信机制。
-
信号量实现的底层原理,可不可以用一个全局变量代替信号量的计数值,答不可以信号量是临界资源要进临界区,问怎么进临界区,答关中断保存cpsr,他比较满意。
-
大疆一面:问项目,反复问上系统的必要性,估计是个搞os的根本不懂四轴,以前栽过,这次答圆了,又主动答了中断机制,看他不是很感兴趣。最后问我懂不懂os的内存管理,答不懂,之后就是笔试编程为啥不做,答嵌入式对算法只是了解,项目里没用到。
-
二面,把四轴的控制流程说了一遍,他对四轴还是懂一点,但飞控算法没问,难道大疆不该很看重这一块吗,把所有项目大概都问了一遍,无异常。然后问,你的劣势在哪,答不会Linux,又问我图像处理的算法,靠本科上课学的还没忘干净的知识答一点,中位数滤波,边缘滤波,想深问,我说我只是了解。感觉他不很满意
-
二面挂了,挂的很不甘心,我的cpu原理知识还没吐出来呢,静态链接也没问,arm这块就问了个中断机制。回来反思为什么引不出自己的优势,感觉自己所答还是很零散,中断就中断,os就os,指令集就指令集,串不起来。后来我**找到一种组织的方式,**能从中断入手把arm架构,上下文模切换,指令流水和程序优化串起来讲,形成一个模板,只要问到其中某一个知识我就能把全部一串说出来,他感兴趣自然再深问。涨了一波经验,挂的不亏。
-
双堆栈机制与模式切换,任务调度点与任务在内存中的组织方式(TCB-用户栈-用户代码),优先级反转与解决,死锁的原因,然后makefile语法一个。
-
问CPU知识,“模板”用上了。先问m4 的双堆栈与上下文切换,17个寄存器的功能,LR的作用。顺势答为何中断返回要LR中的值减4,然后指令流水、CPU知识就跟着出来了。又问分支预测发生在指令处理的哪个阶段,cache的作用,回写与写透的区别,为什么设计三级缓存。
-
线程切换是怎么设计的?
-
信号量、互斥量底层是怎么设计的?
-
内存管理是如何设计的?
-
中断管理是如何设计的?
-
你自己设计的OS相比于别人的,有哪些创新之处?
-
实时操作系统的调度器设计细节?包括调度算法设计和上下文保存中的细节
-
一个操作系统中哪些地方会调用调度器?
-
一个信号量释放之后,在调度下一个线程的时候是如何选择的?
-
如何去评估一个操作系统的实时性是否满足要求?如何去测算中断响应时间?
-
MCU上如何设计用户态和内核态?如何保障操作系统的安全性?
-
平时做驱动外设的时候,有没有遇到过一些棘手的问题?如何解决的?
这是一个人的
-
我的项目中freertos创建了几个任务,都是干嘛的,任务之间如何设计数据交互,反正基本上属于让你把项目给他完完整整的介绍清楚
-
静态局部变量与局部变量的区别(很基础)
-
为什么局部变量未定义时,每次初始化的结果是不确定的?是个真随机数还是个伪随机数?(我答:与栈的工作过程有关)
-
那么嵌入式中栈的工作机制是什么?(不会)
-
我连续调用同一个函数两次,他的局部变量初始化结果是否会一致?
-
最后面试官说,其实我想问一下你函数调用的过程。
-
然后你说静态局部变量存储在静态区,那么静态区的创建和消失是在什么时候?(答:创建时根据程序需求在主函数执行之前执行一个准备函数,其中进行内存申请,消失是随着程序的退出而消失)
-
那么我在windows里面运行了多个进程,其中一个进程执行完了,他的静态区会如何处理?
-
最后面试官说,可能你所接触的都是单进程,很少甚至忽略进程这个概念,其实我想问的是多进程的内存管理问题。
-
你任务的优先级是怎么安排的,高优先级的的线程RTOS会怎么样处理?
-
相同优先级的几个线程是怎么运行的?
- 对于临界区数据的处理,使用互斥锁和自己通过条件来判断,哪样更好,为什么?
- 上下文切换的时候系统做了些什么?
Linux问了多线程的处理,我只是用树莓派做过小项目,就回答了一下在树莓派中我是怎样处理的,然后面试官问,如果你用的是四核心处理器,那么分配300个线程合理吗?怎样分配才算合理?
面试官还问了多进程,但我没用过,直接就说没有了解过了。
-
RTOS中哪里会进行线程调度
-
线程切换为什么用PendSVC,有什么优势
-
线程优先级反转,如何解决?
-
用了rtos,所以详细问了几个线程间的通信和同步,并问为什么用这种方式并设置场景让我换别的方案
-
RTOS采取哪些手段保证他的实时性
操作系统
- Freertos支持的任务调度方式,详细说下每种方式
- 任务(线程)间通信方法
- 进程和线程的区别
- 互斥量和信号量的区别
- 优先级翻转,如何避免优先级翻转
- STM32任务切换为什么用PendSV
- FreeRTOS的内存管理怎么实现的?为什么这么做?
- 对于临界区数据的处理,使用互斥锁和自己通过条件来判断,哪样更好,为什么?
在你的项目中有无接触过信号量、资源争抢的情况(无、但我举了一个信号量同步的问题)
RTOS的实时性如何保证、RTOS中如何测量任务的运行时间、RTOS的中断如何管理、RTOS的并发竞争、IIC协议内容、