From 6f122928f0d90d480ea18e41b3a12ef07963ff20 Mon Sep 17 00:00:00 2001 From: liuzhifu Date: Wed, 17 Aug 2016 21:05:29 +0800 Subject: [PATCH] fix socket compile error --- .../freertos/include/freertos/FreeRTOS.h | 4 +++ components/freertos/tasks.c | 27 +++++++++++++++++++ components/lwip/api/sockets.c | 2 +- .../lwip/include/lwip/port/arch/sys_arch.h | 1 + components/lwip/port/freertos/sys_arch.c | 4 +-- 5 files changed, 35 insertions(+), 3 deletions(-) diff --git a/components/freertos/include/freertos/FreeRTOS.h b/components/freertos/include/freertos/FreeRTOS.h index 980f53d577..ff76db27ec 100644 --- a/components/freertos/include/freertos/FreeRTOS.h +++ b/components/freertos/include/freertos/FreeRTOS.h @@ -783,6 +783,10 @@ V8 if desired. */ #define xList List_t #endif /* configENABLE_BACKWARD_COMPATIBILITY */ +#ifndef configESP32_PER_TASK_DATA + #define configESP32_PER_TASK_DATA 1 +#endif + #ifdef __cplusplus } #endif diff --git a/components/freertos/tasks.c b/components/freertos/tasks.c index 97e4b6a004..adeaee60c2 100644 --- a/components/freertos/tasks.c +++ b/components/freertos/tasks.c @@ -84,6 +84,7 @@ task.h is included from an application file. */ #include "timers.h" #include "StackMacros.h" #include "portmacro.h" +#include "semphr.h" /* Lint e961 and e750 are suppressed as a MISRA exception justified because the MPU ports require MPU_WRAPPERS_INCLUDED_FROM_API_FILE to be defined for the @@ -205,6 +206,10 @@ typedef struct tskTaskControlBlock volatile eNotifyValue eNotifyState; #endif +#if (configESP32_PER_TASK_DATA == 1) + void *data; +#endif + } tskTCB; /* The old tskTCB name is maintained above then typedefed to the new TCB_t name @@ -606,6 +611,9 @@ BaseType_t i; if( pxNewTCB != NULL ) { +#if (configESP32_PER_TASK_DATA == 1) + pxNewTCB->data = NULL; +#endif #if( portUSING_MPU_WRAPPERS == 1 ) /* Should the task be created in privileged mode? */ BaseType_t xRunPrivileged; @@ -791,6 +799,11 @@ BaseType_t i; being deleted. */ pxTCB = prvGetTCBFromHandle( xTaskToDelete ); +#if (configESP32_PER_TASK_DATA == 1) + if (pxTCB->data){ + vSemaphoreDelete( pxTCB->data ); + } +#endif /* Remove task from the ready list and place in the termination list. This will stop the task from be scheduled. The idle task will check the termination list and free up any memory allocated by the @@ -4580,7 +4593,21 @@ TickType_t uxReturn; #endif /* configUSE_TASK_NOTIFICATIONS */ /*-----------------------------------------------------------*/ +#if (configESP32_PER_TASK_DATA == 1) +void* xTaskGetPerTaskData(void) +{ + TCB_t *pxTCB = (TCB_t*)(xTaskGetCurrentTaskHandle()); + if (pxTCB){ + if (!pxTCB->data){ + vSemaphoreCreateBinary(pxTCB->data); + } + return (void*)(&pxTCB->data); + } + return NULL; +} +#endif /* configESP32_PER_TASK_DATA */ +/*-----------------------------------------------------------*/ #ifdef FREERTOS_MODULE_TEST #include "tasks_test_access_functions.h" diff --git a/components/lwip/api/sockets.c b/components/lwip/api/sockets.c index ee1c9216b3..5b109eb375 100755 --- a/components/lwip/api/sockets.c +++ b/components/lwip/api/sockets.c @@ -405,7 +405,7 @@ do{\ /** The global array of available sockets */ static struct lwip_sock sockets[NUM_SOCKETS]; -#ifdef LWIP_THREAD_SAFE +#if LWIP_THREAD_SAFE static bool sockets_init_flag = false; #endif /** The global list of tasks waiting for select */ diff --git a/components/lwip/include/lwip/port/arch/sys_arch.h b/components/lwip/include/lwip/port/arch/sys_arch.h index a78dd5a3fb..3d9e460e09 100644 --- a/components/lwip/include/lwip/port/arch/sys_arch.h +++ b/components/lwip/include/lwip/port/arch/sys_arch.h @@ -66,6 +66,7 @@ void sys_arch_assert(const char *file, int line); uint32_t system_get_time(void); sys_sem_t* sys_thread_sem(void); void sys_delay_ms(uint32_t ms); +void* xTaskGetPerTaskData(void); diff --git a/components/lwip/port/freertos/sys_arch.c b/components/lwip/port/freertos/sys_arch.c index caa6d1a3a9..93272a6030 100755 --- a/components/lwip/port/freertos/sys_arch.c +++ b/components/lwip/port/freertos/sys_arch.c @@ -482,8 +482,8 @@ sys_arch_assert(const char *file, int line) */ sys_sem_t* sys_thread_sem(void) { - extern void* xTaskGetLwipSem(void); - return (sys_sem_t*)(xTaskGetLwipSem()); + sys_sem_t *sem = (sys_sem_t*)xTaskGetPerTaskData(); + return sem; } void sys_delay_ms(uint32_t ms) -- 2.40.0