#include "lwip/sys.h" #include "FreeRTOS.h" #include "task.h" extern volatile uint32_t ulPortInterruptNesting; #if SYS_LIGHTWEIGHT_PROT sys_prot_t sys_arch_protect_ca0(void) { #if LWIP_FREERTOS_SYS_ARCH_PROTECT_USES_MUTEX BaseType_t ret; LWIP_ASSERT("sys_arch_protect_mutex != NULL", sys_arch_protect_mutex != NULL); ret = xSemaphoreTakeRecursive(sys_arch_protect_mutex, portMAX_DELAY); LWIP_ASSERT("sys_arch_protect failed to take the mutex", ret == pdTRUE); #else /* LWIP_FREERTOS_SYS_ARCH_PROTECT_USES_MUTEX */ if ( ulPortInterruptNesting == 0) { taskENTER_CRITICAL(); } else { taskENTER_CRITICAL_FROM_ISR(); } #endif /* LWIP_FREERTOS_SYS_ARCH_PROTECT_USES_MUTEX */ #if LWIP_FREERTOS_SYS_ARCH_PROTECT_SANITY_CHECK { /* every nested call to sys_arch_protect() returns an increased number */ sys_prot_t ret = sys_arch_protect_nesting; sys_arch_protect_nesting++; LWIP_ASSERT("sys_arch_protect overflow", sys_arch_protect_nesting > ret); return ret; } #else return 1; #endif } void sys_arch_unprotect_ca0(sys_prot_t pval) { #if LWIP_FREERTOS_SYS_ARCH_PROTECT_USES_MUTEX BaseType_t ret; #endif #if LWIP_FREERTOS_SYS_ARCH_PROTECT_SANITY_CHECK LWIP_ASSERT("unexpected sys_arch_protect_nesting", sys_arch_protect_nesting > 0); sys_arch_protect_nesting--; LWIP_ASSERT("unexpected sys_arch_protect_nesting", sys_arch_protect_nesting == pval); #endif #if LWIP_FREERTOS_SYS_ARCH_PROTECT_USES_MUTEX LWIP_ASSERT("sys_arch_protect_mutex != NULL", sys_arch_protect_mutex != NULL); ret = xSemaphoreGiveRecursive(sys_arch_protect_mutex); LWIP_ASSERT("sys_arch_unprotect failed to give the mutex", ret == pdTRUE); #else /* LWIP_FREERTOS_SYS_ARCH_PROTECT_USES_MUTEX */ if ( ulPortInterruptNesting == 0) { taskEXIT_CRITICAL(); } else { taskEXIT_CRITICAL_FROM_ISR(0); } #endif /* LWIP_FREERTOS_SYS_ARCH_PROTECT_USES_MUTEX */ LWIP_UNUSED_ARG(pval); } #endif /* SYS_LIGHTWEIGHT_PROT */