【问题标题】:Struct packing in different memory sections on AVR在 AVR 上的不同内存段中打包结构
【发布时间】:2019-10-03 10:17:35
【问题描述】:

有如下结构:

typedef struct {
    uint8_t val1;
    uint16_t val2;
}some_config_type;

some_config_type EEMEM config = {
    .val1 = 20,
    .val2 = 2000
};

配置存储在我要从中加载的 eeprom 内存中。我不确定 avr gcc 或 C 中是否有共同的规则可以保证当我使用 eeprom_read_block 复制到另一个内存部分的 ram 时,bot 结构布局将是相同的。我想确保这在任何情况下都不会中断,并且内存布局是相同的,并且不依赖于部分。

【问题讨论】:

  • 如果你总是使用some_config_typesizeof(some_config_type) 那么应该没有问题。结构布局不会因为您将结构从一个内存区域复制到另一个内存区域而改变。
  • 是的,当我使用任何复制功能时,我总是在我的程序中使用 sizeof
  • 是的,如果你使用#pragma pack(1),你肯定数据会正确存储在内存中,还有更多:stackoverflow.com/questions/3318410/pragma-pack-effect
  • 一般来说,你会希望以降低对齐要求来订购结构,以确保最紧密的包装
  • @P__J__ #pragma pack 不仅适用于微软编译器,我还在 gcc linux 和 gcc arm 工具链上进行了测试。在我的链接中是使用#pragma pack 的解释

标签: c struct embedded alignment avr


【解决方案1】:

AVR 是一个 8 位 MCU,因此就 CPU 而言它没有对齐要求。此特定系统上不应有 struct 填充。

闪存和 EEPROM 可能有对齐要求,与它们的内存扇区有关,但这仅与写入这些区域的驱动程序有关。它不影响编译器如何分配struct

我不确定 avr gcc 或 C 中是否有共同的规则,它保证当我使用 eeprom_read_block 复制到另一个内存部分的 ram 时,bot 结构布局将是相同的。

是的,一个结构在整个程序中总是具有相同的内存布局,无论它存储在哪里。这是由 C 标准保证的。

RAM 和 EEPROM 可能有不同的对齐要求,但没有“线后魔法”处理 - 在编写闪存/EEPROM 驱动程序时,您必须手动处理这种情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-24
    • 2023-02-23
    • 2011-10-11
    • 2016-11-02
    • 2022-07-27
    • 2020-04-14
    • 2019-07-20
    相关资源
    最近更新 更多