嵌入式面试题(4)
嵌入式面试题(4)
1. TCP 协议和 UDP 协议的区别?
- 连接性:TCP 是面向连接的协议(需三次握手建立连接,四次挥手断开);UDP 是无连接协议(直接发送数据,无需建立连接)。
- 可靠性:TCP 提供可靠传输(通过超时重传、拥塞控制、滑动窗口等机制保证数据不丢失、不重复、按序到达);UDP 无可靠性保障(数据可能丢失、乱序)。
- 适用场景:
- TCP 适用于对可靠性要求高的场景(文件传输、电子邮件、网页浏览等)。
- UDP 适用于实时性要求高、可容忍少量数据丢失的场景(音视频流、在线游戏、实时监控等)。
2. Git 代码版本控制管理用过吗?最常用哪些命令?什么时候打 tag,什么时候创建 branch?
-
常用命令:
git clone <url>
:从远程仓库克隆代码到本地。git add <file>
:将工作区修改添加到暂存区。git commit -m "message"
:将暂存区变更提交到本地仓库。git push
:将本地仓库提交推送到远程仓库。git pull
:拉取远程仓库最新代码并合并到本地。git branch
:查看分支;git checkout -b <branch>
:创建并切换到新分支。git merge <branch>
:合并指定分支到当前分支。
-
打 tag 时机:用于标记项目的重要里程碑(如版本发布),便于后续追溯特定版本。
示例:git tag -a v1.0 -m "Version 1.0 正式发布"
。 -
创建 branch 时机:
- 并行开发新功能(如独立开发一个模块时,避免影响主分支稳定性)。
- 修复特定问题(如创建
hotfix
分支修复生产环境bug)。
例:硬件从 MPU6050 切换到 ICM-20649 时,可创建专门分支开发适配代码。
3. 如何通过一个按键实现单击、双击、长按功能?
通过定时扫描 + 状态机判断实现,核心逻辑如下:
- 定时采样:用定时器(如每 10ms)周期性扫描按键状态,同时进行防抖处理(连续多次采样确认状态稳定)。
- 记录时间戳:保存按键按下、释放的时刻,用于计算按压时长和间隔。
- 状态机设计:
- IDLE(空闲):等待按键按下。
- PRESSED(按下):检测到按键按下,开始计时。
- RELEASED(释放):按键松开,判断按压时间(<500ms 则进入等待双击状态)。
- WAIT_SECOND(等待双击):若 500ms 内再次按下则判定为双击;超时未按则判定为单击。
- LONG_PRESS(长按):按下持续时间≥1000ms 时触发。
- 回调机制:每种状态判定后触发对应功能(如单击执行A、双击执行B、长按执行C)。
4. ADC 在充电时如何采集电量?ADC 的采集频率如何选择?
-
充电时电量采集方式:
- 电压采集:通过电阻分压网络将电池电压降至 ADC 量程内,采集后换算为实际电压(反映电池当前电量粗略状态)。
- 电流采集:串联分流电阻或使用霍尔传感器,将电流转换为电压信号输入 ADC,计算实时充电电流。
- 电量估算:结合电压、电流,通过库仑积分法(电流×时间)计算充入的总电量,提升估算精度。
- 注意事项:需添加保护电路(如稳压、限流),避免过压损坏 ADC。
-
采集频率选择:
- 稳态信号(如电池电压):1~100Hz(信号变化缓慢,高频采样无意义)。
- 动态信号(如脉冲充电电流):需遵循奈奎斯特准则(采样频率≥2倍信号最高频率),通常≥1kHz。
- 实际限制:受 ADC 转换速度、MCU 主频及系统负载影响(例:STM32 内部 ADC 采集锂电池电压时,常用 10Hz 采样率)。
5. 举例说明两种同步通信总线和异步通信总线协议。
-
同步通信总线(依赖共享时钟):
-
SPI(Serial Peripheral Interface):
- 信号线:SCK(时钟,主设备提供)、MOSI(主发从收)、MISO(主收从发)、SS/CS(从设备选择)。
- 特点:全双工、高速、主从结构,支持多从设备(通过 SS/CS 选通)。
- 应用:SD卡、EEPROM、LCD显示屏。
-
I2C(Inter-Integrated Circuit):
- 信号线:SCL(时钟,主设备提供)、SDA(数据,双向)。
- 特点:半双工、多主多从(通过地址区分设备),仅需两根线,通信速率适中。
- 应用:传感器、RTC(实时时钟)、EEPROM。
-
-
异步通信总线(无共享时钟,依赖波特率同步):
-
UART(Universal Asynchronous Receiver/Transmitter):
- 帧结构:起始位(1位)+ 数据位(5~8位)+ 校验位(可选)+ 停止位(1~2位)。
- 特点:全双工、点对点通信,需约定波特率(如9600、115200)。
- 应用:调试串口、GPS模块、蓝牙模块(基于RS-232/485)。
-
USB(Universal Serial Bus):
- 特点:差分信号传输、主从结构、支持热插拔和供电,基于数据包异步通信。
- 工作方式:主机通过轮询/中断与设备交互,无需全局时钟。
- 应用:电脑外设(鼠标、打印机)、U盘、手机数据传输。
-
6. 线程间如何通信?
线程共享同一进程的地址空间,通信方式主要有:
- 共享内存:通过全局变量、共享数据结构直接读写(需配合同步机制)。
- 同步工具:
- 互斥锁(mutex):保证同一时间只有一个线程访问共享资源。
- 信号量(semaphore):控制并发线程数量,实现资源计数。
- 条件变量(condition variable):线程间通过“等待-通知”机制同步状态。
- 消息队列:线程通过发送/接收消息通信(解耦线程,支持异步处理)。
- 事件/信号:线程通过触发事件或发送信号通知其他线程(如 POSIX 的
signal
)。
7. USB 收发数据的流程是什么?
- 物理连接:设备接入主机,主机通过 D+/D- 线检测设备并提供供电(低功耗设备直接取电)。
- 设备枚举:
- 主机发送控制请求,读取设备描述符(类型、厂商、端点等信息)。
- 主机配置设备(如分配地址、选择配置),完成初始化。
- 端点建立:主机与设备通过端点(Endpoint)建立通信通道(端点是数据传输的唯一标识)。
- 数据传输:
- 主机→设备:通过 OUT 端点发送数据。
- 设备→主机:通过 IN 端点发送数据。
- 传输类型:控制传输(配置设备)、批量传输(大容量数据,如U盘)、中断传输(低延迟,如鼠标)、同步传输(实时性,如音频)。
- 中断与处理:设备通过中断服务程序(ISR)接收数据,处理后可主动通过 IN 端点返回结果。
8. 独立看门狗(IWDG)和窗口看门狗(WWDG)的区别?
对比项 | 独立看门狗(IWDG) | 窗口看门狗(WWDG) |
---|---|---|
时钟源 | 独立低速时钟(LSI),不依赖主时钟 | 系统主时钟(PCLK1),依赖主时钟 |
喂狗时机 | 任意时刻,只要在超时前喂狗即可 | 仅在“窗口时间”内喂狗(太早/太晚均复位) |
应用场景 | 主时钟故障或系统严重失控时复位 | 检测程序运行时序(防止死循环或执行超前) |
复位范围 | 整个系统 | 通常仅复位内核(部分外设可能不受影响) |
9. SPI 通信有哪几根信号线?各有什么作用?
SPI 通常包含4根核心信号线:
- SCK(Serial Clock):串行时钟线,由主设备生成,用于同步主从设备的数据传输(上升沿/下降沿采样数据)。
- MOSI(Master Out Slave In):主发从收线,主设备通过此线向从设备发送数据。
- MISO(Master In Slave Out):主收从发线,从设备通过此线向主设备返回数据。
- SS/CS(Slave Select/Chip Select):从设备选择线,主设备通过拉低该线选中对应的从设备(同一总线上可接多个从设备,通过 SS/CS 区分)。
10. 高优先级任务执行时遇到中断,系统如何处理?
处理逻辑取决于中断优先级与系统调度策略:
-
中断优先级 > 当前任务优先级:
- 系统立即暂停高优先级任务,保存其上下文(寄存器、程序计数器等)。
- 进入中断服务程序(ISR)执行中断处理。
- ISR 执行完毕后,恢复被暂停的高优先级任务,从断点继续执行。
-
中断优先级 ≤ 当前任务优先级:
- 中断被暂时屏蔽或挂起(进入等待队列)。
- 待高优先级任务执行完毕(或主动释放 CPU)后,系统再处理该中断。
注:实时操作系统(RTOS)中,中断优先级通常高于所有任务优先级,以保证紧急事件及时响应。
11. 如何只通过操作寄存器实现一个 UART 驱动?
- 初始化引脚:配置 UART 对应的 TX(发送)、RX(接收)引脚为复用功能(通过 GPIO 寄存器设置)。
- 配置波特率:根据系统时钟和目标波特率,计算并设置 UART 波特率寄存器(BRR),公式:
BRR = 系统时钟频率 / 波特率
。 - 配置帧格式:通过控制寄存器(CR1/CR2)设置数据位(5~8位)、停止位(1/2位)、校验位(无/奇/偶校验)。
- 使能 UART 功能:通过控制寄存器使能 UART 模块、发送器(TE)和接收器(RE)。
- 发送数据:
- 轮询发送数据寄存器空标志(TXE),确认可发送。
- 将数据写入发送数据寄存器(TDR),硬件自动发送。
- 接收数据:
- 轮询接收数据就绪标志(RXNE),确认有数据。
- 从接收数据寄存器(RDR)读取数据。
- 中断配置(可选):通过中断使能寄存器(CR1)开启发送/接收中断,在中断服务程序中处理数据(替代轮询)。
- 错误处理:检测奇偶校验错、帧错误等标志(SR寄存器),必要时复位或重试。