英飞凌 MCU(XMC/AURIX/PSoC)在 C 语言层面有几个容易被忽略的细节,写驱动时踩过坑,记录一下:
1. 寄存器映射一律用 volatile 修饰的结构体指针,禁止用普通变量缓存地址。编译器优化等级一高,非 volatile 的重复读写会被合并,导致外设状态读不回来。
2. 位域操作要小心编译器实现差异。用结构体位域访问寄存器时,不同编译器对位域的分配顺序(高位优先或低位优先)处理不一致,跨工程移植容易出错;建议用移位宏明确指定位序号。
3. 中断服务函数必须严格按照工具链要求命名和声明。AURIX 系列用 __interrupt 关键字并配合向量表配置,函数名不匹配时编译能过,但中断***不触发。
4. 全局变量在中断与主循环之间共享时,多字节变量要加临界区保护;32 位 MCU 上对 16 位变量的读-改-写并不是原子的。
5. 编译时打开 -Wall,很多未初始化变量、隐式类型转换问题能在烧写之前就发现。
以上经验欢迎补充。 |