我使用ARMGCC作为STM32F105RC处理器。
在我的申请表中,我现在有这样的东西:

typedef struct
{
  uint16_t coinValue;
  uint8_t  minimumCoins;
} MIN_COIN_RENDERING;

typedef struct
{
  uint16_t coinValue;
  uint8_t  hopperType;
  uint8_t  motorDelay;
} CONFIG_HOPPER;

typedef struct
{
  MIN_COIN_RENDERING minCoinRendering[10];
  CONFIG_HOPPER hopper[5];
  uint8_t reservedFFU[X];
  //
  uint16_t crc;
} APPLICATION_CONFIG; // MUST have 128 bytes!

第一个问题是如何正确地确定保留的FFU字节数(上面用X标记)。
如果你说:X=128-(10 X 3+5 X 4+2)=76,那么这不是真的!
X的正确值是66,因为编译器将结构中的字段对齐(至少与编译器的默认设置对齐)。
整个结构必须有128个字节,因为它将被存储到EEPROM或从EEPROM恢复。这个结构被用作我们在EEPROM中所拥有内容的影子拷贝。。。
我的问题是:在应用程序配置结构中,每次添加一个新字段(或更改某个)时,是否有一个方法(更好、灵活)拥有一个影子副本(对于EEPROM),而不必与保留的FIFFFU大小混淆?

最佳答案

事实上,你想要一个固定大小的数据在特定的偏移听起来很像你想要的东西,部分结构,部分数组。如果你准备对crc有一点不同的处理,为什么不完全这样做呢!

typedef union
{
  struct {
    MIN_COIN_RENDERING minCoinRendering[10];
    CONFIG_HOPPER hopper[5];
  };
  uint16_t raw[64];
} APPLICATION_CONFIG;

// Then e.g.
APPLICATION_CONFIG config;
config.hopper[3].motorDelay = 7; // Thanks to anonymous structures
uint16_t *crcptr = &config.raw[63];

关于c - 卷影副本用于存储在EEPROM中的数据结构,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33302013/

10-11 23:04
查看更多