lwip: fix lwip dual core issue

Call xSemaphoreGiveFromISR instead xSemaphoreGive when the calling context is in critical section.
This commit is contained in:
Liu Zhi Fu 2016-12-15 14:37:21 +08:00
parent f1390fa7c9
commit 5e2ae7ac19

View File

@ -42,6 +42,8 @@
/* This is the number of threads that can be started with sys_thread_new() */ /* This is the number of threads that can be started with sys_thread_new() */
#define SYS_THREAD_MAX 4 #define SYS_THREAD_MAX 4
static bool g_lwip_in_critical_section = false;
#if !LWIP_COMPAT_MUTEX #if !LWIP_COMPAT_MUTEX
/** Create a new mutex /** Create a new mutex
* @param mutex pointer to the mutex to create * @param mutex pointer to the mutex to create
@ -122,7 +124,11 @@ sys_sem_new(sys_sem_t *sem, u8_t count)
void void
sys_sem_signal(sys_sem_t *sem) sys_sem_signal(sys_sem_t *sem)
{ {
if (g_lwip_in_critical_section){
xSemaphoreGiveFromISR(*sem, NULL);
} else {
xSemaphoreGive(*sem); xSemaphoreGive(*sem);
}
} }
/*-----------------------------------------------------------------------------------*/ /*-----------------------------------------------------------------------------------*/
@ -453,6 +459,7 @@ sys_prot_t
sys_arch_protect(void) sys_arch_protect(void)
{ {
portENTER_CRITICAL(&g_lwip_mux); portENTER_CRITICAL(&g_lwip_mux);
g_lwip_in_critical_section = true;
return (sys_prot_t) 1; return (sys_prot_t) 1;
} }
@ -467,6 +474,7 @@ void
sys_arch_unprotect(sys_prot_t pval) sys_arch_unprotect(sys_prot_t pval)
{ {
(void) pval; (void) pval;
g_lwip_in_critical_section = false;
portEXIT_CRITICAL(&g_lwip_mux); portEXIT_CRITICAL(&g_lwip_mux);
} }