分享7道嵌入式面试题,你会几道?

💡 原文中文,约3800字,阅读约需10分钟。
📝

内容提要

static关键字的作用包括修饰局部变量、全局变量、函数、成员变量和成员函数。volatile关键字用于修饰多线程访问的变量。sizeof()计算内存占用字节数,strlen()计算字符串字符个数。浮点数比较时推荐使用范围。IIC协议是一种串行通信协议,包括起始和停止条件、总线裁决、数据位有效性规定等。从机地址和主机地址根据硬件连接确定。

🔎

延伸解读

static 与 volatile 的常见混淆点

面试中常将 static 和 volatile 放在一起考察,但两者作用完全不同。static 主要改变变量的存储位置、生命周期或链接属性,例如局部静态变量生命周期与程序相同,全局静态变量限制在本文件内访问。volatile 则用于防止编译器优化,确保每次从内存读取,适用于硬件寄存器、中断共享变量和多线程标志。理解它们各自解决的问题,才能避免在嵌入式开发中误用。

浮点数比较与中断中的浮点风险

浮点数因精度限制不能直接用等号比较,通常采用范围判断,如设定 EPSINON 为 0.00001 或更小。在 STM32 等嵌入式系统中,中断内使用浮点运算可能引发问题:若 TCP 协议栈的 memcpy 使用了 FPU 寄存器,中断中的浮点操作可能破坏其数据。此外,浮点常量应加 f 后缀,避免双精度计算带来的性能开销。

IIC 硬件与软件模拟的取舍

IIC 协议通过 SDA 和 SCL 两线通信,包含起始、停止、应答和总线仲裁等机制。在 STM32 上,硬件 IIC 由外设自动控制时序,不占用 CPU,适合高速通信;软件 IIC 需 CPU 手动控制时序,占用资源但移植简单、时序灵活。选择时需权衡速度、CPU 负载和开发便利性。从机地址由硬件连接决定,主机在起始信号后发送地址和读写位。

❓

Q&A

static关键字在局部变量中的作用是什么?

static关键字将局部变量转变为静态变量,其生命周期与程序相同,只初始化一次。

volatile关键字的主要用途是什么?

volatile关键字用于修饰多线程访问的变量,防止编译器优化导致数据不一致。

sizeof和strlen有什么区别?

sizeof是运算符,计算内存字节数;strlen是函数,计算字符串字符个数,且只适用于以' '结尾的字符串。

如何比较两个浮点数是否相等?

推荐使用范围比较,定义一个小的误差值EPSILON,判断两个浮点数的差是否在该范围内。

在中断中使用浮点运算会有什么影响?

在中断中使用浮点运算可能导致数据错误,因为会影响TCP通讯线程的数据处理。

IIC协议的基本工作原理是什么?

IIC协议通过两条线进行串行通信,主机发送起始信号和停止信号,数据在时钟信号的控制下传输。

🏷️

标签

➡️

继续阅读