C语言自定义链接段int16_t单元素数组异常对齐问题如何解决?
问题原因
该对齐差异是32位ARM架构下GCC编译器的类型默认对齐规则不同导致的(从地址0x2001xxxx可判断你使用的是Cortex-M系列微控制器):
- 普通
int16_t基础类型变量的默认对齐要求为2字节,因此变量间只会按2字节对齐,不会插入额外填充,布局符合预期。 - 对于数组类型,即使是单元素的
int16_t数组,GCC默认会将数组的整体对齐要求提升到架构的字长(32位平台为4字节),用于优化数组遍历的访问效率。这种情况下编译器会在前一个变量和数组之间插入2字节填充,保证数组起始地址对齐到4字节边界,就出现了你观测到的每个变量占4字节的现象。注意数组本身的大小依然是2字节,多出来的空间是编译器插入的对齐填充。
解决方法
两种方案都可以恢复2字节对齐的布局,按需选择即可:
方案1:显式指定变量对齐属性(最稳妥,兼容性最好)
给放到自定义段的数组强制指定2字节对齐,覆盖编译器的默认对齐规则即可,也可以给所有自定义段的变量统一加该属性避免后续再出现同类问题:
__attribute__((section (".bufferentry"), aligned(2))) int16_t BUFF_entry[1];
方案2:修改链接脚本强制段内对齐
不需要修改业务代码,在链接脚本的.buffer段定义中,每段输入段插入后强制对齐到2字节即可:
.buffer : { . = ALIGN(2); __buffer_section = .; KEEP(*(.bufferhead)) . = ALIGN(2); KEEP(*(.bufferentry)) . = ALIGN(2); KEEP(*(.buffercirc)) . = ALIGN(2); __buffer_section_end = .; __bufferr_section_size = __buffer_section_end - __buffer_section; } > RAM_BUFF
内容的提问来源于stack exchange,提问作者BlackMamba
相关产品推荐
相关产品推荐

