指针、对象与存储期
区分栈、静态存储区、只读区和堆的生命周期;明确指针指向的对象是否仍有效、是否存在越界或别名访问。
static uint8_t rx[64]; uint8_t *p = rx; /* p 只在数组范围内移动 */ p[0] = 0x55;
- 局部变量离开作用域后不能继续解引用。
- 嵌入式中动态分配需考虑碎片与失败路径。
Module 01 / interview basics
面试中不只要会调用库函数,更要说清变量在哪里、并发为什么出错、数据怎样从 MCU 到外设。本页按“C 语言 → 通信协议”建立基础回答框架。
先把存储期、访问方式和并发边界讲清,外设驱动代码才有可靠的基础。
区分栈、静态存储区、只读区和堆的生命周期;明确指针指向的对象是否仍有效、是否存在越界或别名访问。
static uint8_t rx[64]; uint8_t *p = rx; /* p 只在数组范围内移动 */ p[0] = 0x55;
使用掩码进行置位、清位和读改写;同时关注外设寄存器的读写语义,避免把状态位、写一清零位当普通变量处理。
#define EN (1u << 3)
REG |= EN; /* set */
REG &= ~EN; /* clear */
if (STATUS & EN) { }
volatile 约束编译器不要缓存或删去对对象的访问;它不自动解决原子性、顺序或互斥,需要结合临界区、原子操作和缓冲策略。
volatile uint8_t ready;
/* ISR writes, main reads */
ready = 1;
if (ready) { /* ... */ }
每种协议都从“连接什么线、典型芯片是什么、开发时验证什么”来理解,而不是只记名称。
通过 TX/RX 的异步串行通信配置波特率、帧格式和中断/DMA 收发,适合日志输出、调试终端和模块化指令交互。
待检查:先确认 TX/RX 交叉连接与共地。
通过报文 ID、滤波、接收中断和错误状态处理多节点总线通信。协议控制器与物理层收发器是不同职责。
待检查:控制器负责协议,收发器负责 CANH/CANL 差分物理层。
在 SCL/SDA 两线上完成设备寻址、寄存器读写和 ACK 应答,适合板内的低引脚数传感器与存储器连接。
待检查:SCL 高电平期间 SDA 改变才表示起始或停止条件。
使用 SCK、MOSI、MISO 与 CS 进行全双工数据交换,常用于外部 Flash、显示屏和高速采样外设。
待检查:Mode 由 CPOL 和 CPHA 共同决定,不能只看时钟频率。
Interview answer structure
不要只说“我会”。从定义切入,说明底层原理,再落到你如何配置或排错,最后给出能验证结论的证据。