From e00326a6db6671414b43ee15e092c57ea976102f Mon Sep 17 00:00:00 2001 From: Selene ToyKeeper Date: Tue, 7 Nov 2023 08:09:10 -0700 Subject: made build fail if eeprom data bigger than MCU's eeprom size Based on techniques suggested by DurvalMenezes here: https://github.com/ToyKeeper/anduril/pull/4 --- fsm/eeprom.h | 49 +++++++++++++++++++++++++++---------------------- 1 file changed, 27 insertions(+), 22 deletions(-) (limited to 'fsm/eeprom.h') diff --git a/fsm/eeprom.h b/fsm/eeprom.h index 440d2b3..1e10fd2 100644 --- a/fsm/eeprom.h +++ b/fsm/eeprom.h @@ -7,44 +7,49 @@ #include // set this higher to enable normal eeprom functions +// TODO: rename to EEPROM_BYTES_NEEDED or similar, to make purpose clearer #ifndef EEPROM_BYTES #define EEPROM_BYTES 0 #endif // set this higher to enable wear-levelled eeprom functions +// TODO: rename to EEPROM_WL_BYTES_NEEDED or similar, to make purpose clearer #ifndef EEPROM_WL_BYTES #define EEPROM_WL_BYTES 0 #endif #ifdef USE_EEPROM -// this fails when EEPROM_BYTES is a sizeof() -//#if EEPROM_BYTES >= (EEPSIZE/2) -//#error Requested EEPROM_BYTES too big. -//#endif -#ifdef EEPROM_OVERRIDE -uint8_t *eeprom; -#else -uint8_t eeprom[EEPROM_BYTES]; -#endif -uint8_t load_eeprom(); // returns 1 for success, 0 for no data found -void save_eeprom(); -#define EEP_START (EEPSIZE/2) + #ifdef USE_EEPROM_WL + // split eeprom in half + #define EEP_START (EEPROM_SIZE/2) + BUILD_ASSERT(eep_less_than_half, EEPROM_BYTES <= (EEPROM_SIZE/2)); + #else + // use entire eeprom + #define EEP_START 0 + BUILD_ASSERT(eep_data_fits, EEPROM_BYTES <= EEPROM_SIZE); + #endif + #ifdef EEPROM_OVERRIDE + uint8_t *eeprom; + #else + uint8_t eeprom[EEPROM_BYTES]; + #endif + uint8_t load_eeprom(); // returns 1 for success, 0 for no data found + void save_eeprom(); #endif #ifdef USE_EEPROM_WL -#if EEPROM_WL_BYTES >= (EEPSIZE/4) -#error Requested EEPROM_WL_BYTES too big. -#endif -uint8_t eeprom_wl[EEPROM_WL_BYTES]; -uint8_t load_eeprom_wl(); // returns 1 for success, 0 for no data found -void save_eeprom_wl(); -#define EEP_WL_SIZE (EEPSIZE/2) + #define EEP_WL_SIZE (EEPROM_SIZE/2) + // ensure space for at least 2 slots for wear levelling + BUILD_ASSERT(eepwl_two_slots_minimum, EEPROM_WL_BYTES <= (EEP_WL_SIZE/2)); + uint8_t eeprom_wl[EEPROM_WL_BYTES]; + uint8_t load_eeprom_wl(); // returns 1 for success, 0 for no data found + void save_eeprom_wl(); #endif -#if EEPSIZE > 256 -#define EEP_OFFSET_T uint16_t +#if EEPROM_SIZE > 256 + #define EEP_OFFSET_T uint16_t #else -#define EEP_OFFSET_T uint8_t + #define EEP_OFFSET_T uint8_t #endif // if this marker isn't found, the eeprom is assumed to be blank -- cgit v1.2.3