64#ifndef __STM32_LOCK_H__
65#define __STM32_LOCK_H__
70#include <cmsis_compiler.h>
72#ifndef STM32_THREAD_SAFE_STRATEGY
73 #define STM32_THREAD_SAFE_STRATEGY 2
85#define STM32_LOCK_BLOCK() \
93#define STM32_LOCK_BLOCK_IF_NULL_ARGUMENT(x) \
101#define STM32_LOCK_BLOCK_IF_INTERRUPT_CONTEXT() \
103 if (__get_IPSR()) { \
104 STM32_LOCK_BLOCK(); \
109#define STM32_LOCK_UNUSED(var) (void)var
112#define STM32_LOCK_ARRAY_SIZE(array) (sizeof(array) / sizeof((array)[0]))
114#if STM32_THREAD_SAFE_STRATEGY == 1
121 #define STM32_LOCK_API 1
123 #undef STM32_LOCK_API
125#elif STM32_THREAD_SAFE_STRATEGY == 2
132 #define LOCKING_DATA_INIT { 0, 0 }
157 uint8_t flag = (uint8_t)(__get_PRIMASK() & 0x1);
162 if (lock->counter == 0) {
164 }
else if (lock->counter == UINT8_MAX) {
176 if (lock->counter == 0) {
180 if (lock->counter == 0 && lock->flag == 0) {
185#elif STM32_THREAD_SAFE_STRATEGY == 3
192 #define LOCKING_DATA_INIT 0
223#elif STM32_THREAD_SAFE_STRATEGY == 4
232 #if defined(__GNUC__) && !defined(__CC_ARM) && configUSE_NEWLIB_REENTRANT == 0
233 #warning Please set configUSE_NEWLIB_REENTRANT to 1 in FreeRTOSConfig.h, otherwise newlib will not be thread-safe
238 #define LOCKING_DATA_INIT { { 0, 0 }, 0 }
239 #define STM32_LOCK_MAX_NESTED_LEVELS 2
241 uint32_t basepri[STM32_LOCK_MAX_NESTED_LEVELS];
242 uint8_t nesting_level;
247 #define STM32_LOCK_ASSERT_VALID_NESTING_LEVEL(lock) \
249 if (lock->nesting_level >= STM32_LOCK_ARRAY_SIZE(lock->basepri)) { \
250 STM32_LOCK_BLOCK(); \
263 lock->basepri[i] = 0;
274 STM32_LOCK_ASSERT_VALID_NESTING_LEVEL(lock);
285 STM32_LOCK_ASSERT_VALID_NESTING_LEVEL(lock);
289 #undef STM32_LOCK_ASSERT_VALID_NESTING_LEVEL
290 #undef STM32_LOCK_MAX_NESTED_LEVELS
292#elif STM32_THREAD_SAFE_STRATEGY == 5
300 #if defined(__GNUC__) && !defined(__CC_ARM) && configUSE_NEWLIB_REENTRANT == 0
301 #warning Please set configUSE_NEWLIB_REENTRANT to 1 in FreeRTOSConfig.h, otherwise newlib will not be thread-safe
306 #define LOCKING_DATA_INIT 0
340 #error Invalid STM32_THREAD_SAFE_STRATEGY specified
void Error_Handler(void)
This function is executed in case of error occurrence.
Definition main.c:920
#define STM32_LOCK_ARRAY_SIZE(array)
Definition stm32_lock.h:112
#define STM32_LOCK_BLOCK_IF_INTERRUPT_CONTEXT()
Definition stm32_lock.h:101
#define STM32_LOCK_BLOCK_IF_NULL_ARGUMENT(x)
Definition stm32_lock.h:93
#define STM32_LOCK_BLOCK()
Definition stm32_lock.h:85
User defined lock mechanisms.
static void stm32_lock_acquire(LockingData_t *lock)
Acquire STM32 lock.
Definition stm32_lock_user.h:80
static void stm32_lock_release(LockingData_t *lock)
Release STM32 lock.
Definition stm32_lock_user.h:91
static void stm32_lock_init(LockingData_t *lock)
Initialize STM32 lock.
Definition stm32_lock_user.h:70
Definition stm32_lock_user.h:59
uint8_t nesting_level
Definition stm32_lock_user.h:61
#define taskENTER_CRITICAL_FROM_ISR()
Definition task.h:231
#define taskEXIT_CRITICAL_FROM_ISR(x)
Definition task.h:250
void vTaskSuspendAll(void)
Definition tasks.c:3811
BaseType_t xTaskResumeAll(void)
Definition tasks.c:3956