From 2dd8b8702f59e8627d6f3bf9074973fd0cceb5af Mon Sep 17 00:00:00 2001 From: Damjan Adamic Date: Sat, 8 Oct 2016 22:09:25 +0200 Subject: [PATCH] Re #3827: added mutex to getADC(), because adcRead() is not reentrant (#3889) * Re #3827: added mutex to getADC(), because adcRead() is not reentrant * Re #3827: alternative solution to prevent calling getADC() from different threads, because adcRead() is not reentrant * Cosmetics --- radio/src/opentx.cpp | 21 +++++++++++++-------- radio/src/opentx.h | 5 +++++ radio/src/switches.cpp | 10 ++++++---- radio/src/targets/simu/simpgmspace.h | 1 + 4 files changed, 25 insertions(+), 12 deletions(-) diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index 6e1d7b9da..8aa5e53f3 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -1119,7 +1119,7 @@ void checkTHR() return; } - getADC(); + GET_ADC_IF_MIXER_NOT_RUNNING(); evalInputs(e_perout_mode_notrainer); // let do evalInputs do the job @@ -1138,9 +1138,7 @@ void checkTHR() while (1) { - SIMU_SLEEP(1); - - getADC(); + GET_ADC_IF_MIXER_NOT_RUNNING(); evalInputs(e_perout_mode_notrainer); // let do evalInputs do the job @@ -1171,6 +1169,12 @@ void checkTHR() doLoopCommonActions(); wdt_reset(); + + SIMU_SLEEP(1); +#if defined(CPUARM) + CoTickDelay(10); +#endif + } #endif @@ -1200,6 +1204,9 @@ void alert(const pm_char * t, const pm_char * s ALERT_SOUND_ARG) while(1) { SIMU_SLEEP(1); +#if defined(CPUARM) + CoTickDelay(10); +#endif if (keyDown()) break; // wait for key release @@ -1474,7 +1481,7 @@ void getADC() s_anaFilt[x] = (s_anaFilt[x] - previous) + v; } else -#endif +#endif // #if defined(VIRTUAL_INPUTS) { //use unfiltered value s_anaFilt[x] = v * JITTER_ALPHA; @@ -1486,7 +1493,6 @@ void getADC() } #endif -#if defined(CPUARM) #define ANAFILT_MAX (2 * RESX * JITTER_ALPHA * ANALOG_MULTIPLIER - 1) StepsCalibData * calib = (StepsCalibData *) &g_eeGeneral.calib[x]; if (IS_POT_MULTIPOS(x) && IS_MULTIPOS_CALIBRATED(calib)) { @@ -1500,10 +1506,9 @@ void getADC() } } } -#endif // defined(CPUARM) } } -#endif +#endif // #if defined(CPUARM) #endif // SIMU diff --git a/radio/src/opentx.h b/radio/src/opentx.h index dc34a2621..2afcb5d83 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -847,6 +847,11 @@ void checkAll(); #if !defined(SIMU) void getADC(); + #if defined(CPUARM) + #define GET_ADC_IF_MIXER_NOT_RUNNING() do { if (s_pulses_paused) getADC(); } while(0) + #else + #define GET_ADC_IF_MIXER_NOT_RUNNING() getADC() + #endif #endif #if defined(SBUS) diff --git a/radio/src/switches.cpp b/radio/src/switches.cpp index 7d5213457..0d4488b96 100644 --- a/radio/src/switches.cpp +++ b/radio/src/switches.cpp @@ -737,14 +737,13 @@ void checkSwitches() while (1) { #if defined(TELEMETRY_MOD_14051) || defined(TELEMETRY_MOD_14051_SWAPPED) -// FIXME: One getADC() call only reads one 14051 MUX input. To have all switch states updated, we need to call it MUX_MAX+1 times. -#define GETADC_COUNT (MUX_MAX+1) + #define GETADC_COUNT (MUX_MAX+1) #elif defined(PCBTARANIS) || defined(PCBFLAMENCO) || defined(PCBHORUS) -#define GETADC_COUNT 1 + #define GETADC_COUNT 1 #endif #ifdef GETADC_COUNT for (uint8_t i=0; i