RTEMS 6.1-rc4
|
The Signal Manager provides the capabilities required for asynchronous communication. More...
Typedefs | |
typedef void | rtems_asr |
This type defines the return type of routines which are used to process asynchronous signals. | |
typedef uint32_t | rtems_signal_set |
This integer type represents a bit field which can hold exactly 32 individual signals. | |
typedef rtems_asr(* | rtems_asr_entry) (rtems_signal_set) |
This type defines the prototype of routines which are used to process asynchronous signals. | |
Functions | |
rtems_status_code | rtems_signal_catch (rtems_asr_entry asr_handler, rtems_mode mode_set) |
Establishes an asynchronous signal routine (ASR) for the calling task. | |
rtems_status_code | rtems_signal_send (rtems_id id, rtems_signal_set signal_set) |
Sends the signal set to the task. | |
The Signal Manager provides the capabilities required for asynchronous communication.
typedef void rtems_asr |
This type defines the return type of routines which are used to process asynchronous signals.
rtems_status_code rtems_signal_catch | ( | rtems_asr_entry | asr_handler, |
rtems_mode | mode_set | ||
) |
Establishes an asynchronous signal routine (ASR) for the calling task.
asr_handler | is the handler to process an asynchronous signal set. |
mode_set | is the task mode while an asynchronous signal set is processed by the handler. See rtems_task_mode(). |
This directive establishes an asynchronous signal routine (ASR) for the calling task. The asr_handler
parameter specifies the entry point of the ASR. A task may have at most one handler installed at a time. The most recently installed handler is used. When asr_handler
is NULL, the ASR for the calling task is invalidated and all pending signals are cleared. Any signals sent to a task with an invalid ASR are discarded. The mode_set
parameter specifies the execution mode for the ASR. This execution mode supersedes the task's execution mode while the ASR is executing.
RTEMS_SUCCESSFUL | The requested operation was successful. |
RTEMS_NOT_IMPLEMENTED | The RTEMS_NO_PREEMPT was set in mode_set and the system configuration had no implementation for this mode. |
RTEMS_NOT_IMPLEMENTED | The RTEMS_INTERRUPT_LEVEL() was set to a positive level in mode_set and the system configuration had no implementation for this mode. |
It is strongly recommended to disable ASR processing during ASR processing by setting RTEMS_NO_ASR in mode_set
, otherwise a recursion may happen during ASR processing. Uncontrolled recursion may lead to stack overflows.
Using the same mutex (in particular a recursive mutex) in normal task context and during ASR processing may result in undefined behaviour.
Asynchronous signal handlers can access thread-local storage (TLS). When thread-local storage is shared between normal task context and ASR processing, it may be protected by disabled interrupts.
The following constraints apply to this directive:
rtems_status_code rtems_signal_send | ( | rtems_id | id, |
rtems_signal_set | signal_set | ||
) |
Sends the signal set to the task.
id | is the identifier of the target task to receive the signal set. |
signal_set | is the signal set to send. |
This directive sends the signal set, signal_set
, to the target task identified by id
.
If a caller sends a signal set to a task with an invalid ASR, then an error code is returned to the caller. If a caller sends a signal set to a task whose ASR is valid but disabled, then the signal set will be caught and left pending for the ASR to process when it is enabled. If a caller sends a signal set to a task with an ASR that is both valid and enabled, then the signal set is caught and the ASR will execute the next time the task is dispatched to run.
RTEMS_SUCCESSFUL | The requested operation was successful. |
RTEMS_INVALID_NUMBER | The signal_set parameter was 0. |
RTEMS_INVALID_ID | There was no task associated with the identifier specified by id . |
RTEMS_NOT_DEFINED | The target task had no valid ASR installed. |
Sending a signal set to a task has no effect on that task's state. If a signal set is sent to a blocked task, then the task will remain blocked and the signals will be processed when the task becomes the running task.
Sending a signal set to a global task which does not reside on the local node will generate a request telling the remote node to send the signal set to the specified task.
The following constraints apply to this directive: