1. Arm Compiler 6与5的源代码兼容性深度解析
在嵌入式开发领域,编译器源代码兼容性直接影响项目的可维护性和迁移成本。Arm Compiler 6作为基于LLVM技术栈的新一代编译器,对语言扩展支持进行了全面重构,这对长期使用Arm Compiler 5的开发者提出了新的适应要求。
1.1 兼容性问题的本质
编译器源代码兼容性主要涉及三个层面:
- 关键字语义:如
__packed等编译器特有关键字的行为差异 - 属性语法:从传统关键字到
__attribute__语法体系的转换 - 底层行为:包括内存布局、指令生成等编译器实现细节
以结构体对齐为例,Arm Compiler 5使用__packed同时实现两个功能:
- 移除结构体内填充字节
- 标记变量进行非对齐访问
而在Arm Compiler 6中,这两个功能被拆分为:
c复制typedef struct __attribute__((packed)) { // 移除填充
__unaligned int member; // 非对齐访问
} my_struct;
1.2 关键变更项对比
1.2.1 关键字迁移对照表
| Arm Compiler 5 关键字 | Arm Compiler 6 等效方案 | 注意事项 |
|---|---|---|
__align(x) |
__attribute__((aligned(x))) |
对齐属性位置变化 |
__irq |
__attribute__((interrupt)) |
AArch64架构不支持 |
__forceinline |
__attribute__((always_inline)) |
仅为编译提示而非强制 |
__packed |
__attribute__((packed)) + __unaligned |
需区分两种使用场景 |
