From bb21c20b215be14eefeb23442eb6c6d3493cb4b5 Mon Sep 17 00:00:00 2001 From: Arne Schwabe Date: Mon, 4 Apr 2016 01:45:21 +0200 Subject: [PATCH 1/2] Check sizes of eeprom struct sizes at compile time Changing the size of a struct by accident lead to random the wrong data from the eeprom and can screw the eeprom up pretty bad. Better bail out if the eeprom size changes and let the developer make that an intentional choice. The template magic is there to print out the actual and expected size: /Users/arne/oss/opentx/radio/src/datastructs.h:1045:3: error: static_assert failed "struct size changed" static_assert(expectedSize == realSize, "struct size changed"); ^ ~~~~~~~~~~~~~~~~~~~~~~~~ /Users/arne/oss/opentx/radio/src/datastructs.h:1181:3: note: in instantiation of function template specialization 'check_size' requested here CHKSIZE(TrainerData, 168); --- radio/src/datastructs.h | 154 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 154 insertions(+) diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index 831ed2ab8..611dfd955 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -1030,3 +1030,157 @@ PACK(struct RadioData { #undef EXTRA_GENERAL_FIELDS #undef THEME_DATA #undef NOBACKUP + + +#if !defined(BACKUP) +/* Compile time check to test structure size has not changed * + Changing the size of one of the eeprom structs may cause wrong data to + be loaded. Error out if the struct size changes. + This function tries not avoid checking or using the defines + other than the CPU arch and board type so changes in other + defines also trigger the struct size changes */ + +template +void check_size() { + static_assert(expectedSize == realSize, "struct size changed"); +} + +static inline void check_struct() +{ +#define CHKSIZE(x, y) check_size() +#define CHKTYPE(x, y) check_size() + +#if defined(VIRTUALINPUTS) + CHKSIZE(CurveRef, 2); +#endif + + /* Difference between Taranis/Horus is LEN_EXPOMIX_NAME */ + /* Sky9x does not have virtualinputs */ + + /* LEN_CFN_NAME is the difference in CustomFunctionData */ + +#if defined(PCBTARANIS) + CHKSIZE(MixData, 22); + CHKSIZE(ExpoData, 19); + CHKSIZE(LimitData, 13); + CHKSIZE(LogicalSwitchData, 9); + CHKSIZE(CustomFunctionData, 11); + CHKSIZE(FlightModeData, 40); + CHKSIZE(TimerData, 16); + CHKSIZE(SwashRingData, 8); + CHKSIZE(FrSkyBarData, 6); + CHKSIZE(FrSkyLineData, 6); + CHKTYPE(union FrSkyScreenData, 24); + CHKSIZE(FrSkyTelemetryData, 106); + CHKSIZE(ModelHeader, 24); + CHKSIZE(CurveData, 4); + +#if defined(REV9E) + CHKSIZE(RadioData, 952); + CHKSIZE(ModelData, 6519); +#else + CHKSIZE(RadioData, 872); + CHKSIZE(ModelData, 6506); +#endif + +#elif defined(PCBHORUS) + CHKSIZE(MixData, 20); + CHKSIZE(ExpoData, 17); + CHKSIZE(LimitData, 13); + CHKSIZE(CustomFunctionData, 9); + CHKSIZE(FlightModeData, 40); + CHKSIZE(TimerData, 16); + CHKSIZE(SwashRingData, 8); + + CHKSIZE(FrSkyTelemetryData, 7); + CHKSIZE(ModelHeader, 27); + CHKSIZE(CurveData, 4); + CHKSIZE(RadioData, 835); + CHKSIZE(ModelData, 9335); + +#elif defined(PCBSKY9X) + CHKSIZE(MixData, 20); + CHKSIZE(ExpoData, 11); + CHKSIZE(LimitData, 5); + CHKSIZE(CustomFunctionData, 9); + CHKSIZE(FlightModeData, 38); + CHKSIZE(TimerData, 11); + CHKSIZE(SwashRingData, 3); + CHKSIZE(FrSkyBarData, 5); + CHKSIZE(FrSkyLineData, 2); + CHKSIZE(FrSkyTelemetryData, 90); + CHKSIZE(ModelHeader, 12); + CHKTYPE(CurveData, 2); + CHKSIZE(RadioData, 685); + CHKSIZE(ModelData, 4671); +#else + // Common for all variants + CHKSIZE(LimitData, 5); + CHKSIZE(SwashRingData, 3); + CHKSIZE(FrSkyBarData, 3); + CHKSIZE(FrSkyLineData, 2); + CHKSIZE(FrSkyTelemetryData, 43); + CHKSIZE(ModelHeader, 11); + CHKTYPE(CurveData, 1); + + // AVR +#if defined(CPUM2560) || defined(CPUM2561) + CHKSIZE(ExpoData, 5); + CHKSIZE(MixData, 10); +#else + CHKSIZE(MixData, 9); + CHKSIZE(ExpoData, 4); +#endif + +#if defined(CPUM2560) + CHKSIZE(CustomFunctionData, 4); + CHKSIZE(TimerData, 6); +#else + CHKSIZE(CustomFunctionData, 3); + CHKSIZE(TimerData, 3); +#endif + +#if defined(PCBSTD) + CHKSIZE(FlightModeData, 13); + CHKSIZE(RadioData, 84); +#else + CHKSIZE(FlightModeData, 30); + CHKSIZE(RadioData, 85); +#endif + +#if defined(PCBSTD) && defined (MAVLINK) + CHKSIZE(ModelData, 717); +#elif defined(PCBSTD) + CHKSIZE(ModelData, 756); +#elif defined(MAVLINK) + CHKSIZE(ModelData, 978); +#else + CHKSIZE(ModelData, 1017); +#endif + +#endif /* board specific ifdefs*/ + +#if defined(CPUARM) + CHKSIZE(LogicalSwitchData, 9); +#if !defined(COLORLCD) + CHKSIZE(FrSkyChannelData, 7); +#endif + CHKSIZE(TelemetrySensor, 13); + CHKSIZE(ModuleData,70); +#else + CHKSIZE(LogicalSwitchData, 3); + CHKSIZE(FrSkyChannelData, 6); + CHKSIZE(ModuleData, 38); +#endif + +#if !defined(PCBSTD) + CHKSIZE(GVarData, 7); +#endif + + CHKSIZE(FrSkyRSSIAlarm, 1); + CHKSIZE(TrainerData, 16); + +#undef CHKSIZE +#undef CHKSIZEUNION +} +#endif /* BACKUP */ From eab639362a8283cd326e170786d715a2dd314a28 Mon Sep 17 00:00:00 2001 From: Damjan Adamic Date: Tue, 5 Apr 2016 19:12:07 +0200 Subject: [PATCH 2/2] Compilation fix --- radio/src/CMakeLists.txt | 9 +++++---- radio/src/audio_arm.cpp | 3 ++- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/radio/src/CMakeLists.txt b/radio/src/CMakeLists.txt index bad23ac22..dc472f44b 100644 --- a/radio/src/CMakeLists.txt +++ b/radio/src/CMakeLists.txt @@ -979,14 +979,15 @@ if(ARCH STREQUAL ARM) set(CMAKE_ASM_COMPILE_OBJECT " -o ") set(COMMON_FLAGS "-mcpu=${MCU} -mthumb -fomit-frame-pointer -fverbose-asm -Wa,-ahlms=firmware.lst -O${OPT} -gdwarf-2 -DHSE_VALUE=${HSE_VALUE} -fno-exceptions -fdata-sections -ffunction-sections ${WARNING_FLAGS}") + set(COMMON_CPP_FLAGS "${COMMON_FLAGS} -std=gnu++11") set(CMAKE_C_FLAGS "${COMMON_FLAGS} -Wimplicit") set(CMAKE_C_FLAGS_RELWITHDEBINFO "${COMMON_FLAGS} -Wimplicit -g") set(CMAKE_C_FLAGS_RELEASE "${COMMON_FLAGS} -Wimplicit") set(CMAKE_C_FLAGS_DEBUG "${COMMON_FLAGS} -Wimplicit -g") - set(CMAKE_CXX_FLAGS "${COMMON_FLAGS}") - set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${COMMON_FLAGS} -g") - set(CMAKE_CXX_FLAGS_RELEASE "${COMMON_FLAGS}") - set(CMAKE_CXX_FLAGS_DEBUG "${COMMON_FLAGS} -g") + set(CMAKE_CXX_FLAGS "${COMMON_CPP_FLAGS}") + set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${COMMON_CPP_FLAGS} -g") + set(CMAKE_CXX_FLAGS_RELEASE "${COMMON_CPP_FLAGS}") + set(CMAKE_CXX_FLAGS_DEBUG "${COMMON_CPP_FLAGS} -g") set(CMAKE_EXE_LINKER_FLAGS "-mcpu=${MCU} -mthumb -lm -T${RADIO_SRC_DIRECTORY}/${LINKER_SCRIPT} -Wl,-Map=firmware.map,--cref,--no-warn-mismatch,--gc-sections") if(PCB STREQUAL TARANIS) diff --git a/radio/src/audio_arm.cpp b/radio/src/audio_arm.cpp index 3d6369dd1..c9ebe286c 100644 --- a/radio/src/audio_arm.cpp +++ b/radio/src/audio_arm.cpp @@ -20,7 +20,8 @@ #include "opentx.h" #include - +#include + extern OS_MutexID audioMutex; const int16_t sineValues[] =