mirror of
https://github.com/opentx/opentx.git
synced 2025-07-14 11:59:50 +03:00
Merge pull request #3401 from opentx/schwabe/check_struct_sizes
check struct sizes
This commit is contained in:
commit
2acf6aed3b
3 changed files with 161 additions and 5 deletions
|
@ -986,14 +986,15 @@ if(ARCH STREQUAL ARM)
|
|||
set(CMAKE_ASM_COMPILE_OBJECT "<CMAKE_ASM_COMPILER> -o <OBJECT> <SOURCE>")
|
||||
|
||||
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)
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
|
||||
#include "opentx.h"
|
||||
#include <math.h>
|
||||
#include <strings.h>
|
||||
|
||||
extern OS_MutexID audioMutex;
|
||||
|
||||
|
|
|
@ -1031,3 +1031,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 <typename ToCheck, size_t expectedSize, size_t realSize = sizeof(ToCheck)>
|
||||
void check_size() {
|
||||
static_assert(expectedSize == realSize, "struct size changed");
|
||||
}
|
||||
|
||||
static inline void check_struct()
|
||||
{
|
||||
#define CHKSIZE(x, y) check_size<struct x, y>()
|
||||
#define CHKTYPE(x, y) check_size<x, y>()
|
||||
|
||||
#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 */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue