diff --git a/radio/src/mixer_scheduler.cpp b/radio/src/mixer_scheduler.cpp index dcf95383b..fef9034c0 100644 --- a/radio/src/mixer_scheduler.cpp +++ b/radio/src/mixer_scheduler.cpp @@ -68,9 +68,13 @@ void mixerSchedulerSetPeriod(uint8_t moduleIdx, uint16_t periodUs) mixerSchedules[moduleIdx].period = periodUs; } -bool mixerSchedulerWaitForTrigger(uint8_t timeoutMs) +void mixerSchedulerClearTrigger() { RTOS_CLEAR_FLAG(mixerFlag); +} + +bool mixerSchedulerWaitForTrigger(uint8_t timeoutMs) +{ return RTOS_WAIT_FLAG(mixerFlag, timeoutMs); } diff --git a/radio/src/mixer_scheduler.h b/radio/src/mixer_scheduler.h index 601f3fcd7..75a6ad1aa 100644 --- a/radio/src/mixer_scheduler.h +++ b/radio/src/mixer_scheduler.h @@ -43,6 +43,9 @@ void mixerSchedulerResetTimer(); // Set the scheduling period for a given module void mixerSchedulerSetPeriod(uint8_t moduleIdx, uint16_t periodUs); +// Clear the flag before waiting +void mixerSchedulerClearTrigger(); + // Wait for the scheduler timer to trigger // returns true if timeout, false otherwise bool mixerSchedulerWaitForTrigger(uint8_t timeoutMs); @@ -66,6 +69,7 @@ void mixerSchedulerISRTrigger(); #define mixerSchedulerStop() #define mixerSchedulerResetTimer() #define mixerSchedulerSetPeriod(m,p) +#define mixerSchedulerClearTrigger() static inline bool mixerSchedulerWaitForTrigger(uint8_t timeout) { diff --git a/radio/src/targets/common/arm/stm32/mixer_scheduler_driver.cpp b/radio/src/targets/common/arm/stm32/mixer_scheduler_driver.cpp index 7f7b23a1c..79e5c7bd0 100644 --- a/radio/src/targets/common/arm/stm32/mixer_scheduler_driver.cpp +++ b/radio/src/targets/common/arm/stm32/mixer_scheduler_driver.cpp @@ -39,8 +39,10 @@ void mixerSchedulerStart() NVIC_SetPriority(MIXER_SCHEDULER_TIMER_IRQn, 8); MIXER_SCHEDULER_TIMER->SR &= TIM_SR_UIF; // clear interrupt flag - MIXER_SCHEDULER_TIMER->DIER |= TIM_DIER_UIE; // enable interrupt MIXER_SCHEDULER_TIMER->CR1 |= TIM_CR1_CEN; + + mixerSchedulerClearTrigger(); + mixerSchedulerEnableTrigger(); } void mixerSchedulerStop() @@ -53,6 +55,7 @@ void mixerSchedulerResetTimer() { mixerSchedulerDisableTrigger(); MIXER_SCHEDULER_TIMER->CNT = 0; + mixerSchedulerClearTrigger(); mixerSchedulerEnableTrigger(); } diff --git a/radio/src/tasks.cpp b/radio/src/tasks.cpp index 4878535fd..a0f7384a9 100644 --- a/radio/src/tasks.cpp +++ b/radio/src/tasks.cpp @@ -136,14 +136,15 @@ TASK_FUNCTION(mixerTask) s_pulses_paused = true; mixerSchedulerInit(); + #if !defined(PCBSKY9X) mixerSchedulerStart(); #endif while (true) { for (int timeout = 0; timeout < MIXER_MAX_PERIOD; timeout += MIXER_FREQUENT_ACTIONS_PERIOD) { - bool interruptedByTimeout = mixerSchedulerWaitForTrigger(MIXER_FREQUENT_ACTIONS_PERIOD); execMixerFrequentActions(); + bool interruptedByTimeout = mixerSchedulerWaitForTrigger(MIXER_FREQUENT_ACTIONS_PERIOD); if (!interruptedByTimeout) { break; } @@ -155,7 +156,7 @@ TASK_FUNCTION(mixerTask) #endif #if !defined(PCBSKY9X) - // re-enable trigger + mixerSchedulerClearTrigger(); mixerSchedulerEnableTrigger(); #endif