summaryrefslogtreecommitdiffstats
path: root/doc/user/signal.t
diff options
context:
space:
mode:
Diffstat (limited to 'doc/user/signal.t')
-rw-r--r--doc/user/signal.t389
1 files changed, 389 insertions, 0 deletions
diff --git a/doc/user/signal.t b/doc/user/signal.t
new file mode 100644
index 0000000000..c441338d2a
--- /dev/null
+++ b/doc/user/signal.t
@@ -0,0 +1,389 @@
+@c
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@chapter Signal Manager
+
+@cindex signals
+
+@section Introduction
+
+The signal manager provides the capabilities required
+for asynchronous communication. The directives provided by the
+signal manager are:
+
+@itemize @bullet
+@item @code{@value{DIRPREFIX}signal_catch} - Establish an ASR
+@item @code{@value{DIRPREFIX}signal_send} - Send signal set to a task
+@end itemize
+
+@section Background
+
+@subsection Signal Manager Definitions
+
+@cindex asynchronous signal routine
+@cindex ASR
+
+The signal manager allows a task to optionally define
+an asynchronous signal routine (ASR). An ASR is to a task what
+an ISR is to an application's set of tasks. When the processor
+is interrupted, the execution of an application is also
+interrupted and an ISR is given control. Similarly, when a
+signal is sent to a task, that task's execution path will be
+"interrupted" by the ASR. Sending a signal to a task has no
+effect on the receiving task's current execution state.
+
+@findex rtems_signal_set
+
+A signal flag is used by a task (or ISR) to inform
+another task of the occurrence of a significant situation.
+Thirty-two signal flags are associated with each task. A
+collection of one or more signals is referred to as a signal
+set. The data type @code{@value{DIRPREFIX}signal_set}
+is used to manipulate signal sets.
+
+A signal set is posted when it is directed (or sent) to a
+task. A pending signal is a signal that has been sent to a task
+with a valid ASR, but has not been processed by that task's ASR.
+
+
+@subsection A Comparison of ASRs and ISRs
+
+@cindex ASR vs. ISR
+@cindex ISR vs. ASR
+
+The format of an ASR is similar to that of an ISR
+with the following exceptions:
+
+@itemize @bullet
+@item ISRs are scheduled by the processor hardware. ASRs are
+scheduled by RTEMS.
+
+@item ISRs do not execute in the context of a task and may
+invoke only a subset of directives. ASRs execute in the context
+of a task and may execute any directive.
+
+@item When an ISR is invoked, it is passed the vector number
+as its argument. When an ASR is invoked, it is passed the
+signal set as its argument.
+
+@item An ASR has a task mode which can be different from that
+of the task. An ISR does not execute as a task and, as a
+result, does not have a task mode.
+@end itemize
+
+@subsection Building a Signal Set
+
+@cindex signal set, building
+
+A signal set is built by a bitwise OR of the desired
+signals. The set of valid signals is @code{@value{RPREFIX}SIGNAL_0} through
+@code{@value{RPREFIX}SIGNAL_31}. If a signal is not explicitly specified in the
+signal set, then it is not present. Signal values are
+specifically designed to be mutually exclusive, therefore
+bitwise OR and addition operations are equivalent as long as
+each signal appears exactly once in the component list.
+
+This example demonstrates the signal parameter used
+when sending the signal set consisting of
+@code{@value{RPREFIX}SIGNAL_6},
+@code{@value{RPREFIX}SIGNAL_15}, and
+@code{@value{RPREFIX}SIGNAL_31}. The signal parameter provided
+to the @code{@value{DIRPREFIX}signal_send} directive should be
+@code{@value{RPREFIX}SIGNAL_6 @value{OR}
+@value{RPREFIX}SIGNAL_15 @value{OR} @value{RPREFIX}SIGNAL_31}.
+
+@subsection Building an ASR Mode
+
+@cindex ASR mode, building
+
+In general, an ASR's mode is built by a bitwise OR of
+the desired mode components. The set of valid mode components
+is the same as those allowed with the task_create and task_mode
+directives. A complete list of mode options is provided in the
+following table:
+
+@itemize @bullet
+@item @code{@value{RPREFIX}PREEMPT} is masked by
+@code{@value{RPREFIX}PREEMPT_MASK} and enables preemption
+
+@item @code{@value{RPREFIX}NO_PREEMPT} is masked by
+@code{@value{RPREFIX}PREEMPT_MASK} and disables preemption
+
+@item @code{@value{RPREFIX}NO_TIMESLICE} is masked by
+@code{@value{RPREFIX}TIMESLICE_MASK} and disables timeslicing
+
+@item @code{@value{RPREFIX}TIMESLICE} is masked by
+@code{@value{RPREFIX}TIMESLICE_MASK} and enables timeslicing
+
+@item @code{@value{RPREFIX}ASR} is masked by
+@code{@value{RPREFIX}ASR_MASK} and enables ASR processing
+
+@item @code{@value{RPREFIX}NO_ASR} is masked by
+@code{@value{RPREFIX}ASR_MASK} and disables ASR processing
+
+@item @code{@value{RPREFIX}INTERRUPT_LEVEL(0)} is masked by
+@code{@value{RPREFIX}INTERRUPT_MASK} and enables all interrupts
+
+@item @code{@value{RPREFIX}INTERRUPT_LEVEL(n)} is masked by
+@code{@value{RPREFIX}INTERRUPT_MASK} and sets interrupts level n
+@end itemize
+
+Mode values are specifically designed to be mutually
+exclusive, therefore bitwise OR and addition operations are
+equivalent as long as each mode appears exactly once in the
+component list. A mode component listed as a default is not
+required to appear in the mode list, although it is a good
+programming practice to specify default components. If all
+defaults are desired, the mode DEFAULT_MODES should be specified
+on this call.
+
+This example demonstrates the mode parameter used
+with the @code{@value{DIRPREFIX}signal_catch}
+to establish an ASR which executes at
+interrupt level three and is non-preemptible. The mode should
+be set to
+@code{@value{RPREFIX}INTERRUPT_LEVEL(3) @value{OR} @value{RPREFIX}NO_PREEMPT}
+to indicate the
+desired processor mode and interrupt level.
+
+@section Operations
+
+@subsection Establishing an ASR
+
+The @code{@value{DIRPREFIX}signal_catch} directive establishes an ASR for the
+calling task. The address of the ASR and its execution mode are
+specified to this directive. The ASR's mode is distinct from
+the task's mode. For example, the task may allow preemption,
+while that task's ASR may have preemption disabled. Until a
+task calls @code{@value{DIRPREFIX}signal_catch} the first time,
+its ASR is invalid, and no signal sets can be sent to the task.
+
+A task may invalidate its ASR and discard all pending
+signals by calling @code{@value{DIRPREFIX}signal_catch}
+with a value of NULL for the ASR's address. When a task's
+ASR is invalid, new signal sets sent to this task are discarded.
+
+A task may disable ASR processing (@code{@value{RPREFIX}NO_ASR}) via the
+task_mode directive. When a task's ASR is disabled, the signals
+sent to it are left pending to be processed later when the ASR
+is enabled.
+
+Any directive that can be called from a task can also
+be called from an ASR. A task is only allowed one active ASR.
+Thus, each call to @code{@value{DIRPREFIX}signal_catch}
+replaces the previous one.
+
+Normally, signal processing is disabled for the ASR's
+execution mode, but if signal processing is enabled for the ASR,
+the ASR must be reentrant.
+
+@subsection Sending a Signal Set
+
+The @code{@value{DIRPREFIX}signal_send} directive allows both
+tasks and ISRs to send signals to a target task. The target task and
+a set of signals are specified to the
+@code{@value{DIRPREFIX}signal_send} directive. The sending
+of a signal to a task has no effect on the execution state of
+that task. If the task is not the currently running task, then
+the signals are left pending and processed by the task's ASR the
+next time the task is dispatched to run. The ASR is executed
+immediately before the task is dispatched. If the currently
+running task sends a signal to itself or is sent a signal from
+an ISR, its ASR is immediately dispatched to run provided signal
+processing is enabled.
+
+If an ASR with signals enabled is preempted by
+another task or an ISR and a new signal set is sent, then a new
+copy of the ASR will be invoked, nesting the preempted ASR.
+Upon completion of processing the new signal set, control will
+return to the preempted ASR. In this situation, the ASR must be
+reentrant.
+
+Like events, identical signals sent to a task are not
+queued. In other words, sending the same signal multiple times
+to a task (without any intermediate signal processing occurring
+for the task), has the same result as sending that signal to
+that task once.
+
+@subsection Processing an ASR
+
+Asynchronous signals were designed to provide the
+capability to generate software interrupts. The processing of
+software interrupts parallels that of hardware interrupts. As a
+result, the differences between the formats of ASRs and ISRs is
+limited to the meaning of the single argument passed to an ASR.
+The ASR should have the following calling sequence and adhere to
+@value{LANGUAGE} calling conventions:
+
+@ifset is-C
+@findex rtems_asr
+@example
+rtems_asr user_routine(
+ rtems_signal_set signals
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure User_Routine (
+ Signals : in RTEMS.Signal_Set
+);
+@end example
+@end ifset
+
+When the ASR returns to RTEMS the mode and execution
+path of the interrupted task (or ASR) is restored to the context
+prior to entering the ASR.
+
+@section Directives
+
+This section details the signal manager's directives.
+A subsection is dedicated to each of this manager's directives
+and describes the calling sequence, related constants, usage,
+and status codes.
+
+@c
+@c
+@c
+@page
+@subsection SIGNAL_CATCH - Establish an ASR
+
+@cindex establish an ASR
+@cindex install an ASR
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_signal_catch
+@example
+rtems_status_code rtems_signal_catch(
+ rtems_asr_entry asr_handler,
+ rtems_mode mode
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Signal_Catch (
+ ASR_Handler : in RTEMS.ASR_Handler;
+ Mode_Set : in RTEMS.Mode;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - always successful
+
+@subheading DESCRIPTION:
+
+This directive establishes an asynchronous signal
+routine (ASR) for the calling task. The asr_handler parameter
+specifies the entry point of the ASR. If 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 parameter specifies the execution
+mode for the ASR. This execution mode supersedes the task's
+execution mode while the ASR is executing.
+
+@subheading NOTES:
+
+This directive will not cause the calling task to be
+preempted.
+
+The following task mode constants are defined by RTEMS:
+
+@itemize @bullet
+@item @code{@value{RPREFIX}PREEMPT} is masked by
+@code{@value{RPREFIX}PREEMPT_MASK} and enables preemption
+
+@item @code{@value{RPREFIX}NO_PREEMPT} is masked by
+@code{@value{RPREFIX}PREEMPT_MASK} and disables preemption
+
+@item @code{@value{RPREFIX}NO_TIMESLICE} is masked by
+@code{@value{RPREFIX}TIMESLICE_MASK} and disables timeslicing
+
+@item @code{@value{RPREFIX}TIMESLICE} is masked by
+@code{@value{RPREFIX}TIMESLICE_MASK} and enables timeslicing
+
+@item @code{@value{RPREFIX}ASR} is masked by
+@code{@value{RPREFIX}ASR_MASK} and enables ASR processing
+
+@item @code{@value{RPREFIX}NO_ASR} is masked by
+@code{@value{RPREFIX}ASR_MASK} and disables ASR processing
+
+@item @code{@value{RPREFIX}INTERRUPT_LEVEL(0)} is masked by
+@code{@value{RPREFIX}INTERRUPT_MASK} and enables all interrupts
+
+@item @code{@value{RPREFIX}INTERRUPT_LEVEL(n)} is masked by
+@code{@value{RPREFIX}INTERRUPT_MASK} and sets interrupts level n
+@end itemize
+
+@c
+@c
+@c
+@page
+@subsection SIGNAL_SEND - Send signal set to a task
+
+@cindex send signal set
+
+@subheading CALLING SEQUENCE:
+
+@ifset is-C
+@findex rtems_signal_send
+@example
+rtems_status_code rtems_signal_send(
+ rtems_id id,
+ rtems_signal_set signal_set
+);
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+procedure Signal_Send (
+ ID : in RTEMS.ID;
+ Signal_Set : in RTEMS.Signal_Set;
+ Result : out RTEMS.Status_Codes
+);
+@end example
+@end ifset
+
+@subheading DIRECTIVE STATUS CODES:
+@code{@value{RPREFIX}SUCCESSFUL} - signal sent successfully@*
+@code{@value{RPREFIX}INVALID_ID} - task id invalid@*
+@code{@value{RPREFIX}NOT_DEFINED} - ASR invalid
+
+@subheading DESCRIPTION:
+
+This directive sends a signal set to the task
+specified in id. The signal_set parameter contains the signal
+set to be sent to the task.
+
+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.
+
+@subheading NOTES:
+
+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.
+