From ab3179efd740ba8d3b043c86bd24d87b51f60e18 Mon Sep 17 00:00:00 2001 From: dongheng Date: Wed, 6 Mar 2019 10:42:08 +0800 Subject: [PATCH] feat(freertos): Link FreeRTOS idle task and its hook function to IRAM --- components/esp8266/source/esp_wifi_os_adapter.c | 4 ++-- components/esp8266/source/task_wdt.c | 3 ++- components/freertos/freertos/tasks.c | 6 +++--- .../freertos/port/esp8266/include/freertos/portmacro.h | 2 +- components/freertos/port/esp8266/port.c | 2 +- 5 files changed, 9 insertions(+), 8 deletions(-) diff --git a/components/esp8266/source/esp_wifi_os_adapter.c b/components/esp8266/source/esp_wifi_os_adapter.c index 001b0b32..6964928d 100644 --- a/components/esp8266/source/esp_wifi_os_adapter.c +++ b/components/esp8266/source/esp_wifi_os_adapter.c @@ -75,12 +75,12 @@ static uint32_t task_ms_to_tick_wrapper(uint32_t ms) return (uint32_t)(ms / portTICK_RATE_MS); } -static void task_suspend_all_wrapper(void) +static void IRAM_ATTR task_suspend_all_wrapper(void) { vTaskSuspendAll(); } -static void task_resume_all_wrapper(void) +static void IRAM_ATTR task_resume_all_wrapper(void) { xTaskResumeAll(); } diff --git a/components/esp8266/source/task_wdt.c b/components/esp8266/source/task_wdt.c index 40cd8c30..bef5ae07 100644 --- a/components/esp8266/source/task_wdt.c +++ b/components/esp8266/source/task_wdt.c @@ -14,6 +14,7 @@ #include +#include "esp_attr.h" #include "esp_log.h" #include "esp_libc.h" #include "esp_wifi_osi.h" @@ -78,7 +79,7 @@ esp_err_t esp_task_wdt_init(void) * @brief Reset(Feed) the Task Watchdog Timer (TWDT) on behalf of the currently * running task */ -void esp_task_wdt_reset(void) +void IRAM_ATTR esp_task_wdt_reset(void) { WDT_FEED(); } diff --git a/components/freertos/freertos/tasks.c b/components/freertos/freertos/tasks.c index 1cd9c9f4..2a3e662f 100644 --- a/components/freertos/freertos/tasks.c +++ b/components/freertos/freertos/tasks.c @@ -2054,7 +2054,7 @@ void vTaskEndScheduler( void ) } /*----------------------------------------------------------*/ -void vTaskSuspendAll( void ) +void IRAM_ATTR vTaskSuspendAll( void ) { /* A critical section is not required as the variable is of type BaseType_t. Please read Richard Barry's reply in the following link to a @@ -2127,7 +2127,7 @@ void vTaskSuspendAll( void ) #endif /* configUSE_TICKLESS_IDLE */ /*----------------------------------------------------------*/ -BaseType_t xTaskResumeAll( void ) +BaseType_t IRAM_ATTR xTaskResumeAll( void ) { TCB_t *pxTCB = NULL; BaseType_t xAlreadyYielded = pdFALSE; @@ -2611,7 +2611,7 @@ implementations require configUSE_TICKLESS_IDLE to be set to a value other than #endif /* INCLUDE_xTaskAbortDelay */ /*----------------------------------------------------------*/ -BaseType_t xTaskIncrementTick( void ) +BaseType_t IRAM_ATTR xTaskIncrementTick( void ) { TCB_t * pxTCB; TickType_t xItemValue; diff --git a/components/freertos/port/esp8266/include/freertos/portmacro.h b/components/freertos/port/esp8266/include/freertos/portmacro.h index 709c7771..e220ca2a 100644 --- a/components/freertos/port/esp8266/include/freertos/portmacro.h +++ b/components/freertos/port/esp8266/include/freertos/portmacro.h @@ -151,7 +151,7 @@ void PortEnableInt_NoNest( void ); not necessary for to use this port. They are defined so the common demo files (which build with all the ports) will build. */ #define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) -#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void IRAM_ATTR vFunction( void *pvParameters ) /*-----------------------------------------------------------*/ void _xt_user_exit (void); diff --git a/components/freertos/port/esp8266/port.c b/components/freertos/port/esp8266/port.c index f03b2e9e..3f18946e 100644 --- a/components/freertos/port/esp8266/port.c +++ b/components/freertos/port/esp8266/port.c @@ -344,7 +344,7 @@ BaseType_t xQueueGenericReceive(QueueHandle_t xQueue, void * const pvBuffer, return xQueueReceive(xQueue, pvBuffer, xTicksToWait); } -void vApplicationIdleHook(void) +void IRAM_ATTR vApplicationIdleHook(void) { extern void pmIdleHook(void); extern void esp_task_wdt_reset(void);