Blocking Mutex the QXK preemptive kernel.
More...
#include "qxk.h"
QXMutex is a blocking mutual exclusion mechanism that can also apply the priority-ceiling protocol to avoid unbounded priority inversion (if initialized with a non-zero ceiling priority, see QXMutex_init()). In that case, QXMutex requires its own uinque QP priority level, which cannot be used by any thread or any other QXMutex. If initialized with preemption-ceiling of zero, QXMutex does not use the priority-ceiling protocol and does not require a unique QP priority (see QXMutex_init()). QXMutex is recursive (re-entrant), which means that it can be locked multiple times (up to 255 levels) by the same thread without causing deadlock. QXMutex is primarily intended for the extened (blocking) threads, but can also be used by the basic threads through the non-blocking QXMutex_tryLock() API.
- Note
- QXMutex should be used in situations when at least one of the extended threads contending for the mutex blocks while holding the mutex (between the QXMutex_lock() and QXMutex_unlock() operations). If no blocking is needed while holding the mutex, the more efficient non-blocking mechanism of selective QXK scheduler locking should be used instead. Selective scheduler locking is available for both basic threads and extendedthreads", so it is applicable to situations where resources are shared among all these threads.
- Usage
- The following example illustrates how to instantiate and use the mutex in your application.
void BSP_randomSeed(uint32_t seed) {
l_rnd = seed;
}
uint32_t BSP_random(void) {
uint32_t rnd;
rnd = l_rnd * (3U*7U*11U*13U*23U);
l_rnd = rnd;
return rnd;
}
Blocking Mutex the QXK preemptive kernel.
void QXMutex_init(QXMutex *const me, QPrioSpec const prioSpec)
bool QXMutex_lock(QXMutex *const me, uint_fast16_t const nTicks)
void QXMutex_unlock(QXMutex *const me)
Definition at line 781 of file qxk.h.
◆ QXMutex_init()
initialize the QXK priority-ceiling mutex QXMutex
Initialize the QXK priority ceiling mutex.
- Parameters
-
[in,out] | me | current instance pointer (see oop) |
[in] | prioSpec | the priority specification for the mutex (See also QPrioSpec). This value might also be zero. |
- Precondition
qxk_mutex:100
- preemption-threshold must not be used
- Note
prioSpec == 0
means that the priority-ceiling protocol shall not be used by this mutex. Such mutex will not change (boost) the priority of the holding threads.
Conversely, prioSpec != 0
means that the priority-ceiling protocol shall be used by this mutex. Such mutex will temporarily boost the priority and priority-threshold of the holding thread to the priority specification in prioSpec
(see QPrioSpec).
- Usage
void BSP_randomSeed(uint32_t seed) {
l_rnd = seed;
}
uint32_t BSP_random(void) {
uint32_t rnd;
rnd = l_rnd * (3U*7U*11U*13U*23U);
l_rnd = rnd;
return rnd;
}
◆ QXMutex_lock()
bool QXMutex_lock |
( |
QXMutex *const |
me, |
|
|
uint_fast16_t const |
nTicks |
|
) |
| |
lock the QXK priority-ceiling mutex QXMutex
- Parameters
-
[in,out] | me | current instance pointer (see oop) |
[in] | nTicks | number of clock ticks (at the associated rate) to wait for the mutex. The value of QXTHREAD_NO_TIMEOUT indicates that no timeout will occur and the mutex could block indefinitely. |
- Returns
- 'true' if the mutex has been acquired and 'false' if a timeout occurred.
- Precondition
qxk_mutex:200
- must NOT be called from an ISR;
- must be called from an extended thread;
- the mutex-priority must be in range;
- the thread must NOT be already blocked on any object.
- Note
- The mutex locks are allowed to nest, meaning that the same extended thread can lock the same mutex multiple times (< 255). However, each call to QXMutex_lock() must be balanced by the matching call to QXMutex_unlock().
- Usage
void BSP_randomSeed(uint32_t seed) {
l_rnd = seed;
}
uint32_t BSP_random(void) {
uint32_t rnd;
rnd = l_rnd * (3U*7U*11U*13U*23U);
l_rnd = rnd;
return rnd;
}
- Precondition
- also: the thread must NOT be holding a scheduler lock.
-
also: the newly locked mutex must have no holder yet
Definition at line 89 of file qxk_mutex.c.
◆ QXMutex_tryLock()
bool QXMutex_tryLock |
( |
QXMutex *const |
me | ) |
|
try to lock the QXK priority-ceiling mutex QXMutex
- Parameters
-
[in,out] | me | current instance pointer (see oop) |
- Returns
- 'true' if the mutex was successfully locked and 'false' if the mutex was unavailable and was NOT locked.
- Precondition
qxk_mutex:300
- must NOT be called from an ISR;
- the calling thread must be valid;
- the mutex-priority must be in range
- Precondition
qxk_mutex:301
- the thread must NOT be holding a scheduler lock.
- Note
- This function can be called from both basic threads (active objects) and extended threads.
-
The mutex locks are allowed to nest, meaning that the same extended thread can lock the same mutex multiple times (<= 255). However, each successful call to QXMutex_tryLock() must be balanced by the matching call to QXMutex_unlock().
- Precondition
- also: the newly locked mutex must have no holder yet
Definition at line 222 of file qxk_mutex.c.
◆ QXMutex_unlock()
void QXMutex_unlock |
( |
QXMutex *const |
me | ) |
|
unlock the QXK priority-ceiling mutex QXMutex
- Parameters
-
[in,out] | me | current instance pointer (see oop) |
- Precondition
qxk_mutex:400
- must NOT be called from an ISR;
- the calling thread must be valid;
- Precondition
qxk_mutex:401
- the mutex must be already locked at least once.
- Precondition
qxk_mutex:402
- the mutex must be held by this thread.
- Note
- This function can be called from both basic threads (active objects) and extended threads.
-
The mutex locks are allowed to nest, meaning that the same extended thread can lock the same mutex multiple times (<= 225). However, each call to QXMutex_lock() or a successful call to QXMutex_tryLock() must be balanced by the matching call to QXMutex_unlock().
- Usage
void BSP_randomSeed(uint32_t seed) {
l_rnd = seed;
}
uint32_t BSP_random(void) {
uint32_t rnd;
rnd = l_rnd * (3U*7U*11U*13U*23U);
l_rnd = rnd;
return rnd;
}
Definition at line 314 of file qxk_mutex.c.
◆ ao
active object used as a placeholder AO for this mutex in QActive_registry_[]
Definition at line 787 of file qxk.h.
◆ waitSet
set of extended-threads waiting on this mutex
Definition at line 790 of file qxk.h.
The documentation for this class was generated from the following files: