]> granicus.if.org Git - esp-idf/commitdiff
freertos: Fix xTaskIncrementTick for unwind the Tick for CPU1
authorKonstantin Kondrashov <konstantin@espressif.com>
Thu, 25 Apr 2019 05:03:01 +0000 (13:03 +0800)
committerbot <bot@espressif.com>
Fri, 7 Jun 2019 09:54:03 +0000 (09:54 +0000)
xTaskIncrementTick have to unwind uxPendedTicks on CPU1 and CPU0.

Use case: If an erase operation was run on the CPU1 then it leads
to starving other tasks which waiting time. Waited tasks just skipped.

Closes: https://github.com/espressif/esp-idf/issues/1952
Closes: IDF-183
components/freertos/tasks.c

index b53fe5c756818ac78da52c7a0a98c102dea949ef..72638c0bd733086dcb37cee8891a9d6887c20a9d 100644 (file)
@@ -2464,12 +2464,11 @@ BaseType_t xSwitchRequired = pdFALSE;
        Increments the tick then checks to see if the new tick value will cause any
        tasks to be unblocked. */
 
-       /* Only let core 0 increase the tick count, to keep accurate track of time. */
-       /* ToDo: This doesn't really play nice with the logic below: it means when core 1 is
-          running a low-priority task, it will keep running it until there is a context
-          switch, even when this routine (running on core 0) unblocks a bunch of high-priority
-          tasks... this is less than optimal -- JD. */
-       if ( xPortGetCoreID()!=0 ) {
+       /* Only allow core 0 increase the tick count in the case of xPortSysTickHandler processing. */
+       /* And allow core 0 and core 1 to unwind uxPendedTicks during xTaskResumeAll. */
+
+       if ( xPortInIsrContext() )
+       {
                #if ( configUSE_TICK_HOOK == 1 )
                vApplicationTickHook();
                #endif /* configUSE_TICK_HOOK */
@@ -2477,11 +2476,10 @@ BaseType_t xSwitchRequired = pdFALSE;
                esp_vApplicationTickHook();
                #endif /* CONFIG_FREERTOS_LEGACY_HOOKS */
 
-               /*
-                 We can't really calculate what we need, that's done on core 0... just assume we need a switch.
-                 ToDo: Make this more intelligent? -- JD
-               */
-               return pdTRUE;
+               if (xPortGetCoreID() == 1 )
+               {
+                       return pdTRUE;
+               }
        }
 
 
@@ -2606,39 +2604,11 @@ BaseType_t xSwitchRequired = pdFALSE;
                }
                #endif /* ( ( configUSE_PREEMPTION == 1 ) && ( configUSE_TIME_SLICING == 1 ) ) */
 
-               {
-                       /* Guard against the tick hook being called when the pended tick
-                       count is being unwound (when the scheduler is being unlocked). */
-                       if( uxPendedTicks == ( UBaseType_t ) 0U )
-                       {
-                               #if ( configUSE_TICK_HOOK == 1 )
-                               vApplicationTickHook();
-                               #endif /* configUSE_TICK_HOOK */
-                               #if ( CONFIG_FREERTOS_LEGACY_HOOKS == 1 )
-                               esp_vApplicationTickHook();
-                               #endif /* CONFIG_FREERTOS_LEGACY_HOOKS */
-                       }
-                       else
-                       {
-                               mtCOVERAGE_TEST_MARKER();
-                       }
-               }
                taskEXIT_CRITICAL_ISR(&xTaskQueueMutex);
        }
        else
        {
                ++uxPendedTicks;
-
-               /* The tick hook gets called at regular intervals, even if the
-               scheduler is locked. */
-               #if ( configUSE_TICK_HOOK == 1 )
-               {
-                       vApplicationTickHook();
-               }
-               #endif
-               #if ( CONFIG_FREERTOS_LEGACY_HOOKS == 1 )
-               esp_vApplicationTickHook();
-               #endif /* CONFIG_FREERTOS_LEGACY_HOOKS */
        }
 
        #if ( configUSE_PREEMPTION == 1 )