我使用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/