【嵌入式面试】嵌入式知识点面经整理

秋招java失败,2022年十二月份转战嵌入式。 这里主要整理牛客上的大佬无偿分享的一些嵌入式基本知识点面经

总线协议

总线协议如果弄清楚了能够在面试中获得加分

用过通信协议(SPI、IIC、UART等),一定要清楚具体细节。spi、ii2c的通信模式,几根线?IIC和SPI区别,UART奇偶校验?RS232、485、CAN、直连还是交叉等、SPI CAN?手绘I2C时序图?

画图解释can报文;

项目中用到了spi,spi有几种工作模式,简单介绍一下。

问了modbus协议中的一些内容

通信协议怎么设置的

蓝牙有遇到过丢包吗?

串口数据格式,空闲电平

串口你是怎么接收数据的,怎么判断一帧数据结束啥的?

I2C自己写得还是调库?驱动过哪些设备?通信过程?主机读完一个字节会应答吗,通信时应答和结束时应答有什么区别?

C基础/C++

c++面向对象的三大特征及其内容;

  • 封装:将类的方法或者变量设置为private,其他类不能够访问改类的一些封装成员,这样做的好处是增加代码的安全性。不能通过类直接修改该类的变量。如果要修改变量可以给外界提供方法来对变量进行修改,隐藏了实现细节。
  • 继承:子类继承父类,子类可以继承父类的方法和变量从而省去重复代码的编写。也可以覆盖父类的方法,从而实现不同的子类表现形式。
  • 多态:多态是基于继承实现的,同时需要父类指针指向子类,在使用的时候可以使用一个指针调用多个子类来获得不同的功能。未完

u8类型的变量的取值范围、short大小
u8代表无符号八位
0-2^8-1
short大小为2^16占用四个字节

C语言进程内存空间分配
【嵌入式面试】嵌入式知识点面经整理_第1张图片
C语言内存分区,未定义的全局变存放在哪个区。

C语言的一些基础知识(volatile、const、static、指针之类的);举几个什么时候需要用到volatile关键字的例子。

volatile关键字

volatile表示易变的变量,由于指令重排序导致的内存重排序造成了可见性的问题,volatile表示每次读取变量的时候都要重新读取变量在主内存中的真实值,而不是直接调用寄存器或者工作区内存的数值。保证值每次都被正确读取。
保证了在单线程的情况下的原子性。
使用场景:

  • 全局变量的使用
  • 寄存器共享的地址
  • 多线程情况下的值

const关键字:博客
通过const成员函数实现非const成员函数
const成员函数中的成员不能改变,但是如果const成员函数中的类型是指针,并不能修改指针所指向的内容
使用 const_cast(this),把const版本的this转化为非const然后调用非const版本的[],因为const只在编译期,在运行期是不存在const的

const和指针组合有几种情况,分别介绍一下。
三种组合方式:
const int * p; // 常量指针:指针所指向的值不变
int const * p;//指针常量://指针指向的位置不能变
const int const * p:常量指针常量,都不能变

static关键字
staic修饰变量和函数
变量分为局部变量和全局变量

  • static修饰全局变量,该变量只在本文件内被访问,不能在其他文件被直接访问。
  • static修饰函数,该函数只能在本文件内被访问,不能被其他文件访问,但是可以通过嵌套的方式调用,变相的封装的表现。
  • static修饰局部变量,更改该局部变量的生命周期。作用域不变:作用域仍然是代码块内。(本来随着栈的消失而消失,声明周期变长),所以static变量存储在内存空间中的data段中的静态变量区域。

c++程序中,如果要调用c语言写的程序,一般要加extern C,为什么?
C++语言支持函数重载,C语言不支持函数重载。函数被C++编译后在库中的名字与C语言的不同。假设某个函数的原型为: void foo(int x, int y);
该函数被C编译器编译后在库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字。

指针和引用的区别
指针是一个变量,存储的是变量(对象)的地址,引用是变量的别名
2、指针可以为空,引用定义时必须初始化,且只能初始化一次,底层是一个常量指针,不能修改值。
3、指针在初始化之后可以改变指向,引用在初始化之后不可在改变
4、指针可以有多级,引用只有一级
5、sizeof指针得到的是本指针的大小,sizeof引用得到的是引用所指向变量的大小
6、当把指针作为参数进行传递时,也是将实参的一个拷贝传递给形参,两者指向的地址相同,但不是同一个变量,在函数中改变这个变量的指向不影响实参,而引用却可以
7、引用本质是一个指针,同样会占4字节内存;指针是具体变量,需要占用存储空间
8、不存在指向空值的引用,必须有具体实体;但是存在指向空值的指针

指针的优缺点?指针和数组的区别 ?

