存储在EEPROM中的数据结构的卷影副本

时间:2015-10-23 12:11:42

标签: c arm structure shadow eeprom

我正在使用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大小?

3 个答案:

答案 0 :(得分:3)

只需写下这样的内容:

<b> Online players: 

<?php
$content = file_get_contents("http://api.minetools.eu/ping/play.desnia.net/25565");
echo ($content, ["online"]);
}
?>
</b>

答案 1 :(得分: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];

答案 2 :(得分:0)

  

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

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

  

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

不幸的是,我不能直截了当地回答这个问题。从我的角度来看,这取决于问题第一部分的解决方案。