#ifdef CONFIG_PM_ENABLE
esp_pm_impl_idle_hook();
#endif
-}
-extern void esp_vApplicationWaitiHook( void )
-{
+#ifndef CONFIG_FREERTOS_USE_TICKLESS_IDLE
asm("waiti 0");
+#endif
}
esp_err_t esp_register_freertos_idle_hook_for_cpu(esp_freertos_idle_cb_t new_idle_cb, UBaseType_t cpuid)
#if CONFIG_FREERTOS_USE_TICKLESS_IDLE
-bool IRAM_ATTR vApplicationSleep( TickType_t xExpectedIdleTime )
+void IRAM_ATTR vApplicationSleep( TickType_t xExpectedIdleTime )
{
bool result = false;
portENTER_CRITICAL(&s_switch_lock);
}
}
portEXIT_CRITICAL(&s_switch_lock);
- return result;
+
+ /* Tick less idle was not successful, can block till next interrupt here */
+ if (!result) {
+ asm("waiti 0");
+ }
}
#endif //CONFIG_FREERTOS_USE_TICKLESS_IDLE
hooks can also still be enabled. Please enable this only if you have code that for some
reason can't be migrated to the esp_register_freertos_xxx_hook system.
-if FREERTOS_LEGACY_HOOKS
-
-config FREERTOS_LEGACY_IDLE_HOOK
- bool "Enable legacy idle hook"
- default n
- help
- If enabled, FreeRTOS will call a function called vApplicationIdleHook when the idle thread
- on a CPU is running. Please make sure your code defines such a function.
-
-config FREERTOS_LEGACY_TICK_HOOK
- bool "Enable legacy tick hook"
- default n
- help
- If enabled, FreeRTOS will call a function called vApplicationTickHook when a FreeRTOS
- tick is executed. Please make sure your code defines such a function.
-
-endif #FREERTOS_LEGACY_HOOKS
-
config FREERTOS_MAX_TASK_NAME_LEN
int "Maximum task name length"
range 1 256
*----------------------------------------------------------*/
#define configUSE_PREEMPTION 1
-#define configUSE_IDLE_HOOK ( CONFIG_FREERTOS_LEGACY_IDLE_HOOK )
-
-#define configUSE_TICK_HOOK ( CONFIG_FREERTOS_LEGACY_TICK_HOOK )
+#define configUSE_IDLE_HOOK 1
+#define configUSE_TICK_HOOK 1
#define configTICK_RATE_HZ ( CONFIG_FREERTOS_HZ )
#endif
extern void esp_vApplicationIdleHook( void );
-extern void esp_vApplicationWaitiHook( void );
+extern void esp_vApplicationTickHook( void );
+
+#ifndef CONFIG_FREERTOS_LEGACY_HOOKS
+#define vApplicationIdleHook esp_vApplicationIdleHook
+#define vApplicationTickHook esp_vApplicationTickHook
+#endif /* !CONFIG_FREERTOS_LEGACY_HOOKS */
void _xt_coproc_release(volatile void * coproc_sa_base);
-bool vApplicationSleep( TickType_t xExpectedIdleTime );
+void vApplicationSleep( TickType_t xExpectedIdleTime );
#define portSUPPRESS_TICKS_AND_SLEEP( idleTime ) vApplicationSleep( idleTime )
#if configUSE_TICK_HOOK > 0
extern void vApplicationTickHook( void );
#endif
-extern void esp_vApplicationTickHook( void );
#if portFIRST_TASK_HOOK
extern void vPortFirstTaskHook(TaskFunction_t taskfn);
#if ( configUSE_TICK_HOOK == 1 )
vApplicationTickHook();
#endif /* configUSE_TICK_HOOK */
+ #if ( CONFIG_FREERTOS_LEGACY_HOOKS == 1 )
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.
#if ( configUSE_TICK_HOOK == 1 )
vApplicationTickHook();
#endif /* configUSE_TICK_HOOK */
+ #if ( CONFIG_FREERTOS_LEGACY_HOOKS == 1 )
esp_vApplicationTickHook();
+ #endif /* CONFIG_FREERTOS_LEGACY_HOOKS */
}
else
{
vApplicationTickHook();
}
#endif
+ #if ( CONFIG_FREERTOS_LEGACY_HOOKS == 1 )
esp_vApplicationTickHook();
+ #endif /* CONFIG_FREERTOS_LEGACY_HOOKS */
}
#if ( configUSE_PREEMPTION == 1 )
vApplicationIdleHook();
}
#endif /* configUSE_IDLE_HOOK */
+ #if ( CONFIG_FREERTOS_LEGACY_HOOKS == 1 )
{
/* Call the esp-idf hook system */
esp_vApplicationIdleHook();
}
+ #endif /* CONFIG_FREERTOS_LEGACY_HOOKS */
/* This conditional compilation should use inequality to 0, not equality
#if ( configUSE_TICKLESS_IDLE != 0 )
{
TickType_t xExpectedIdleTime;
- BaseType_t xEnteredSleep = pdFALSE;
/* It is not desirable to suspend then resume the scheduler on
each iteration of the idle task. Therefore, a preliminary
if( xExpectedIdleTime >= configEXPECTED_IDLE_TIME_BEFORE_SLEEP )
{
traceLOW_POWER_IDLE_BEGIN();
- xEnteredSleep = portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime );
+ portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime );
traceLOW_POWER_IDLE_END();
}
else
{
mtCOVERAGE_TEST_MARKER();
}
- /* It might be possible to enter tickless idle again, so skip
- * the fallback sleep hook if tickless idle was successful
- */
- if ( !xEnteredSleep )
- {
- esp_vApplicationWaitiHook();
- }
}
- #else
- esp_vApplicationWaitiHook();
#endif /* configUSE_TICKLESS_IDLE */
}
}
Interrupt respectively.
Vanilla FreeRTOS hooks are referred to as **Legacy Hooks** in ESP-IDF FreeRTOS.
-To enable legacy hooks, :envvar:`CONFIG_FREERTOS_LEGACY_HOOKS`,
-:envvar:`CONFIG_FREERTOS_LEGACY_IDLE_HOOK`, and :envvar:`CONFIG_FREERTOS_LEGACY_TICK_HOOK`
-should all be enabled in ``make menuconfig``.
+To enable legacy hooks, :envvar:`CONFIG_FREERTOS_LEGACY_HOOKS` should be enabled
+in ``make menuconfig``.
Due to vanilla FreeRTOS being designed for single core, ``vApplicationIdleHook()``
and ``vApplicationTickHook()`` can only be defined once. However, the ESP32 is dual core