嵌入式软件(单片机方向)面试经
常见八股文
volatile关键字
volatile的意思是”易变的”,这个关键字主要是防止编译器对变量进行优化。即告诉编译器每次存取该变量的时候都要从内存去存取而不是使用它之前在寄存器中的备份.
应用场景:
(1)并行设备的硬件寄存器。存储器映射的硬件寄存器通常加volatile,因为寄存器随时可以被外设硬件修改。当声明指向设备寄存器的指针时一定要用volatile,它会告诉编译器不要对存储在这个地址的数据进行假设。
(2) 一个中断服务程序中修改的供其他程序检测的变量。volatile提醒编译器,它后面所定义的变量随时都有可能改变。因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据。如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象。
(3)多线程应用中被几个任务共享的变量。
堆与栈有什么区别?
(a)申请方式
栈的空间由操作系统自动分配/释放,堆上的空间手动分配/释放。
(b)申请大小的限制栈空间有限。
在Wind ows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在WINDOWS下,栈的大小是2M(也有的说是1M,总之是 一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示 overflow。因此,能从栈获得的空间较小堆是很大的自由存储区。堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用 链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。
(c)申请效率
栈由系统自动分配,速度较快。但程序员是无法控制的。 堆是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便.
C++中类成员的访问权限?
无论成员被声明为 public、protected 还是 private,都是可以互相访问的,没有访问权限的限制。在类的外部 (定义类的代码之外),只能通过对象访问成员,并且通过对象只能访问 public 属性的成员,不能访问 private、protected 属性的成员。
(a)protected:受保护的,类内和子类可直接访问,也就是说,基类中有protected成员,子类继承于基类,那么也可以访问基类的protected成员,要是基类是private成员,则对于子类也是隐藏的,不可访问。
(b)private:私有的,只有类内的成员函数才可以访问。
单片机启动流程
单片机上电后一直到准备好C语言运行环境并跳转到main函数执行总共经历了5个步骤:
1.内核初始化;
2.强制PC指针指向中断向量表的复位中断向量执行复位中断函数;
3.在复位中断函数中调用 SystemInit 函数,初始化时钟,配置中断向量表等
4.调用 __main 函数完成全局/静态变量/常量的初始化和重定位工作,初始化堆栈和库函数
5.跳转到main函数中执行
中断响应执行流程
中断的响应流程:cpu接受中断->保存中断上下文跳转到中断处理历程->执行中断上半部->执行中断下半部->恢复中断上下文。
单片机的串口通信波特率
波特率 = 时钟频率/(16*分频系数)
I2C协议的开漏输出
开漏输出:高电平无驱动能力,需要借助外部上拉输出高电平。
因为I2C协议是支持多个主设备与多个从设备在一条总线上的,此时就会有多个GPIO口连接在同一条总线上,就势必会出现输出高、低电平不统一的情况,如果采用推挽输出时,就可能会出现某个GPIO的Vcc和GND连接在一起造成短路的情况,当你采用开漏输出时,因为有上拉电阻的存在就可以避免这一问题的出现。
总线通过上拉电阻接到电源。当I2C设备空闲时,会输出高阻态,而当所有设备都空闲,都输出高阻态时,由上拉电阻把总线拉成高电平。
多个主机同时使用总线时,为了防止数据冲突,会利用仲裁方式决定由哪个设备占用总线。
SDA线在输入时配置成上下拉输入模式。
数据传送过程中,先传送最高位(MSB),每一个被传送的字节后面都必须跟随着1位应答位(即一帧共有9位长)。
I2C最多能搭载多少从机设备
根据I2C的寻址位最大地址来说,从机地址是7位,那么最多可以容纳127个。减去广播地址与0x00。
但是其实从使用上来说,推荐是8个以下。
介绍SPI协议
CS线(NSS线):从设备选择线,也称为片选信号线。哪个NSS线设为低电平,就是选中对应的模块。NSS线为高电平时,为结束信号。
SCK:时钟信号线,用于通讯主机产生,决定了通讯的速率,STM32的SPI时钟频率最大为fPCLK/2,一般通讯过程中,通讯速率受限于低速设备。
MOSI:主机发送,从机接收端口。
MISO:主机接收,从机发送端口。
SPI通讯模式(四种)
四种通讯模式最大的区别:总线空闲时 SCK 的时钟状态以及数据采样时刻。
因此,在此引入“时钟极性CPOL”和“时钟相位CPHA”概念。
这两项的组合就有4种模式,分别对时钟的极性进行反转和对相位进行偏移与否。
DMA大杂烩
DMA存储
DMA主要是用来搬运数据,但是不经过CPU,数据直接从外设到存储器,或者从存储器到存储器,存储器可以是SRAM或者FLASH。
DMA包含DMA1(7通道)和DMA2(5通道)。每个通道可以接收多个外设请求,但是同一时间只能接收一个,不能同时接收多个。
仲裁器多个DMA通道请求,由仲裁器管理。分两个阶段,先软件阶段:根据优先级设置(4个优先级)判断,如果两个通道优先级一样,则进入硬件阶段,根据通道号决定谁优先级高,通道0高于通道1。
RTOS的内存管理
ADC采样的过程
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以邮件至 1186703947@qq.com