malloc,在函数里定义一个很大的数组,应该直接定义还是用malloc?malloc使用中的注意事项?说了malloc底层实现?操作系统做了什么?
使用malloc,如果直接定义可能会因为栈区空间不够而导致程序不能运行,所以需要使用malloc在堆中进行分配单独的空间。
malloc注意事项:

  • 使用malloc需要和free进行配合使用
  • 使用前:一定要注意使用malloc函数分配内存后一定要判断内存分配是否成功一旦不成功就需要做相关处理
  • 使用后:释放free的时候要将指针置空,防止野指针的产生

malloc 函数的实质是它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表。
调用 malloc()函数时,它沿着连接表寻找一个大到足以满足用户请求所需要的内存块。(如果没有搜索到,那么就会用sbrk()才推进brk指针来申请内存空间)。
然后,将该内存块一分为二(一块的大小与用户申请的大小相等,另一块的大小就是剩下来的字节)。 接下来,将分配给用户的那块内存存储区域传给用户,并将剩下的那块(如果有的话)返回到连接表上。
调用 free 函数时,它将用户释放的内存块连接到空闲链表上。
操作系统通过MMU虚拟内存映射来分配具体的内存空间。

介绍一下虚拟内存

静态存储和动态存储区别及引申
https://www.cnblogs.com/zhou2011/archive/2012/01/19/2326053.html

strlen和sizeof区别
strelen是函数,只能作为函数语句进行调用。
sizeof是一个关键字,在程序编译的时候就作为常数进行程序填充,可以作为参数

switch能不能用浮点型
只能是整形或者字符型

介绍一下死锁

结构体大小如何计算
一,结构体变量的首地址,必须是结构体 “最宽基本类型成员” 大小的整数倍(0被认为是任何数的整数倍)。
二,结构体每个成员相对于结构体首地址的偏移量,都是该成员的整数倍。
三,结构体的总大小,为结构体 “最宽基本类型成员” (将嵌套结构体里的基本类型也算上,得出的最宽基本类型) 大小的整数倍。

写一个宏OFFSET,已知结构体中一个成员,求出该成员在结构体中的内存偏移量
#define OFFSET(type,member) ((size_t)&(((type*)0)->member))

结构体中的内存分布等;struct{char,double,int} 在64位占多少字节;

问结构体内存对齐问题,如何解决因为对齐产生的内存碎片

C++容器
vector和map的了解

C++构造函数和析构函数是怎么理解的?为什么说析构函数?有几种构造函数?移动构造
构造函数生成对象
析构函数释放对象资源

虚函数、纯虚函数、虚函数表

c++虚函数表里具体有什么,具体到结构

函数回调是如何实现的(可以翻译为栈帧的工作原理或者调用函数时栈帧是如何变化的)?

C++的四种类型转换

C++智能指针

strcpy和strncpy的区别、手写strcmp、实现memcpy(chardest,charsor,size_t size);

堆栈溢出和内存泄漏,怎么排查,怎么避免?内存堆叠?内存溢出和内存泄漏?

讲一下都有什么数据结构?
迭代器有用吗;有;哪些;vector,stack,unordered_map(我是当成哈希表用的);有了解过容器底层吗;map或者set的底层是红黑树,unordered_map和unordered_set底层是hashtable,增改的复杂度;vector在内存里面是怎么组织的,有什么特征?

平衡二叉树有什么特点?

变量声明和定义的区别
变量的声明规定变量的类型和名称
变量的定义为变量分配内存空间
extern 是一个关于声明的关键字,放在变量或者函数前用于声明,用来说明”此变量或者函数在别处定义“。

多态是什么?多态是怎么实现的?

C++继承关系

C/C++区别

动态链接和静态链接

STL容器用过哪些,用在什么地方

虚函数实现多态原理

给你1G内存怎么管理?怎么实现动态内存分配?

共用体的作用

定义一个类,一个成员都没有在64位上占多少字节?如果加一个虚析构函数呢?

头文件重复包含解决

深拷贝和浅拷贝的区别

多线程如何保证线程安全

链接过程涉及到的文件类型,这个问题感觉他问的不太清楚,提示让我从堆栈角度分析

如何将左值强制转换成右值(这里开始考查C++11了)

使用auto在程序中是否会显示变量类型?

你最喜欢C++11的那些特性?

static在C语言中的函数和C++的对象中有什么区别

16位机器中,char* 和 int* 的内存大小

什么是函数指针,指针函数?

指针数组和数组指针;

struct和class的区别?

virtual函数的作用?

glibc的内存管理的实现

typedef和#define

数据结构与算法

栈和队列

数组和链表

队列,栈,二叉数介绍

3种排序

链表有哪几种,双链表删除怎么操作

写代码判断链表是否有环

