From b6ea4eab219d7c67eef4b21f498acdc72da94eb6 Mon Sep 17 00:00:00 2001 From: Wu Jian Gang Date: Mon, 4 Mar 2019 20:40:29 +0800 Subject: [PATCH] feat(freertos): Cleanup tick/idle hook functionality Closes https://github.com/espressif/ESP8266_RTOS_SDK/issues/500 --- components/freertos/Kconfig | 11 +++++++++ components/freertos/freertos/tasks.c | 24 +++++++++++++++++++ .../freertos/port/esp8266/freertos_hooks.c | 3 +++ .../esp8266/include/freertos/FreeRTOSConfig.h | 4 +++- .../include/freertos/esp_freertos_hooks.h | 5 ++++ .../port/esp8266/include/freertos/portmacro.h | 3 +++ components/freertos/port/esp8266/port.c | 18 ++++++++++++-- 7 files changed, 65 insertions(+), 3 deletions(-) diff --git a/components/freertos/Kconfig b/components/freertos/Kconfig index 4224bbc1..61e961d8 100644 --- a/components/freertos/Kconfig +++ b/components/freertos/Kconfig @@ -39,6 +39,17 @@ config FREERTOS_ISR_STACKSIZE help The interrupt handlers have their own stack. The size of the stack can be defined here. +config FREERTOS_EXTENED_HOOKS + bool "Use FreeRTOS extened hooks" + default n + help + By using the "esp_register_freertos_xxx_hook system", extened hook function offers a number + of registerable hooks/callback functions that are called when a timer tick happens, + the idle thread runs etc. + + Otherwise User can also use FreeRTOS raw hook functions "vApplicationIdleHook" and + "vApplicationTickHook". + config FREERTOS_GLOBAL_DATA_LINK_IRAM bool "Link FreeRTOS global data to IRAM" default y diff --git a/components/freertos/freertos/tasks.c b/components/freertos/freertos/tasks.c index a1d355a7..2beb9ac9 100644 --- a/components/freertos/freertos/tasks.c +++ b/components/freertos/freertos/tasks.c @@ -2752,6 +2752,12 @@ BaseType_t xSwitchRequired = pdFALSE; } } #endif /* configUSE_TICK_HOOK */ + + #ifdef CONFIG_FREERTOS_EXTENED_HOOKS + { + esp_vApplicationTickHook(); + } + #endif /* CONFIG_FREERTOS_EXTENED_HOOKS */ } else { @@ -2764,6 +2770,12 @@ BaseType_t xSwitchRequired = pdFALSE; vApplicationTickHook(); } #endif + + #ifdef CONFIG_FREERTOS_EXTENED_HOOKS + { + esp_vApplicationTickHook(); + } + #endif /* CONFIG_FREERTOS_EXTENED_HOOKS */ } #if ( configUSE_PREEMPTION == 1 ) @@ -3309,6 +3321,18 @@ static portTASK_FUNCTION( prvIdleTask, pvParameters ) vApplicationIdleHook(); } #endif /* configUSE_IDLE_HOOK */ + #ifdef CONFIG_FREERTOS_EXTENED_HOOKS + { + /* Call the esp-idf hook system */ + esp_vApplicationIdleHook(); + } + #endif /* CONFIG_FREERTOS_EXTENED_HOOKS */ + + { + extern void esp_internal_idle_hook(void); + + esp_internal_idle_hook(); + } #if CONFIG_ENABLE_FREERTOS_SLEEP /* This conditional compilation should use inequality to 0, not equality diff --git a/components/freertos/port/esp8266/freertos_hooks.c b/components/freertos/port/esp8266/freertos_hooks.c index 4f0b80c0..74337cde 100644 --- a/components/freertos/port/esp8266/freertos_hooks.c +++ b/components/freertos/port/esp8266/freertos_hooks.c @@ -22,6 +22,8 @@ #include "sdkconfig.h" +#ifdef CONFIG_FREERTOS_EXTENED_HOOKS + //We use just a static array here because it's not expected many components will need //an idle or tick hook. #define MAX_HOOKS CONFIG_FREERTOS_MAX_HOOK @@ -158,3 +160,4 @@ void esp_deregister_freertos_tick_hook(esp_freertos_tick_cb_t old_tick_cb) portEXIT_CRITICAL(&hooks_spinlock); } +#endif /* CONFIG_FREERTOS_EXTENED_HOOKS */ diff --git a/components/freertos/port/esp8266/include/freertos/FreeRTOSConfig.h b/components/freertos/port/esp8266/include/freertos/FreeRTOSConfig.h index 25f5e585..d32159c3 100644 --- a/components/freertos/port/esp8266/include/freertos/FreeRTOSConfig.h +++ b/components/freertos/port/esp8266/include/freertos/FreeRTOSConfig.h @@ -50,8 +50,10 @@ #define portNUM_PROCESSORS 1 #define configUSE_PREEMPTION 1 + #define configUSE_IDLE_HOOK 1 -#define configUSE_TICK_HOOK 0 +#define configUSE_TICK_HOOK 1 + #define configUSE_TICKLESS_IDLE 1 #define configCPU_CLOCK_HZ ( ( unsigned long ) 80000000 ) #define configTICK_RATE_HZ ( ( portTickType ) CONFIG_FREERTOS_HZ ) diff --git a/components/freertos/port/esp8266/include/freertos/esp_freertos_hooks.h b/components/freertos/port/esp8266/include/freertos/esp_freertos_hooks.h index 5f24bc35..1dbc27fd 100644 --- a/components/freertos/port/esp8266/include/freertos/esp_freertos_hooks.h +++ b/components/freertos/port/esp8266/include/freertos/esp_freertos_hooks.h @@ -15,6 +15,10 @@ #ifndef __ESP_FREERTOS_HOOKS_H__ #define __ESP_FREERTOS_HOOKS_H__ +#include "sdkconfig.h" + +#ifdef CONFIG_FREERTOS_EXTENED_HOOKS + #include #include "esp_err.h" @@ -127,5 +131,6 @@ void esp_deregister_freertos_tick_hook(esp_freertos_tick_cb_t old_tick_cb); } #endif +#endif /* CONFIG_FREERTOS_EXTENED_HOOKS */ #endif diff --git a/components/freertos/port/esp8266/include/freertos/portmacro.h b/components/freertos/port/esp8266/include/freertos/portmacro.h index 709c7771..5fc67fe3 100644 --- a/components/freertos/port/esp8266/include/freertos/portmacro.h +++ b/components/freertos/port/esp8266/include/freertos/portmacro.h @@ -205,6 +205,9 @@ void _xt_enter_first_task(void); #define xTaskCreatePinnedToCore(pvTaskCode, pcName, usStackDepth, pvParameters, uxPriority, pvCreatedTask, tskNO_AFFINITY) \ xTaskCreate(pvTaskCode, pcName, usStackDepth, pvParameters, uxPriority, pvCreatedTask) +extern void esp_vApplicationIdleHook( void ); +extern void esp_vApplicationTickHook( void ); + #ifdef __cplusplus } #endif diff --git a/components/freertos/port/esp8266/port.c b/components/freertos/port/esp8266/port.c index 3b7ad057..470a6c57 100644 --- a/components/freertos/port/esp8266/port.c +++ b/components/freertos/port/esp8266/port.c @@ -344,15 +344,29 @@ BaseType_t xQueueGenericReceive(QueueHandle_t xQueue, void * const pvBuffer, return xQueueReceive(xQueue, pvBuffer, xTicksToWait); } -void vApplicationIdleHook(void) +void esp_internal_idle_hook(void) { extern void pmIdleHook(void); extern void esp_task_wdt_reset(void); - pmIdleHook(); esp_task_wdt_reset(); + pmIdleHook(); } +#if configUSE_IDLE_HOOK == 1 +void __attribute__((weak)) vApplicationIdleHook(void) +{ + +} +#endif + +#if configUSE_TICK_HOOK == 1 +void __attribute__((weak)) vApplicationTickHook(void) +{ + +} +#endif + uint32_t xPortGetTickRateHz(void) { return (uint32_t)configTICK_RATE_HZ;