在用 C 语言开发极海 APM32 系列(Cortex-M 内核)时,和内存、DMA 相关的几个坑比较典型:
1. DMA 的源/目标缓冲区地址和长度要符合外设要求,使用局部数组时注意别让它落在栈上被回收,建议用静态或全局缓冲区。
2. 结构体用于通信报文或 Flash 存储时,编译器会按成员自然对齐插入填充字节,实际占用比成员之和更大;协议对字节布局敏感时要显式逐字节序列化,不要直接强转结构体指针。
3. 用 union 做字节与字之间的转换很方便,但要确认大小端与协议一致,小端模式下多字节字段顺序要额外处理。
4. 用 memcpy 搬运外设数据时,注意源地址是否支持字节访问,部分外设寄存器必须按字访问。
5. 中断与 DMA 完成标志配合时,全局标志建议用 volatile 修饰并按需加内存屏障。
以上,供参考。 |