Xenomai
3.1
|
Typedefs | |
typedef void(* | rtdm_task_proc_t) (void *arg) |
Real-time task procedure. More... | |
Functions | |
int | rtdm_task_init (rtdm_task_t *task, const char *name, rtdm_task_proc_t task_proc, void *arg, int priority, nanosecs_rel_t period) |
Initialise and start a real-time task More... | |
void | rtdm_task_destroy (rtdm_task_t *task) |
Destroy a real-time task More... | |
int | rtdm_task_should_stop (void) |
Check for pending termination request More... | |
void | rtdm_task_set_priority (rtdm_task_t *task, int priority) |
Adjust real-time task priority More... | |
int | rtdm_task_set_period (rtdm_task_t *task, nanosecs_abs_t start_date, nanosecs_rel_t period) |
Adjust real-time task period More... | |
int | rtdm_task_wait_period (unsigned long *overruns_r) |
Wait on next real-time task period More... | |
int | rtdm_task_unblock (rtdm_task_t *task) |
Activate a blocked real-time task More... | |
rtdm_task_t * | rtdm_task_current (void) |
Get current real-time task More... | |
int | rtdm_task_sleep (nanosecs_rel_t delay) |
Sleep a specified amount of time More... | |
int | rtdm_task_sleep_until (nanosecs_abs_t wakeup_time) |
Sleep until a specified absolute time More... | |
int | rtdm_task_sleep_abs (nanosecs_abs_t wakeup_time, enum rtdm_timer_mode mode) |
Sleep until a specified absolute time More... | |
int | rtdm_task_busy_wait (bool condition, nanosecs_rel_t spin_ns, nanosecs_rel_t sleep_ns) |
Safe busy waiting More... | |
void | rtdm_wait_prepare (struct rtdm_wait_context *wc) |
Register wait context. More... | |
void | rtdm_wait_complete (struct rtdm_wait_context *wc) |
Mark completion for a wait context. More... | |
int | rtdm_wait_is_completed (struct rtdm_wait_context *wc) |
Test completion of a wait context. More... | |
void | rtdm_task_join (rtdm_task_t *task) |
Wait on a real-time task to terminate More... | |
void | rtdm_task_busy_sleep (nanosecs_rel_t delay) |
Busy-wait a specified amount of time More... | |
Task Priority Range | |
#define | RTDM_TASK_LOWEST_PRIORITY 0 |
#define | RTDM_TASK_HIGHEST_PRIORITY 99 |
Task Priority Modification | |
#define | RTDM_TASK_RAISE_PRIORITY (+1) |
#define | RTDM_TASK_LOWER_PRIORITY (-1) |
typedef void(* rtdm_task_proc_t) (void *arg) |
Real-time task procedure.
[in,out] | arg | argument as passed to rtdm_task_init() |
void rtdm_task_busy_sleep | ( | nanosecs_rel_t | delay | ) |
Busy-wait a specified amount of time
This service does not schedule out the caller, but rather spins in a tight loop, burning CPU cycles until the timeout elapses.
[in] | delay | Delay in nanoseconds. Note that a zero delay does not have the meaning of RTDM_TIMEOUT_INFINITE here. |
int rtdm_task_busy_wait | ( | bool | condition, |
nanosecs_rel_t | spin_ns, | ||
nanosecs_rel_t | sleep_ns | ||
) |
Safe busy waiting
This service alternates active spinning and sleeping within a wait loop, until a condition is satisfied. While sleeping, a task is scheduled out and does not consume any CPU time.
rtdm_task_busy_wait() is particularly useful for waiting for a state change reading an I/O register, which usually happens shortly after the wait starts, without incurring the adverse effects of long busy waiting if it doesn't.
[in] | condition | The C expression to be tested for detecting completion. |
[in] | spin_ns | The time to spin on condition before sleeping, expressed as a count of nanoseconds. |
[in] | sleep_ns | The time to sleep for before spinning again, expressed as a count of nanoseconds. |
rtdm_task_t* rtdm_task_current | ( | void | ) |
void rtdm_task_destroy | ( | rtdm_task_t * | task | ) |
Destroy a real-time task
This call sends a termination request to task, then waits for it to exit. All RTDM task should check for pending termination requests by calling rtdm_task_should_stop() from their work loop.
If task is current, rtdm_task_destroy() terminates the current context, and does not return to the caller.
[in,out] | task | Task handle as returned by rtdm_task_init() |
int rtdm_task_init | ( | rtdm_task_t * | task, |
const char * | name, | ||
rtdm_task_proc_t | task_proc, | ||
void * | arg, | ||
int | priority, | ||
nanosecs_rel_t | period | ||
) |
Initialise and start a real-time task
After initialising a task, the task handle remains valid and can be passed to RTDM services until either rtdm_task_destroy() or rtdm_task_join() was invoked.
[in,out] | task | Task handle |
[in] | name | Optional task name |
[in] | task_proc | Procedure to be executed by the task |
[in] | arg | Custom argument passed to task_proc() on entry |
[in] | priority | Priority of the task, see also Task Priority Range |
[in] | period | Period in nanoseconds of a cyclic task, 0 for non-cyclic mode. Waiting for the first and subsequent periodic events is done using rtdm_task_wait_period(). |
void rtdm_task_join | ( | rtdm_task_t * | task | ) |
Wait on a real-time task to terminate
[in,out] | task | Task handle as returned by rtdm_task_init() |
int rtdm_task_set_period | ( | rtdm_task_t * | task, |
nanosecs_abs_t | start_date, | ||
nanosecs_rel_t | period | ||
) |
Adjust real-time task period
[in,out] | task | Task handle as returned by rtdm_task_init(), or NULL for referring to the current RTDM task or Cobalt thread. |
[in] | start_date | The initial (absolute) date of the first release point, expressed in nanoseconds. task will be delayed by the first call to rtdm_task_wait_period() until this point is reached. If start_date is zero, the first release point is set to period nanoseconds after the current date. |
[in] | period | New period in nanoseconds of a cyclic task, zero to disable cyclic mode for task. |
void rtdm_task_set_priority | ( | rtdm_task_t * | task, |
int | priority | ||
) |
Adjust real-time task priority
[in,out] | task | Task handle as returned by rtdm_task_init() |
[in] | priority | New priority of the task, see also Task Priority Range |
int rtdm_task_should_stop | ( | void | ) |
Check for pending termination request
Check whether a termination request was received by the current RTDM task. Termination requests are sent by calling rtdm_task_destroy().
int rtdm_task_sleep | ( | nanosecs_rel_t | delay | ) |
Sleep a specified amount of time
[in] | delay | Delay in nanoseconds, see RTDM_TIMEOUT_xxx for special values. |
int rtdm_task_sleep_abs | ( | nanosecs_abs_t | wakeup_time, |
enum rtdm_timer_mode | mode | ||
) |
Sleep until a specified absolute time
[in] | wakeup_time | Absolute timeout in nanoseconds |
[in] | mode | Selects the timer mode, see RTDM_TIMERMODE_xxx for details |
int rtdm_task_sleep_until | ( | nanosecs_abs_t | wakeup_time | ) |
Sleep until a specified absolute time
[in] | wakeup_time | Absolute timeout in nanoseconds |
int rtdm_task_unblock | ( | rtdm_task_t * | task | ) |
Activate a blocked real-time task
int rtdm_task_wait_period | ( | unsigned long * | overruns_r | ) |
Wait on next real-time task period
[in] | overruns_r | Address of a long word receiving the count of overruns if -ETIMEDOUT is returned, or NULL if the caller don't need that information. |
void rtdm_wait_complete | ( | struct rtdm_wait_context * | wc | ) |
Mark completion for a wait context.
rtdm_complete_wait() marks a wait context as completed, so that rtdm_wait_is_completed() returns true for such context.
wc | Wait context to complete. |
int rtdm_wait_is_completed | ( | struct rtdm_wait_context * | wc | ) |
Test completion of a wait context.
rtdm_wait_is_completed() returns true if rtdm_complete_wait() was called for wc. The completion mark is reset each time rtdm_wait_prepare() is called for a wait context.
wc | Wait context to check for completion. |
void rtdm_wait_prepare | ( | struct rtdm_wait_context * | wc | ) |
Register wait context.
rtdm_wait_prepare() registers a wait context structure for the caller, which can be later retrieved by a call to rtdm_wait_get_context(). This call is normally issued before the current task blocks on a wait object, waiting for some (producer) code to wake it up. Arbitrary data can be exchanged between both sites via the wait context structure, which is allocated by the waiter (consumer) side.
wc is the address of an anchor object which is commonly embedded into a larger structure with arbitrary contents, which needs to be shared between the consumer (waiter) and the producer for implementing the wait code.
A typical implementation pattern for the wait side is:
On the producer side, the implementation would look like:
wc | Wait context to register. |