1

我将 ARM GCC 用于 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 中的影子副本...

我的问题:每次我在 APPLICATION_CONFIG 结构中添加新字段(或更改某些内容)时,有没有办法(更好、更灵活)拥有卷影副本(用于 EEPROM)而不必弄乱 reservedFFU 大小?

4

3 回答 3

3

写这样的东西:

typedef struct
{
    MIN_COIN_RENDERING minCoinRendering[10];
    CONFIG_HOPPER hopper[5];
} APPLICATION_CONFIG;

typedef struct
{
    APPLICATION_CONFIG config;
    uint8_t reserved[128 - sizeof(APPLICATION_CONFIG) - 2];
    uint16_t crc;
} EEPROM_LAYOUT;
于 2015-10-23T12:32:34.070 回答
2

您想要具有特定偏移量的数据的固定大小的事实听起来很像您想要部分结构、部分数组的东西。如果您准备好以稍微不同的方式对待 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];
于 2015-10-23T12:47:25.720 回答
0

第一个问题是如何正确确定 FFU 保留的字节数(上面用 X 标记)。

正如您自己提到的那样,编译器对齐结构中的字段并且实际上是实现定义的,那么您必须确保通过编译器设置来确定它如何精确地对齐数据。也许它具有一些更改结构对齐设置的语句。(我在 ARM GCC 中没有深入挖掘来肯定地说)。

我的问题:每次我在 APPLICATION_CONFIG 结构中添加新字段(或更改某些内容)时,有没有办法(更好、更灵活)拥有卷影副本(用于 EEPROM)而不必弄乱 reservedFFU 大小?

不幸的是,我无法直接回答这个问题。从我的角度来看,这取决于您问题第一部分的解决方案。

于 2015-10-23T12:44:05.873 回答