From: Liu Zhi Fu Date: Thu, 15 Dec 2016 06:37:21 +0000 (+0800) Subject: lwip: fix lwip dual core issue X-Git-Tag: v2.0-rc1~130^2~1 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5e2ae7ac19220c75d23c2c2f8433d0296d41ddad;p=esp-idf lwip: fix lwip dual core issue Call xSemaphoreGiveFromISR instead xSemaphoreGive when the calling context is in critical section. --- diff --git a/components/lwip/port/freertos/sys_arch.c b/components/lwip/port/freertos/sys_arch.c index 8d0dd08c58..9efb151e8e 100755 --- a/components/lwip/port/freertos/sys_arch.c +++ b/components/lwip/port/freertos/sys_arch.c @@ -42,6 +42,8 @@ /* This is the number of threads that can be started with sys_thread_new() */ #define SYS_THREAD_MAX 4 +static bool g_lwip_in_critical_section = false; + #if !LWIP_COMPAT_MUTEX /** Create a new mutex * @param mutex pointer to the mutex to create @@ -122,7 +124,11 @@ sys_sem_new(sys_sem_t *sem, u8_t count) void sys_sem_signal(sys_sem_t *sem) { - xSemaphoreGive(*sem); + if (g_lwip_in_critical_section){ + xSemaphoreGiveFromISR(*sem, NULL); + } else { + xSemaphoreGive(*sem); + } } /*-----------------------------------------------------------------------------------*/ @@ -453,6 +459,7 @@ sys_prot_t sys_arch_protect(void) { portENTER_CRITICAL(&g_lwip_mux); + g_lwip_in_critical_section = true; return (sys_prot_t) 1; } @@ -467,6 +474,7 @@ void sys_arch_unprotect(sys_prot_t pval) { (void) pval; + g_lwip_in_critical_section = false; portEXIT_CRITICAL(&g_lwip_mux); }