【问题标题】:IAR Linker placing of packed structuresIAR Linker 放置压缩结构
【发布时间】:2018-03-26 09:44:31
【问题描述】:

我正在为使用打包结构的 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

...工具链创建一个额外的十六进制文件,显示链接器添加的 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。

最好的问候 周杰伦

【问题讨论】:

    标签: struct arm alignment iar packed


    【解决方案1】:

    额外的字节是由编译器而不是链接器引入的。在编译器中,静态内存有 4 字节对齐,这意味着每个数据段被填充到 4 字节的倍数。此行为不能通过命令行开关或 pragma 更改。解决它的唯一方法是在汇编程序而不是 C 中定义元信息结构。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-25
      • 2011-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多