导图社区 嵌入式软件面试题
详细地例举嵌入式软件所有方面的面试问题,强调了C语言中变量的声明和使用范围,包括全局变量和静态变量的特性。深入讨论了内存管理,特别是指明了初始化与未初始化变量在内存中的存储位置和分配方式。通过清晰的层级结构和丰富的文本描述,使这些内容易于理解和记忆。希望对大家面试有所帮助!
该思维导图主要描述了802.11协议的网络,概述了802网络协议族上都有哪些网络协议,以及802.11网络协议的运作方式。
社区模板帮助中心,点此进入>>
互联网9大思维
电商部人员工作结构
电费水费思维导图
D服务费结算
组织架构-单商户商城webAPP 思维导图。
博弈的理解与运用
域控上线
第三章 外国行政组织理论
培训计划思维导图
车队管理
嵌入式软件面试题
C语言
枚举的用意
枚举的用意可提现在这几个方面: 1. 提供代码的可读性和可维护性 2. 限定变量的取值范围 3. 提供类型安全 4. 方便调试
变量的声明和定义有什么区别
为变量分配地址和存储空间的称为定义,不分配地址的称为声明。 一个变量可以在多个地方声明,但是只在一个地方定义。 加入extern修饰的是变量的声明,说明此变量将在文件以外或在文件后面部分定义。
在int、指针型变量和"零值"比较时,为什么建议把"零值"放在左边?
因为在编码时,当把"=="误写成"="时,编译器可以报错,否则这种逻辑错误不容易发现,可能导致严重后果。
sizeof和strlen的区别
sizeof和strlen有以下区别: sizeof是一个操作符,strlen是库函数。 sizeof的参数可以是数据的类型,也可以是变量,而strlen只能以结尾为‘\0‘的字符串作参数。 编译器在编译时就计算出了sizeof的结果。而strlen函数必须在运行时才能计算出来。 sizeof计算的是数据类型占内存的大小,而strlen计算的是字符串实际的长度。 数组做sizeof的参数不退化,传递给strlen就退化为指针了。
说明关键字volatile有什么含意
作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。
一个定义为volatile的变量就是说这个变量可能会被意想不到的改变,这样,编译器就不会去随便假设这个变量的值了。精确的说,优化器在用到这个变量的值的时候,必须每次都小心的重新读取这个变量的值,而不是使用保存在寄存器里面的备份。
下面是volatile变量的几个例子:
并行设备的硬件寄存器(如:状态寄存器)
一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)
多线程应用中被几个任务共享的变量
static的用法(定义和用途)
1)用static修饰局部变量:使其变为静态存储方式(静态数据区),那么这个局部变量在函数执行完成之后不会被释放,而是继续保留在内存中。
2)用static修饰全局变量:使其只在本文件内部有效,而其他文件不可连接或引用该变量。
3)用static修饰函数:对函数的连接方式产生影响,使得函数只在本文件内部有效,对其他文件是不可见的(这一点在大工程中很重要很重要,避免很多麻烦,很常见)。这样的函数又叫作静态函数。使用静态函数的好处是,不用担心与其他文件的同名函数产生干扰,另外也是对函数本身的一种保护机制。
内存区域
代码区域
属于.text段或code段
代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区域。
全局区域
data区域
data区里主要存放的是已经初始化的全局变量、静态变量和常量
属于静态内存分配。
bss区域
bss区主要存放的是未初始化的全局变量、静态变量,这些未初始化的数据在程序执行前会自动被系统初始化为0或者NULL
栈区域
由编译器自动分配和释放,存放函数参数,局部变量等
堆区域
由程序员分配释放,若程序员未释放,则程序结束之后,编译器自动释放
芯片相关知识
各个数据段在内存中的位置
RAM和ROM区域存储的数据如下:
Total RO Size (Code + RO Data) Total RW Size (RW Data + ZI Data) Total ROM Size (Code + RO Data + RW Data) Total RAM Size (ZI Data + RW Data)
表示RAM区存储的数据结构
介绍一下STM32启动过程
通过Boot引脚设定,寻找初始地址
初始化栈指针 __initial_sp
指向复位程序 Reset_Hander
设置异常中断 HardFault_Handler
设置系统时钟 SystemInit
调用C库函数 _main
BLE
BLE 5.0相比BLE 4.0有哪些改进?
BLE 5.0引入了更长的广播包、更高的数据传输速率(2 Mbps)、更大的传输范围和更高的广播容量等改进。
BLE Mesh网络是什么?它的主要应用场景是什么?
BLE Mesh网络是一种多对多(many-to-many)设备通信协议,主要用于智能家居、工业自动化等需要设备广泛连接和数据共享的场景。
如何提高BLE数据传输速率?
使用较短的连接间隔(Connection Interval)、增大MTU(Maximum Transmission Unit)大小、使用数据包聚合等方法提高数据传输速率。
如何优化BLE设备的功耗?
通过减少广播频率、使用低功耗模式(如睡眠模式)、优化通信间隔等方法降低功耗。
BLE的安全特性有哪些?
BLE安全特性包括配对(Pairing)、绑定(Bonding)和加密(Encryption)。配对过程中设备交换密钥,绑定后设备保存配对信息,加密用于保护通信数据的机密性。
如何实现BLE的OTA(Over-The-Air)固件升级?
Bootloader设计
引导加载程序(Bootloader):Bootloader负责接收和验证新固件,并将其写入程序存储器。
分区布局:在Flash存储中分配空间用于Bootloader、当前应用程序、下载的固件和备用区域。
引导加载程序保护:保护Bootloader不被覆盖,通常通过硬件配置或软件防护措施。
固件打包
固件映像:生成新的固件文件(通常为.bin或.hex格式)。
打包工具:使用厂商提供的工具将固件打包成DFU格式,包含固件元数据(版本号、校验和等)。
应用程序设计
DFU服务:在应用程序中实现DFU(Device Firmware Update)服务,处理OTA升级请求。
BLE服务和特征:定义BLE服务和特征用于传输固件数据。
传输固件
数据传输协议:通过BLE连接将固件数据从主设备(如手机、PC)传输到从设备(目标设备)。
数据分包和发送:将固件数据分成小包,依次通过BLE特征传输到从设备。
固件验证和切换
固件验证:Bootloader或应用程序负责验证固件的完整性和有效性。
固件切换:验证通过后,Bootloader切换到新固件并启动。
解释GATT和ATT的区别
GATT(Generic Attribute Profile)定义了如何在BLE设备之间传输数据,包括服务和特征。ATT(Attribute Protocol)是在设备间传输这些属性的底层协议。
示例回答:“GATT定义了服务和特征的组织方式,而ATT提供了在设备间传输这些属性的底层协议支持。”
你如何处理BLE连接不稳定的问题?
说明通过调整连接参数、优化天线设计和减少环境干扰等方法来提高连接稳定性。
示例回答:“我们通过调整连接间隔和超时参数来提高连接稳定性,同时优化PCB天线设计,确保信号质量。此外,我们还使用屏蔽罩减少环境干扰。
WiFi
网络协议
FreeRTOS
外设
主题