IAR Linker放置包装结构

时间:2018-03-26 09:44:32

标签: struct arm alignment iar packed

我正在使用压缩结构来处理IAR链接器。

这是一个放置在绝对位置的结构:

typedef __packed struct
{
    uint8_t au8Build[8];
    uint16_t u16Type;
} stMetaInfo_t;

#pragma location = ".META_INFO"
const __packed stMetaInfo_t c_stMetaInfo =
{
    .au8Build = { 0U, 0U, 0U, 0U, 0U, 1U, 2U, 3U },
    .u16Type = 0x0059U
};

结构的大小是10个字节,我使用sizeof()验证它。

链接器配置:

place at address mem: 0x08003FE0 { readonly section .META_INFO };

我希望链接器在该位置放置10个字节的数据,但我可以在地图文件中看到12个字节(0xC)的大小:

"A1":                                             0xc
  .META_INFO              const    0x08003fe0     0xc  myfile.o [1]
                                 - 0x08003fec     0xc

...工具链会创建一个额外的hex文件,显示链接器添加的2个字节:

0x08003FD0 = ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 
0x08003FE0 = 00 00 00 00 00 01 02 03 59 00 !00!00! ff ff ff ff 
0x08003FF0 = ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff

我假设链接器使用经典的4字节对齐,因为它是32位CPU但是如何强制链接器只放置10个字节? 稍后,应该在特定内存区域的末尾移动结构。所以我不希望有任何填充字节。

我正在使用适用于ARM版本8.22的IAR Embedded Workbench。

祝你好运 杰

1 个答案:

答案 0 :(得分:0)

额外的字节由编译器而不是链接器引入。在编译器中,静态存储器具有4字节的对齐,这意味着每个数据部分被填充到4个字节的倍数。命令行开关或编译指示无法更改此行为。唯一的方法是用汇编程序而不是C来定义元信息结构。