Xenomai API
2.6.5
|
Functions | |
int | rtdm_select_bind (int fd, rtdm_selector_t *selector, enum rtdm_selecttype type, unsigned fd_index) |
Bind a selector to specified event types of a given file descriptor. More... | |
RTDM_SELECTTYPE_xxx | |
enum | rtdm_selecttype { RTDM_SELECTTYPE_READ = XNSELECT_READ, RTDM_SELECTTYPE_WRITE = XNSELECT_WRITE, RTDM_SELECTTYPE_EXCEPT = XNSELECT_EXCEPT } |
Global Lock across Scheduler Invocation | |
#define | RTDM_EXECUTE_ATOMICALLY(code_block) |
Execute code block atomically. More... | |
Spinlock with Preemption Deactivation | |
typedef rthal_spinlock_t | rtdm_lock_t |
Lock variable. | |
typedef unsigned long | rtdm_lockctx_t |
Variable to save the context while holding a lock. | |
#define | RTDM_LOCK_UNLOCKED RTHAL_SPIN_LOCK_UNLOCKED |
Static lock initialisation. | |
#define | rtdm_lock_init(lock) rthal_spin_lock_init(lock) |
Dynamic lock initialisation. More... | |
#define | rtdm_lock_get(lock) rthal_spin_lock(lock) |
Acquire lock from non-preemptible contexts. More... | |
#define | rtdm_lock_put(lock) |
Release lock without preemption restoration. More... | |
#define | rtdm_lock_get_irqsave(lock, context) |
Acquire lock and disable preemption. More... | |
#define | rtdm_lock_put_irqrestore(lock, context) |
Release lock and restore preemption state. More... | |
#define | rtdm_lock_irqsave(context) rthal_local_irq_save(context) |
Disable preemption locally. More... | |
#define | rtdm_lock_irqrestore(context) rthal_local_irq_restore(context) |
Restore preemption state. More... | |
Timeout Sequence Management | |
void | rtdm_toseq_init (rtdm_toseq_t *timeout_seq, nanosecs_rel_t timeout) |
Initialise a timeout sequence. More... | |
EXPORT_SYMBOL_GPL (rtdm_toseq_init) | |
Initialise a timeout sequence. More... | |
Event Services | |
void | rtdm_event_init (rtdm_event_t *event, unsigned long pending) |
Initialise an event. More... | |
EXPORT_SYMBOL_GPL (rtdm_event_init) | |
Initialise an event. More... | |
void | rtdm_event_destroy (rtdm_event_t *event) |
Destroy an event. More... | |
void | rtdm_event_pulse (rtdm_event_t *event) |
Signal an event occurrence to currently listening waiters. More... | |
void | rtdm_event_signal (rtdm_event_t *event) |
Signal an event occurrence. More... | |
EXPORT_SYMBOL_GPL (rtdm_event_signal) | |
Initialise an event. More... | |
int | rtdm_event_wait (rtdm_event_t *event) |
Wait on event occurrence. More... | |
EXPORT_SYMBOL_GPL (rtdm_event_wait) | |
Initialise an event. More... | |
int | rtdm_event_timedwait (rtdm_event_t *event, nanosecs_rel_t timeout, rtdm_toseq_t *timeout_seq) |
Wait on event occurrence with timeout. More... | |
EXPORT_SYMBOL_GPL (rtdm_event_timedwait) | |
Initialise an event. More... | |
void | rtdm_event_clear (rtdm_event_t *event) |
Clear event state. More... | |
EXPORT_SYMBOL_GPL (rtdm_event_clear) | |
Initialise an event. More... | |
int | rtdm_event_select_bind (rtdm_event_t *event, rtdm_selector_t *selector, enum rtdm_selecttype type, unsigned fd_index) |
Bind a selector to an event. More... | |
EXPORT_SYMBOL_GPL (rtdm_event_select_bind) | |
Initialise an event. More... | |
Semaphore Services | |
void | rtdm_sem_init (rtdm_sem_t *sem, unsigned long value) |
Initialise a semaphore. More... | |
EXPORT_SYMBOL_GPL (rtdm_sem_init) | |
Initialise a semaphore. More... | |
void | rtdm_sem_destroy (rtdm_sem_t *sem) |
Destroy a semaphore. More... | |
int | rtdm_sem_down (rtdm_sem_t *sem) |
Decrement a semaphore. More... | |
EXPORT_SYMBOL_GPL (rtdm_sem_down) | |
Initialise a semaphore. More... | |
int | rtdm_sem_timeddown (rtdm_sem_t *sem, nanosecs_rel_t timeout, rtdm_toseq_t *timeout_seq) |
Decrement a semaphore with timeout. More... | |
EXPORT_SYMBOL_GPL (rtdm_sem_timeddown) | |
Initialise a semaphore. More... | |
void | rtdm_sem_up (rtdm_sem_t *sem) |
Increment a semaphore. More... | |
EXPORT_SYMBOL_GPL (rtdm_sem_up) | |
Initialise a semaphore. More... | |
int | rtdm_sem_select_bind (rtdm_sem_t *sem, rtdm_selector_t *selector, enum rtdm_selecttype type, unsigned fd_index) |
Bind a selector to a semaphore. More... | |
EXPORT_SYMBOL_GPL (rtdm_sem_select_bind) | |
Initialise a semaphore. More... | |
Mutex Services | |
void | rtdm_mutex_init (rtdm_mutex_t *mutex) |
Initialise a mutex. More... | |
EXPORT_SYMBOL_GPL (rtdm_mutex_init) | |
Initialise a mutex. More... | |
void | rtdm_mutex_destroy (rtdm_mutex_t *mutex) |
Destroy a mutex. More... | |
void | rtdm_mutex_unlock (rtdm_mutex_t *mutex) |
Release a mutex. More... | |
int | rtdm_mutex_lock (rtdm_mutex_t *mutex) |
Request a mutex. More... | |
EXPORT_SYMBOL_GPL (rtdm_mutex_lock) | |
Initialise a mutex. More... | |
int | rtdm_mutex_timedlock (rtdm_mutex_t *mutex, nanosecs_rel_t timeout, rtdm_toseq_t *timeout_seq) |
Request a mutex with timeout. More... | |
EXPORT_SYMBOL_GPL (rtdm_mutex_timedlock) | |
Initialise a mutex. More... | |
#define RTDM_EXECUTE_ATOMICALLY | ( | code_block | ) |
Execute code block atomically.
Generally, it is illegal to suspend the current task by calling rtdm_task_sleep(), rtdm_event_wait(), etc. while holding a spinlock. In contrast, this macro allows to combine several operations including a potentially rescheduling call to an atomic code block with respect to other RTDM_EXECUTE_ATOMICALLY() blocks. The macro is a light-weight alternative for protecting code blocks via mutexes, and it can even be used to synchronise real-time and non-real-time contexts.
code_block | Commands to be executed atomically |
break
, return
, goto
, etc. This would leave the global lock held during the code block execution in an inconsistent state. Moreover, do not embed complex operations into the code bock. Consider that they will be executed under preemption lock with interrupts switched-off. Also note that invocation of rescheduling calls may break the atomicity until the task gains the CPU again.Environments:
This service can be called from:
Rescheduling: possible, depends on functions called within code_block.
#define rtdm_lock_get | ( | lock | ) | rthal_spin_lock(lock) |
Acquire lock from non-preemptible contexts.
lock | Address of lock variable |
Environments:
This service can be called from:
Rescheduling: never.
#define rtdm_lock_get_irqsave | ( | lock, | |
context | |||
) |
Acquire lock and disable preemption.
lock | Address of lock variable |
context | name of local variable to store the context in |
Environments:
This service can be called from:
Rescheduling: never.
Referenced by rtdm_ratelimit().
#define rtdm_lock_init | ( | lock | ) | rthal_spin_lock_init(lock) |
Dynamic lock initialisation.
lock | Address of lock variable |
Environments:
This service can be called from:
Rescheduling: never.
#define rtdm_lock_irqrestore | ( | context | ) | rthal_local_irq_restore(context) |
Restore preemption state.
context | name of local variable which stored the context |
Environments:
This service can be called from:
Rescheduling: possible.
#define rtdm_lock_irqsave | ( | context | ) | rthal_local_irq_save(context) |
Disable preemption locally.
context | name of local variable to store the context in |
Environments:
This service can be called from:
Rescheduling: never.
#define rtdm_lock_put | ( | lock | ) |
Release lock without preemption restoration.
lock | Address of lock variable |
Environments:
This service can be called from:
Rescheduling: never.
#define rtdm_lock_put_irqrestore | ( | lock, | |
context | |||
) |
Release lock and restore preemption state.
lock | Address of lock variable |
context | name of local variable which stored the context |
Environments:
This service can be called from:
Rescheduling: possible.
Referenced by rtdm_ratelimit().
enum rtdm_selecttype |
EXPORT_SYMBOL_GPL | ( | rtdm_toseq_init | ) |
Initialise a timeout sequence.
This service initialises a timeout sequence handle according to the given timeout value. Timeout sequences allow to maintain a continuous timeout across multiple calls of blocking synchronisation services. A typical application scenario is given below.
[in,out] | timeout_seq | Timeout sequence handle |
[in] | timeout | Relative timeout in nanoseconds, see RTDM_TIMEOUT_xxx for special values |
Application Scenario:
Using a timeout sequence in such a scenario avoids that the user-provided relative timeout
is restarted on every call to rtdm_event_timedwait(), potentially causing an overall delay that is larger than specified by timeout
. Moreover, all functions supporting timeout sequences also interpret special timeout values (infinite and non-blocking), disburdening the driver developer from handling them separately.
Environments:
This service can be called from:
Rescheduling: never.
EXPORT_SYMBOL_GPL | ( | rtdm_event_init | ) |
Initialise an event.
[in,out] | event | Event handle |
[in] | pending | Non-zero if event shall be initialised as set, 0 otherwise |
Environments:
This service can be called from:
Rescheduling: never.
EXPORT_SYMBOL_GPL | ( | rtdm_event_signal | ) |
Initialise an event.
[in,out] | event | Event handle |
[in] | pending | Non-zero if event shall be initialised as set, 0 otherwise |
Environments:
This service can be called from:
Rescheduling: never.
EXPORT_SYMBOL_GPL | ( | rtdm_event_wait | ) |
Initialise an event.
[in,out] | event | Event handle |
[in] | pending | Non-zero if event shall be initialised as set, 0 otherwise |
Environments:
This service can be called from:
Rescheduling: never.
EXPORT_SYMBOL_GPL | ( | rtdm_event_timedwait | ) |
Initialise an event.
[in,out] | event | Event handle |
[in] | pending | Non-zero if event shall be initialised as set, 0 otherwise |
Environments:
This service can be called from:
Rescheduling: never.
EXPORT_SYMBOL_GPL | ( | rtdm_event_clear | ) |
Initialise an event.
[in,out] | event | Event handle |
[in] | pending | Non-zero if event shall be initialised as set, 0 otherwise |
Environments:
This service can be called from:
Rescheduling: never.
EXPORT_SYMBOL_GPL | ( | rtdm_event_select_bind | ) |
Initialise an event.
[in,out] | event | Event handle |
[in] | pending | Non-zero if event shall be initialised as set, 0 otherwise |
Environments:
This service can be called from:
Rescheduling: never.
EXPORT_SYMBOL_GPL | ( | rtdm_sem_init | ) |
Initialise a semaphore.
[in,out] | sem | Semaphore handle |
[in] | value | Initial value of the semaphore |
Environments:
This service can be called from:
Rescheduling: never.
EXPORT_SYMBOL_GPL | ( | rtdm_sem_down | ) |
Initialise a semaphore.
[in,out] | sem | Semaphore handle |
[in] | value | Initial value of the semaphore |
Environments:
This service can be called from:
Rescheduling: never.
EXPORT_SYMBOL_GPL | ( | rtdm_sem_timeddown | ) |
Initialise a semaphore.
[in,out] | sem | Semaphore handle |
[in] | value | Initial value of the semaphore |
Environments:
This service can be called from:
Rescheduling: never.
EXPORT_SYMBOL_GPL | ( | rtdm_sem_up | ) |
Initialise a semaphore.
[in,out] | sem | Semaphore handle |
[in] | value | Initial value of the semaphore |
Environments:
This service can be called from:
Rescheduling: never.
EXPORT_SYMBOL_GPL | ( | rtdm_sem_select_bind | ) |
Initialise a semaphore.
[in,out] | sem | Semaphore handle |
[in] | value | Initial value of the semaphore |
Environments:
This service can be called from:
Rescheduling: never.
EXPORT_SYMBOL_GPL | ( | rtdm_mutex_init | ) |
Initialise a mutex.
This function initalises a basic mutex with priority inversion protection. "Basic", as it does not allow a mutex owner to recursively lock the same mutex again.
[in,out] | mutex | Mutex handle |
Environments:
This service can be called from:
Rescheduling: never.
EXPORT_SYMBOL_GPL | ( | rtdm_mutex_lock | ) |
Initialise a mutex.
This function initalises a basic mutex with priority inversion protection. "Basic", as it does not allow a mutex owner to recursively lock the same mutex again.
[in,out] | mutex | Mutex handle |
Environments:
This service can be called from:
Rescheduling: never.
EXPORT_SYMBOL_GPL | ( | rtdm_mutex_timedlock | ) |
Initialise a mutex.
This function initalises a basic mutex with priority inversion protection. "Basic", as it does not allow a mutex owner to recursively lock the same mutex again.
[in,out] | mutex | Mutex handle |
Environments:
This service can be called from:
Rescheduling: never.
void rtdm_event_clear | ( | rtdm_event_t * | event | ) |
Clear event state.
[in,out] | event | Event handle as returned by rtdm_event_init() |
Environments:
This service can be called from:
Rescheduling: never.
void rtdm_event_destroy | ( | rtdm_event_t * | event | ) |
Destroy an event.
[in,out] | event | Event handle as returned by rtdm_event_init() |
Environments:
This service can be called from:
Rescheduling: possible.
void rtdm_event_init | ( | rtdm_event_t * | event, |
unsigned long | pending | ||
) |
Initialise an event.
[in,out] | event | Event handle |
[in] | pending | Non-zero if event shall be initialised as set, 0 otherwise |
Environments:
This service can be called from:
Rescheduling: never.
References xnselect_init(), and xnsynch_init().
void rtdm_event_pulse | ( | rtdm_event_t * | event | ) |
Signal an event occurrence to currently listening waiters.
This function wakes up all current waiters of the given event, but it does not change the event state. Subsequently callers of rtdm_event_wait() or rtdm_event_timedwait() will therefore be blocked first.
[in,out] | event | Event handle as returned by rtdm_event_init() |
Environments:
This service can be called from:
Rescheduling: possible.
int rtdm_event_select_bind | ( | rtdm_event_t * | event, |
rtdm_selector_t * | selector, | ||
enum rtdm_selecttype | type, | ||
unsigned | fd_index | ||
) |
Bind a selector to an event.
This functions binds the given selector to an event so that the former is notified when the event state changes. Typically the select binding handler will invoke this service.
[in,out] | event | Event handle as returned by rtdm_event_init() |
[in,out] | selector | Selector as passed to the select binding handler |
[in] | type | Type of the bound event as passed to the select binding handler |
[in] | fd_index | File descriptor index as passed to the select binding handler |
Environments:
This service can be called from:
Rescheduling: never.
References xnselect_bind().
void rtdm_event_signal | ( | rtdm_event_t * | event | ) |
Signal an event occurrence.
This function sets the given event and wakes up all current waiters. If no waiter is presently registered, the next call to rtdm_event_wait() or rtdm_event_timedwait() will return immediately.
[in,out] | event | Event handle as returned by rtdm_event_init() |
Environments:
This service can be called from:
Rescheduling: possible.
References xnpod_schedule(), and xnsynch_flush().
int rtdm_event_timedwait | ( | rtdm_event_t * | event, |
nanosecs_rel_t | timeout, | ||
rtdm_toseq_t * | timeout_seq | ||
) |
Wait on event occurrence with timeout.
This function waits or tests for the occurence of the given event, taking the provided timeout into account. On successful return, the event is reset.
[in,out] | event | Event handle as returned by rtdm_event_init() |
[in] | timeout | Relative timeout in nanoseconds, see RTDM_TIMEOUT_xxx for special values |
[in,out] | timeout_seq | Handle of a timeout sequence as returned by rtdm_toseq_init() or NULL |
Environments:
This service can be called from:
Rescheduling: possible.
References XNBREAK, XNRMID, xnsynch_sleep_on(), and XNTIMEO.
Referenced by rtdm_event_wait().
int rtdm_event_wait | ( | rtdm_event_t * | event | ) |
Wait on event occurrence.
This is the light-weight version of rtdm_event_timedwait(), implying an infinite timeout.
[in,out] | event | Event handle as returned by rtdm_event_init() |
Environments:
This service can be called from:
Rescheduling: possible.
References rtdm_event_timedwait().
void rtdm_mutex_destroy | ( | rtdm_mutex_t * | mutex | ) |
Destroy a mutex.
[in,out] | mutex | Mutex handle as returned by rtdm_mutex_init() |
Environments:
This service can be called from:
Rescheduling: possible.
void rtdm_mutex_init | ( | rtdm_mutex_t * | mutex | ) |
Initialise a mutex.
This function initalises a basic mutex with priority inversion protection. "Basic", as it does not allow a mutex owner to recursively lock the same mutex again.
[in,out] | mutex | Mutex handle |
Environments:
This service can be called from:
Rescheduling: never.
References xnsynch_init().
int rtdm_mutex_lock | ( | rtdm_mutex_t * | mutex | ) |
Request a mutex.
This is the light-weight version of rtdm_mutex_timedlock(), implying an infinite timeout.
[in,out] | mutex | Mutex handle as returned by rtdm_mutex_init() |
Environments:
This service can be called from:
Rescheduling: possible.
References rtdm_mutex_timedlock().
int rtdm_mutex_timedlock | ( | rtdm_mutex_t * | mutex, |
nanosecs_rel_t | timeout, | ||
rtdm_toseq_t * | timeout_seq | ||
) |
Request a mutex with timeout.
This function tries to acquire the given mutex. If it is not available, the caller is blocked unless non-blocking operation was selected.
[in,out] | mutex | Mutex handle as returned by rtdm_mutex_init() |
[in] | timeout | Relative timeout in nanoseconds, see RTDM_TIMEOUT_xxx for special values |
[in,out] | timeout_seq | Handle of a timeout sequence as returned by rtdm_toseq_init() or NULL |
Environments:
This service can be called from:
Rescheduling: possible.
References XNBREAK, XNRMID, xnsynch_acquire(), and XNTIMEO.
Referenced by rtdm_mutex_lock().
void rtdm_mutex_unlock | ( | rtdm_mutex_t * | mutex | ) |
Release a mutex.
This function releases the given mutex, waking up a potential waiter which was blocked upon rtdm_mutex_lock() or rtdm_mutex_timedlock().
[in,out] | mutex | Mutex handle as returned by rtdm_mutex_init() |
Environments:
This service can be called from:
Rescheduling: possible.
int rtdm_select_bind | ( | int | fd, |
rtdm_selector_t * | selector, | ||
enum rtdm_selecttype | type, | ||
unsigned | fd_index | ||
) |
Bind a selector to specified event types of a given file descriptor.
This function is invoked by higher RTOS layers implementing select-like services. It shall not be called directly by RTDM drivers.
[in] | fd | File descriptor to bind to |
[in,out] | selector | Selector object that shall be bound to the given event |
[in] | type | Event type the caller is interested in |
[in] | fd_index | Index in the file descriptor set of the caller |
Environments:
This service can be called from:
Rescheduling: never.
References rtdm_dev_context::ops, rtdm_context_get(), rtdm_context_unlock(), and rtdm_operations::select_bind.
void rtdm_sem_destroy | ( | rtdm_sem_t * | sem | ) |
Destroy a semaphore.
[in,out] | sem | Semaphore handle as returned by rtdm_sem_init() |
Environments:
This service can be called from:
Rescheduling: possible.
int rtdm_sem_down | ( | rtdm_sem_t * | sem | ) |
Decrement a semaphore.
This is the light-weight version of rtdm_sem_timeddown(), implying an infinite timeout.
[in,out] | sem | Semaphore handle as returned by rtdm_sem_init() |
Environments:
This service can be called from:
Rescheduling: possible.
References rtdm_sem_timeddown().
void rtdm_sem_init | ( | rtdm_sem_t * | sem, |
unsigned long | value | ||
) |
Initialise a semaphore.
[in,out] | sem | Semaphore handle |
[in] | value | Initial value of the semaphore |
Environments:
This service can be called from:
Rescheduling: never.
References sem_init(), xnselect_init(), and xnsynch_init().
int rtdm_sem_select_bind | ( | rtdm_sem_t * | sem, |
rtdm_selector_t * | selector, | ||
enum rtdm_selecttype | type, | ||
unsigned | fd_index | ||
) |
Bind a selector to a semaphore.
This functions binds the given selector to the semaphore so that the former is notified when the semaphore state changes. Typically the select binding handler will invoke this service.
[in,out] | sem | Semaphore handle as returned by rtdm_sem_init() |
[in,out] | selector | Selector as passed to the select binding handler |
[in] | type | Type of the bound event as passed to the select binding handler |
[in] | fd_index | File descriptor index as passed to the select binding handler |
Environments:
This service can be called from:
Rescheduling: never.
References xnselect_bind().
int rtdm_sem_timeddown | ( | rtdm_sem_t * | sem, |
nanosecs_rel_t | timeout, | ||
rtdm_toseq_t * | timeout_seq | ||
) |
Decrement a semaphore with timeout.
This function tries to decrement the given semphore's value if it is positive on entry. If not, the caller is blocked unless non-blocking operation was selected.
[in,out] | sem | Semaphore handle as returned by rtdm_sem_init() |
[in] | timeout | Relative timeout in nanoseconds, see RTDM_TIMEOUT_xxx for special values |
[in,out] | timeout_seq | Handle of a timeout sequence as returned by rtdm_toseq_init() or NULL |
Environments:
This service can be called from:
Rescheduling: possible.
References sem_timedwait(), XNBREAK, XNRMID, xnsynch_sleep_on(), and XNTIMEO.
Referenced by rtdm_sem_down().
void rtdm_sem_up | ( | rtdm_sem_t * | sem | ) |
Increment a semaphore.
This function increments the given semphore's value, waking up a potential waiter which was blocked upon rtdm_sem_down().
[in,out] | sem | Semaphore handle as returned by rtdm_sem_init() |
Environments:
This service can be called from:
Rescheduling: possible.
References xnpod_schedule(), and xnsynch_wakeup_one_sleeper().
void rtdm_toseq_init | ( | rtdm_toseq_t * | timeout_seq, |
nanosecs_rel_t | timeout | ||
) |
Initialise a timeout sequence.
This service initialises a timeout sequence handle according to the given timeout value. Timeout sequences allow to maintain a continuous timeout across multiple calls of blocking synchronisation services. A typical application scenario is given below.
[in,out] | timeout_seq | Timeout sequence handle |
[in] | timeout | Relative timeout in nanoseconds, see RTDM_TIMEOUT_xxx for special values |
Application Scenario:
Using a timeout sequence in such a scenario avoids that the user-provided relative timeout
is restarted on every call to rtdm_event_timedwait(), potentially causing an overall delay that is larger than specified by timeout
. Moreover, all functions supporting timeout sequences also interpret special timeout values (infinite and non-blocking), disburdening the driver developer from handling them separately.
Environments:
This service can be called from:
Rescheduling: never.