mirror of
https://github.com/espressif/esp-idf.git
synced 2025-08-10 20:54:24 +00:00
freertos: Fix xTaskIncrementTick()
Previously, xTaskIncrementTick() would always trigger a yield (i.e., return pdTRUE) when called on core 1. This would mean core 1 would call vTaskSwitchContext() on every tick, leading to uneccesary CPU overhead. This commit fixes xTaskIncrementTick() in the following ways: - Clearly mark IDF additions in xTaskIncrementTick() - Moved esp_vApplicationTickHook() to be called direclty in xPortSysTickHandler() in order to simplify xTaskIncrementTick(). - Only core 0 calls xTaskIncrementTick() in order to simplify the function's logic. Core 0 is solely responsible for managing xTickCount and xPendedTicks - All other cores call xTaskIncrementTickOtherCores() instead which is a simplified version of xTaskIncrementTick() and handles the following: - Check if core 0 has unblocked a higher priority task to run - Check if the current core requires time slicing - Call vApplicationTickHook()
This commit is contained in:
@@ -3314,9 +3314,25 @@ BaseType_t xTaskGetAffinity( TaskHandle_t xTask ) PRIVILEGED_FUNCTION;
|
||||
* or
|
||||
* + Time slicing is in use and there is a task of equal priority to the
|
||||
* currently running task.
|
||||
*
|
||||
* Note: For SMP, this function must only be called by core 0. Other cores should
|
||||
* call xTaskIncrementTickOtherCores() instead.
|
||||
*/
|
||||
BaseType_t xTaskIncrementTick( void ) PRIVILEGED_FUNCTION;
|
||||
|
||||
#ifdef ESP_PLATFORM
|
||||
/*
|
||||
* THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS ONLY
|
||||
* INTENDED FOR USE WHEN IMPLEMENTING A PORT OF THE SCHEDULER AND IS
|
||||
* AN INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER.
|
||||
*
|
||||
* Called from all other cores except core 0 when their tick interrupt
|
||||
* occurs. This function will check if the current core requires time slicing,
|
||||
* and also call the application tick hook.
|
||||
*/
|
||||
BaseType_t xTaskIncrementTickOtherCores( void ) PRIVILEGED_FUNCTION;
|
||||
#endif // ESP_PLATFORM
|
||||
|
||||
/*
|
||||
* THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS AN
|
||||
* INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER.
|
||||
|
Reference in New Issue
Block a user