typedef struct _lock_t { u32_t LockedResource; s32_t LockCounter; }lock_t; lock_t mem_lock; #define RESOURCE_LOCKED (SYS_ARCH_TIMEOUT) #define RESOURCE_FREE (0) void SysArchLockResource(lock_t locked_resource) { SYS_ARCH_DECL_PROTECT(old_level); old_level = SYS_ARCH_PROTECT(); locked_resource.LockedResource = RESOURCE_LOCKED; locked_resource.LockCounter++; SYS_ARCH_UNPROTECT(old_level); } void SysArchUnlockResource(lock_t locked_resource) { SYS_ARCH_DECL_PROTECT(old_level); old_level = SYS_ARCH_PROTECT(); locked_resource.LockCounter--; LWIP_ASSERT("locked_resource.LockCounter >= ", locked_resource.LockCounter >= 0); //Unlock resource only if LockCounter is equal 0 if(locked_resource.LockCounter == 0) { locked_resource.LockedResource = RESOURCE_FREE; } SYS_ARCH_UNPROTECT(old_level); } /* Returns 0 if Free to access, SYS_ARCH_TIMEOUT otherwise */ u32_t SysArchTryGetLockedResource(lock_t locked_resource) { u32_t lock_value; SYS_ARCH_DECL_PROTECT(old_level); old_level = SYS_ARCH_PROTECT(); lock_value = locked_resource.LockedResource; SYS_ARCH_UNPROTECT(old_level); return lock_value; } #define SYS_ARCH_LOCK_RESOURCE(locked_resource) #define SYS_ARCH_UNLOCK_RESOURCE(locked_resource) #define SYS_ARCH_TRY_LOCKED_RESOURCE(locked_resource)