diff --git a/radio/src/debug.cpp b/radio/src/debug.cpp index 30ced2354..101359994 100644 --- a/radio/src/debug.cpp +++ b/radio/src/debug.cpp @@ -223,6 +223,8 @@ const char * debugTimerNames[DEBUG_TIMERS_COUNT] = { ,"ADC read " // debugTimerAdcRead, ,"ADC loop " // debugTimerAdcLoop, ,"ADC wait " // debugTimerAdcWait, + ,"mix-pulses " // debugTimerMixerCalcToUsage + ,"mix-int. " // debugTimerMixerIterval }; #endif diff --git a/radio/src/debug.h b/radio/src/debug.h index 089943cd8..6edabc6f0 100644 --- a/radio/src/debug.h +++ b/radio/src/debug.h @@ -324,6 +324,9 @@ enum DebugTimers { debugTimerAdcLoop, debugTimerAdcWait, + debugTimerMixerCalcToUsage, + debugTimerMixerIterval, + DEBUG_TIMERS_COUNT }; diff --git a/radio/src/opentx.h b/radio/src/opentx.h index 0d90d15fa..5e17361ac 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -717,6 +717,7 @@ extern uint8_t flightModeTransitionLast; void evalFlightModeMixes(uint8_t mode, uint8_t tick10ms); void evalMixes(uint8_t tick10ms); void doMixerCalculations(); +void scheduleNextMixerCalculation(uint8_t module, uint16_t delay); #if defined(CPUARM) void checkTrims(); diff --git a/radio/src/pulses/pulses_arm.cpp b/radio/src/pulses/pulses_arm.cpp index 0354e180d..7bfd01775 100644 --- a/radio/src/pulses/pulses_arm.cpp +++ b/radio/src/pulses/pulses_arm.cpp @@ -179,12 +179,14 @@ void setupPulses(unsigned int port) switch (required_protocol) { case PROTO_PXX: setupPulsesPXX(port); + scheduleNextMixerCalculation(port, 9); break; #if defined(DSM2) case PROTO_DSM2_LP45: case PROTO_DSM2_DSM2: case PROTO_DSM2_DSMX: setupPulsesDSM2(port); + scheduleNextMixerCalculation(port, 11); break; #endif #if defined(CROSSFIRE) @@ -194,6 +196,7 @@ void setupPulses(unsigned int port) uint8_t * crossfire = modulePulsesData[port].crossfire.pulses; createCrossfireFrame(crossfire, &channelOutputs[g_model.moduleData[port].channelsStart]); sportSendBuffer(crossfire, CROSSFIRE_FRAME_LEN); + // TODO scheduleNextMixerCalculation() } break; } @@ -205,6 +208,7 @@ void setupPulses(unsigned int port) #endif case PROTO_PPM: setupPulsesPPM(port); + scheduleNextMixerCalculation(port, (45+g_model.moduleData[port].ppm.frameLength)/2); break ; default: break; diff --git a/radio/src/tasks_arm.cpp b/radio/src/tasks_arm.cpp index 1bea7d9d6..88f6e9324 100644 --- a/radio/src/tasks_arm.cpp +++ b/radio/src/tasks_arm.cpp @@ -91,8 +91,11 @@ uint16_t stackAvailable() } #endif +uint32_t nextMixerTime[NUM_MODULES]; + void mixerTask(void * pdata) { + static uint32_t lastRunTime; s_pulses_paused = true; while(1) { @@ -102,12 +105,35 @@ void mixerTask(void * pdata) return; #endif + CoTickDelay(1); + + uint32_t now = CoGetOSTime(); + bool run = false; + if ((now - lastRunTime) > 10) { // run at least every 20ms + run = true; + } + else if (now == nextMixerTime[0]) { + run = true; + } +#if NUM_MODULES >= 2 + else if (now == nextMixerTime[1]) { + run = true; + } +#endif + if (!run) { + continue; // go back to sleep + } + + lastRunTime = now; + if (!s_pulses_paused) { uint16_t t0 = getTmr2MHz(); DEBUG_TIMER_START(debugTimerMixer); CoEnterMutexSection(mixerMutex); doMixerCalculations(); + DEBUG_TIMER_START(debugTimerMixerCalcToUsage); + DEBUG_TIMER_SAMPLE(debugTimerMixerIterval); CoLeaveMutexSection(mixerMutex); DEBUG_TIMER_STOP(debugTimerMixer); @@ -125,12 +151,18 @@ void mixerTask(void * pdata) t0 = getTmr2MHz() - t0; if (t0 > maxMixerDuration) maxMixerDuration = t0 ; } - - CoTickDelay(1); // 2ms for now } } -#define MENU_TASK_PERIOD_TICKS 10 // 20ms +void scheduleNextMixerCalculation(uint8_t module, uint16_t delay) +{ + // Schedule next mixer calculation time, + // for now assume mixer calculation takes 2 ms. + nextMixerTime[module] = (uint32_t)CoGetOSTime() + (delay)/2 - 1/*2ms*/; + DEBUG_TIMER_STOP(debugTimerMixerCalcToUsage); +} + +#define MENU_TASK_PERIOD_TICKS 25 // 50ms void menusTask(void * pdata) {