@@ -128,22 +128,28 @@ void effectTask(void* pvParameters) {
128128
129129 while (true ) {
130130 if (layerP.lights .useDoubleBuffer ) {
131- // effectTask always writes to channelsBack, reads previous channelsBack
132- layerP.loop (); // getRGB and setRGB both use channelsBack
133-
134- if (millis () - last20ms >= 20 ) {
135- last20ms = millis ();
136- layerP.loop20ms ();
137- }
138-
139- // Atomic swap channels
140131 xSemaphoreTake (swapMutex, portMAX_DELAY);
141- uint8_t * temp = layerP.lights .channelsD ;
142- layerP.lights .channelsD = layerP.lights .channelsE ;
143- layerP.lights .channelsE = temp;
144- newFrameReady = true ;
132+ bool canProduce = !newFrameReady;
145133 xSemaphoreGive (swapMutex);
146134
135+ if (canProduce) {
136+ // effectTask always writes to channelsBack, reads previous channelsBack
137+ layerP.loop (); // getRGB and setRGB both use channelsBack
138+
139+ if (millis () - last20ms >= 20 ) {
140+ last20ms = millis ();
141+ layerP.loop20ms ();
142+ }
143+
144+ // Atomic swap channels
145+ xSemaphoreTake (swapMutex, portMAX_DELAY);
146+ uint8_t * temp = layerP.lights .channelsD ;
147+ layerP.lights .channelsD = layerP.lights .channelsE ;
148+ layerP.lights .channelsE = temp;
149+ newFrameReady = true ;
150+ xSemaphoreGive (swapMutex);
151+ }
152+
147153 } else {
148154 // Single buffer mode
149155 xSemaphoreTake (swapMutex, portMAX_DELAY);
@@ -167,9 +173,9 @@ void driverTask(void* pvParameters) {
167173 // layerP.setup() done in effectTask
168174
169175 while (true ) {
170- xSemaphoreTake (swapMutex, portMAX_DELAY);
171176 esp32sveltekit.lps ++;
172-
177+
178+ xSemaphoreTake (swapMutex, portMAX_DELAY);
173179 if (layerP.lights .useDoubleBuffer ) {
174180 if (newFrameReady) {
175181 newFrameReady = false ;
0 commit comments