Я использую 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...
Мой вопрос: есть ли способ (лучший, гибкий) иметь теневую копию (для EEPROM) без необходимости возиться с размером зарезервированного FFU каждый раз, когда я добавляю новое поле (или что-то меняю) в структуре APPLICATION_CONFIG?
uint16_t CRC
в необработанную часть этого объединения, правильно? 23.10.2015struct { uint16_t data[63]; uint16_t crc; }
действительно приходит в голову, но я чувствую себя грязным, предлагая ее... 23.10.2015struct { uint8_t data[126]; uint16_t crc; }
, поскольку функция CRC обычно запрашивает байтовый * блок данных, так что это было бы удобно. В противном случае, я полагаю, потребуется кастинг... 24.10.2015