写代码判断链表环的入口结点,然后输出

十分钟写一个输出二叉树的深度

什么样的场景选取不同的数据结构

链表找环、小于n的质数、二叉树前序遍历(递归+非递归)

单向链表的排序;

快速排序;

页面置换算法(FIFO先进先出,LFU最不经常使用(访问次数最少)和LRU淘汰最久没有使用使用的算法

已知有一个硬件计数器控制该计数器有两个寄存器,一个用于设置时钟的初始值,一个用于设置时钟的门限值,当时钟初始值设置好后开始计数,当计数值达到门限值后,便会触发一个函数的执行。编写两个函数,分别实现:
•在任意时刻能够设置多少时间后触发某个函数的执行;
•在任意时刻能够取消之前设置的执行任务;
[解决思路是用链表实现一个最小优先队列,设置任务对应着队列的插入,到时间执行和删除对应着优先队列的结点的删除,触发时跳到相应的函数中]

假设有一个很大的文件,里面的数据结构如下:
XXX.XXX.XXX.XXX(IP地址) 天气;[如192.168.1.1 晴转多云];问怎么用最快的方式找到一个地区的天气状况。
[我的思路是在存储文件的时候就将每一条信息对齐(即占用大小一样的地址),然后使用二分法搜寻每一个IP段的位置,移动文件指针即可(O(lgn));]

手写程序判断大端小端,

手撕–数猴王

算法:IP地址分割(leetcode93)

链表的插入

怎么用两个栈实现一个队列

字符串查找子字符串,编程题考查sizeof等

手撕代码(简单,但是忘记了,好像是求素数)

手撕(宏定义交换两个数、把数字转换为字符串、判断程序对错(记得是函数返回的一个局部变量的指针出错))

计算机

判断计算机是大端还是小端。

内存对齐

介绍一下进程跟线程的区别

进程和线程、同步、锁

优先级反转、优先级继承

为什么内核区要放在虚拟内存的高位地址

问了一些进程间同步及通信的手段,也就是自旋锁、信号量这些东西的原理

实现自旋锁;自旋锁的底层实现原理?为什么自旋锁不能睡眠

内核同步有哪些方式

共享资源如何避免多个线程抢占,有什么方法(线程运行状态)

线程锁

线程同步

互斥锁原理

如果有一个线程长时间占用资源怎么办?

介绍操作系统;

说说内核态和用户态

说说缓存吧!为什么操作系统有缓存机制?

进程什么情况下会发生调度!

操作系统怎么管理物理地址的?

如果向0地址写或者读数据 操作系统会发生什么?

高速缓存为什么有用(局部性原理

进程调度算法(先来先服务,短作业优先,最短剩余事件优先,时间片轮转,优先级调度?各个调度算法的优缺点

用户和内核切换的时机?

哪些通信方式是单向的(管道和信号),哪些需要借助内核

计算机工作原理?你知道啥说啥?

STM32

核心电路主频,外设,选型依据?
参考野火视频教程stm32的选型
从内核上分有 Cortex-M0、M3、M4 和 M7 这几种,每个内核又大概分为主流、高性能和低功耗。基于 Cortex-M3 内核,主频为
72MHZ,F4 代表了高性能,基于 Cortex-M4 内核,主频 180M。之于 F1,F4(429 系列以上)除了内核不同和主频的提升外,升级的明显特色就是带了 LCD 控制器和摄像头接口,支持 SDRAM,这个区别在项目选型上会被优先考虑。
【嵌入式面试】嵌入式知识点面经整理_第2张图片
明确了大方向之后,接下来就是细分选型,先确定引脚,引脚多的功能就多,价格也贵,具体得根据实际项目中需要使用到什么功能,够用就好。确定好了引脚数目之后再选择 FLASH 大小,相同引脚数的 MCU 会有不同的 FLASH 大小可供选择,这个也是根据实际需要选择,程序大的就选择大点的 FLASH,要是产品一量产,这些省下来的都是钱。有些月出货量以 KK(百万数量级)为单位的产品,不仅是 MCU,连电阻电容能少用就少用,更甚者连 PCB 的过孔的多少都有讲究。项目中的元器件的选型的水很深,很多学问。

嵌入式系统启动流程简介。
STM32 有三种启动方式,从 FLASH 启动(包含系统存储器),从内部 SRAM 启动,从外部 RAM 启动,这三种存储器刚好对应的就是M0、M2 和 M6 这三条总线。内核Icode总线将程序读取到自己这里来执行。

ARM的体系结构了解吗?

问了项目用了STM32的哪些外设?这些外设功能分别干什么?

结果问到项目用了哪些数据,怎么采集的,提示我把ADC给忘记了。

SD卡读写部分。

FLASH读写

串口+DMA收发数据,如何配置DMA

我是以x86架构回答的设计rbp和rax寄存器,arm架构操作的寄存器有所区别

input输入子系统,怎么实现的,怎么和中断联系起来

如何在中断里面等待数据准备完成

中断有传参和返回值吗,为什么

bios是什么?bios有什么作用?怎么引导后续的启动?

DMA的配置

延时怎么写的?说systick,然后又问我systick中断相关的。

高优先级中断在执行时有一个低优先级触发,高优先级结束后会不会执行?

外部中断的两种触发方式,低电平触发的话如果一直低电平会一直中断吗?

编译流程?

STM32采用小端模式,常见设备的大小端模式:ARM既可以工作在大端模式,也可以工作在小端模式?

比如中断处理的步骤。基本都答了?

STM32自带ADC相关参数?

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

adc基本原理?经过哪些流程?

FPGA和MCU的区别是什么

计算机网络

tcp建立连接和收发数据用到的函数

TCP为什么能保持稳定(感觉像开放题)

4.TCP/IP模型 HTTP FTP UDP

以太网的MAC地址占多少字节?

TCP/IP熟悉吗?TCP有一个ACK和ACK的number有什么区别?

GET/POST区别

计算机的存储结构(寄存器,高速缓存L1L2L3,贮存,本地磁盘等

计算机网络有几层

拥塞避免,路由选择哪一层?

http的状态码,400常见的几个状态码

ARP协议是什么?在那一层

FreeRTOS/linux

linux信号机制

问了简历中写的FREERTOS,信号量消息队列,多任务调度

RTOS和Linux的区别

FreeRTOS和Linux哪个熟些,用FreeRTOS时,创建了几个任务,任务怎么通信的?如果give 10次信号量,那么take信号量是一次还是十次?

问了信号量怎么用。

linux命令 怎么在文件夹中查找关键字 并排序。

Linux下有一个fork()函数有什么作用?创建成功父进程返回什么?子进程返回什么

信号量怎么通信?(辅助共享内存的手段

什么是临界区(答错了,答成了临界资源,临界区是需要访问临界资源的代码

make、cnake说一下

linux进程有几种状态?(我:是6种吗?面试官:不是,是3种。我:呃,那我应该不太了解。然后是面试官自己回答这个问题…)

问Linux socket编程步骤

问使用什么命令查看socket编程的ip和端口状态

问条件变量的函数名是什么

介绍一下libevent库

问vim命令,编辑模式,命令模式,末行模式

问linux查看内存命令,查看cpu占用命令

问一般怎么调试代码

Linux的设备:字符设备、块设备、网络设备

Linux的一些基本命令(ifconfig、touch、vim等)

设计模式

单例模式、观察者模式
代理模式、单例模式之类的八股。
为什么饿汉模式线程安全

Linux驱动

驱动加载匹配过程,具体讲下

uboot移植流程;

交叉编译怎么做的,相关的gcc链路是从哪里获取的;

项目

1.画图解释项目

询问通信api格式;

tlb;

socket编程过程;

什么时候需要Bind,什么时候又不需要?

项目中数据上传用的通讯协议是什么?

如何重构项目中的某些方法

其他

数据库的范式(不太记得了

数据库长连接问题

牛客搜索关键词:嵌入式面经
第37页
C++如何调用c程序函数(没答上来)

细说static(全局变量、静态全局变量、局部变量、静态局部变量的作用域、生命周期、区别,存储位置)

队列和栈的区别

对于堆的使用,如何申请和释放空间(malloc,calloc,free,delete)

gcc,makefile的使用。

linux下PWM,GPIO,串口如何操作

如何操作文件,判断文件是否存在(open、read、write等使用)

socket网络编程原理和过程

linux下的进程和线程操作,如何实现通信
linux内核是如何编译的?内核编译都进行了哪些操作

platform(不会)

3、RESC-V指令集

4、makefile模型

5、操作系统文件层次,如何实现

7、GDB的使用

8、socket网络编程中close_wait的原因和解决方法。

c++构造函数有哪几种 讲的不大好,忘了几种构造方式叫啥了。。。

虚函数和纯虚函数是什么,有什么区别

linux里用过哪些指令? 路径,文件相关的指令,g++,gdb

对gdb指令了解多少 -b-r,-s,-n,-bt。。。

在软件上,有中断号,中断向量表,中断函数,3者的关系是什么?

发生中断,芯片会做什么?

RISC和CISC的区别?

为什么一般C程序中不使用goto?

常见设备的大小端模式:
STM32单片机:小端模式;
STM8:大端;
KEIL C51:大端;
x86:小端;
ARM既可以工作在大端模式,也可以工作在小端模式

你可能感兴趣的:(嵌入式,面试)