RTEMS 6.1-rc5
|
Any real-time executive must provide a mechanism for quick response to externally generated interrupts to satisfy the critical time constraints of the application. The Interrupt Manager provides this mechanism for RTEMS. This manager permits quick interrupt response times by providing the critical ability to alter task execution which allows a task to be preempted upon exit from an ISR. More...
Files | |
file | irq-extension.h |
This header file is provided for backward compatiblility. | |
Data Structures | |
struct | rtems_interrupt_entry |
This structure represents an interrupt entry. More... | |
struct | rtems_interrupt_attributes |
This structure provides the attributes of an interrupt vector. More... | |
struct | rtems_interrupt_server_control |
This structure represents an interrupt server. More... | |
struct | rtems_interrupt_server_config |
This structure defines an interrupt server configuration. More... | |
struct | rtems_interrupt_server_action |
This structure represents an interrupt server action. More... | |
struct | rtems_interrupt_server_entry |
This structure represents an interrupt server entry. More... | |
struct | rtems_interrupt_server_request |
This structure represents an interrupt server request. More... | |
Macros | |
#define | rtems_interrupt_disable(_isr_cookie) _ISR_Local_disable( _isr_cookie ) |
Disables the maskable interrupts on the current processor. | |
#define | rtems_interrupt_enable(_isr_cookie) _ISR_Local_enable( _isr_cookie ) |
Restores the previous interrupt level on the current processor. | |
#define | rtems_interrupt_flash(_isr_cookie) _ISR_Local_flash( _isr_cookie ) |
Flashes interrupts on the current processor. | |
#define | rtems_interrupt_local_disable(_isr_cookie) _ISR_Local_disable( _isr_cookie ) |
Disables the maskable interrupts on the current processor. | |
#define | rtems_interrupt_local_enable(_isr_cookie) _ISR_Local_enable( _isr_cookie ) |
Restores the previous interrupt level on the current processor. | |
#define | rtems_interrupt_is_in_progress() _ISR_Is_in_progress() |
Checks if an ISR is in progress on the current processor. | |
#define | RTEMS_INTERRUPT_LOCK_NEEDS_OBJECT ISR_LOCK_NEEDS_OBJECT |
If this define has a non-zero value, then the interrupt lock operations require an object of type rtems_interrupt_lock, otherwise no lock object is required. | |
#define | rtems_interrupt_lock_initialize(_lock, _name) _ISR_lock_Initialize( _lock, _name ) |
Initializes the ISR lock. | |
#define | rtems_interrupt_lock_destroy(_lock) _ISR_lock_Destroy( _lock ) |
Destroys the ISR lock. | |
#define | rtems_interrupt_lock_acquire(_lock, _lock_context) _ISR_lock_ISR_disable_and_acquire( _lock, _lock_context ) |
Acquires the ISR lock. | |
#define | rtems_interrupt_lock_release(_lock, _lock_context) _ISR_lock_Release_and_ISR_enable( _lock, _lock_context ) |
Releases the ISR lock. | |
#define | rtems_interrupt_lock_acquire_isr(_lock, _lock_context) do { (void) _lock_context; } while ( 0 ) |
Acquires the ISR lock from within an ISR. | |
#define | rtems_interrupt_lock_release_isr(_lock, _lock_context) do { (void) _lock_context; } while ( 0 ) |
Releases the ISR lock from within an ISR. | |
#define | rtems_interrupt_lock_interrupt_disable(_lock_context) _ISR_lock_ISR_disable( _lock_context ) |
Disables maskable interrupts on the current processor. | |
#define | RTEMS_INTERRUPT_LOCK_DECLARE(_specifier, _designator) |
Declares an ISR lock object. | |
#define | RTEMS_INTERRUPT_LOCK_DEFINE(_specifier, _designator, _name) |
Defines an ISR lock object. | |
#define | RTEMS_INTERRUPT_LOCK_INITIALIZER(_name) 0 |
Statically initializes an ISR lock object. | |
#define | RTEMS_INTERRUPT_LOCK_MEMBER(_designator) |
Defines an ISR lock member. | |
#define | RTEMS_INTERRUPT_LOCK_REFERENCE(_designator, _target) |
Defines an ISR lock object reference. | |
#define | RTEMS_INTERRUPT_SHARED ( (rtems_option) 0x00000000 ) |
This interrupt handler install option allows that the interrupt handler may share the interrupt vector with other handler. | |
#define | RTEMS_INTERRUPT_UNIQUE ( (rtems_option) 0x00000001 ) |
This interrupt handler install option ensures that the interrupt handler is unique. | |
#define | RTEMS_INTERRUPT_REPLACE ( (rtems_option) 0x00000002 ) |
This interrupt handler install option requests that the interrupt handler replaces the first handler with the same argument. | |
#define | RTEMS_INTERRUPT_ENTRY_INITIALIZER(_routine, _arg, _info) { _routine, _arg, NULL, _info } |
Statically initializes an interrupt entry object. | |
#define | RTEMS_INTERRUPT_SERVER_DEFAULT 0 |
The constant represents the index of the default interrupt server. | |
Typedefs | |
typedef ISR_Vector_number | rtems_vector_number |
This integer type represents interrupt vector numbers. | |
typedef ISR_Level | rtems_interrupt_level |
This integer type represents interrupt levels. | |
typedef ISR_Handler | rtems_isr |
This type defines the return type of interrupt service routines. | |
typedef ISR_Handler_entry | rtems_isr_entry |
Interrupt service routines installed by rtems_interrupt_catch() shall have this type. | |
typedef char | rtems_interrupt_lock |
This structure represents an ISR lock. | |
typedef ISR_lock_Context | rtems_interrupt_lock_context |
This structure provides an ISR lock context for acquire and release pairs. | |
typedef void(* | rtems_interrupt_handler) (void *) |
Interrupt handler routines shall have this type. | |
typedef void(* | rtems_interrupt_per_handler_routine) (void *, const char *, rtems_option, rtems_interrupt_handler, void *) |
Visitor routines invoked by rtems_interrupt_handler_iterate() shall have this type. | |
typedef struct rtems_interrupt_entry | rtems_interrupt_entry |
This structure represents an interrupt entry. | |
typedef struct rtems_interrupt_server_control | rtems_interrupt_server_control |
This structure represents an interrupt server. | |
typedef struct rtems_interrupt_server_action | rtems_interrupt_server_action |
This structure represents an interrupt server action. | |
Enumerations | |
enum | rtems_interrupt_signal_variant { RTEMS_INTERRUPT_UNSPECIFIED_SIGNAL , RTEMS_INTERRUPT_NO_SIGNAL , RTEMS_INTERRUPT_SIGNAL_LEVEL_LOW , RTEMS_INTERRUPT_SIGNAL_LEVEL_HIGH , RTEMS_INTERRUPT_SIGNAL_EDGE_FALLING , RTEMS_INTERRUPT_SIGNAL_EDGE_RAISING } |
This enumeration provides interrupt trigger signal variants. More... | |
Functions | |
rtems_status_code | rtems_interrupt_catch (rtems_isr_entry new_isr_handler, rtems_vector_number vector, rtems_isr_entry *old_isr_handler) |
Establishes an interrupt service routine. | |
rtems_status_code | rtems_interrupt_entry_install (rtems_vector_number vector, rtems_option options, rtems_interrupt_entry *entry) |
Installs the interrupt entry at the interrupt vector. | |
rtems_status_code | rtems_interrupt_entry_remove (rtems_vector_number vector, rtems_interrupt_entry *entry) |
Removes the interrupt entry from the interrupt vector. | |
rtems_status_code | rtems_interrupt_handler_install (rtems_vector_number vector, const char *info, rtems_option options, rtems_interrupt_handler routine, void *arg) |
Installs the interrupt handler routine and argument at the interrupt vector. | |
rtems_status_code | rtems_interrupt_handler_remove (rtems_vector_number vector, rtems_interrupt_handler routine, void *arg) |
Removes the interrupt handler routine and argument from the interrupt vector. | |
rtems_status_code | rtems_interrupt_vector_is_enabled (rtems_vector_number vector, bool *enabled) |
Checks if the interrupt vector is enabled. | |
rtems_status_code | rtems_interrupt_vector_enable (rtems_vector_number vector) |
Enables the interrupt vector. | |
rtems_status_code | rtems_interrupt_vector_disable (rtems_vector_number vector) |
Disables the interrupt vector. | |
rtems_status_code | rtems_interrupt_is_pending (rtems_vector_number vector, bool *pending) |
Checks if the interrupt is pending. | |
rtems_status_code | rtems_interrupt_raise (rtems_vector_number vector) |
Raises the interrupt vector. | |
rtems_status_code | rtems_interrupt_raise_on (rtems_vector_number vector, uint32_t cpu_index) |
Raises the interrupt vector on the processor. | |
rtems_status_code | rtems_interrupt_clear (rtems_vector_number vector) |
Clears the interrupt vector. | |
rtems_status_code | rtems_interrupt_get_priority (rtems_vector_number vector, uint32_t *priority) |
Gets the priority of the interrupt vector. | |
rtems_status_code | rtems_interrupt_set_priority (rtems_vector_number vector, uint32_t priority) |
Sets the priority of the interrupt vector. | |
rtems_status_code | rtems_interrupt_get_affinity (rtems_vector_number vector, size_t affinity_size, cpu_set_t *affinity) |
Gets the processor affinity set of the interrupt vector. | |
rtems_status_code | rtems_interrupt_set_affinity (rtems_vector_number vector, size_t affinity_size, const cpu_set_t *affinity) |
Sets the processor affinity set of the interrupt vector. | |
rtems_status_code | rtems_interrupt_get_attributes (rtems_vector_number vector, rtems_interrupt_attributes *attributes) |
Gets the attributes of the interrupt vector. | |
rtems_status_code | rtems_interrupt_handler_iterate (rtems_vector_number vector, rtems_interrupt_per_handler_routine routine, void *arg) |
Iterates over all interrupt handler installed at the interrupt vector. | |
rtems_status_code | rtems_interrupt_server_initialize (rtems_task_priority priority, size_t stack_size, rtems_mode modes, rtems_attribute attributes, uint32_t *server_count) |
Initializes the interrupt server tasks. | |
rtems_status_code | rtems_interrupt_server_create (rtems_interrupt_server_control *control, const rtems_interrupt_server_config *config, uint32_t *server_index) |
Creates an interrupt server. | |
rtems_status_code | rtems_interrupt_server_handler_install (uint32_t server_index, rtems_vector_number vector, const char *info, rtems_option options, rtems_interrupt_handler routine, void *arg) |
Installs the interrupt handler routine and argument at the interrupt vector on the interrupt server. | |
rtems_status_code | rtems_interrupt_server_handler_remove (uint32_t server_index, rtems_vector_number vector, rtems_interrupt_handler routine, void *arg) |
Removes the interrupt handler routine and argument from the interrupt vector and the interrupt server. | |
rtems_status_code | rtems_interrupt_server_set_affinity (uint32_t server_index, size_t affinity_size, const cpu_set_t *affinity, rtems_task_priority priority) |
Sets the processor affinity of the interrupt server. | |
rtems_status_code | rtems_interrupt_server_delete (uint32_t server_index) |
Deletes the interrupt server. | |
rtems_status_code | rtems_interrupt_server_suspend (uint32_t server_index) |
Suspends the interrupt server. | |
rtems_status_code | rtems_interrupt_server_resume (uint32_t server_index) |
Resumes the interrupt server. | |
rtems_status_code | rtems_interrupt_server_move (uint32_t source_server_index, rtems_vector_number vector, uint32_t destination_server_index) |
Moves the interrupt handlers installed at the interrupt vector and the source interrupt server to the destination interrupt server. | |
rtems_status_code | rtems_interrupt_server_handler_iterate (uint32_t server_index, rtems_vector_number vector, rtems_interrupt_per_handler_routine routine, void *arg) |
Iterates over all interrupt handler installed at the interrupt vector and interrupt server. | |
rtems_status_code | rtems_interrupt_server_entry_initialize (uint32_t server_index, rtems_interrupt_server_entry *entry) |
Initializes the interrupt server entry. | |
void | rtems_interrupt_server_action_prepend (rtems_interrupt_server_entry *entry, rtems_interrupt_server_action *action, rtems_interrupt_handler routine, void *arg) |
Prepends the interrupt server action to the list of actions of the interrupt server entry. | |
void | rtems_interrupt_server_entry_destroy (rtems_interrupt_server_entry *entry) |
Destroys the interrupt server entry. | |
void | rtems_interrupt_server_entry_submit (rtems_interrupt_server_entry *entry) |
Submits the interrupt server entry to be serviced by the interrupt server. | |
rtems_status_code | rtems_interrupt_server_entry_move (rtems_interrupt_server_entry *entry, uint32_t server_index) |
Moves the interrupt server entry to the interrupt server. | |
rtems_status_code | rtems_interrupt_server_request_initialize (uint32_t server_index, rtems_interrupt_server_request *request, rtems_interrupt_handler routine, void *arg) |
Initializes the interrupt server request. | |
Any real-time executive must provide a mechanism for quick response to externally generated interrupts to satisfy the critical time constraints of the application. The Interrupt Manager provides this mechanism for RTEMS. This manager permits quick interrupt response times by providing the critical ability to alter task execution which allows a task to be preempted upon exit from an ISR.
#define rtems_interrupt_disable | ( | _isr_cookie | ) | _ISR_Local_disable( _isr_cookie ) |
Disables the maskable interrupts on the current processor.
[out] | _isr_cookie | is a variable of type rtems_interrupt_level which will be used to save the previous interrupt level. |
This directive disables all maskable interrupts on the current processor and returns the previous interrupt level in _isr_cookie
.
A later invocation of the rtems_interrupt_enable() directive should be used to restore the previous interrupt level.
This directive is implemented as a macro which sets the _isr_cookie
parameter.
The following constraints apply to this directive:
#define rtems_interrupt_enable | ( | _isr_cookie | ) | _ISR_Local_enable( _isr_cookie ) |
Restores the previous interrupt level on the current processor.
[in] | _isr_cookie | is the previous interrupt level to restore. The value must be obtained by a previous call to rtems_interrupt_disable() or rtems_interrupt_flash(). |
This directive restores the interrupt level specified by _isr_cookie
on the current processor.
The _isr_cookie
parameter value must be obtained by a previous call to rtems_interrupt_disable() or rtems_interrupt_flash(). Using an otherwise obtained value is undefined behaviour.
This directive is unsuitable to enable particular interrupt sources, for example in an interrupt controller.
The following constraints apply to this directive:
#define RTEMS_INTERRUPT_ENTRY_INITIALIZER | ( | _routine, | |
_arg, | |||
_info | |||
) | { _routine, _arg, NULL, _info } |
Statically initializes an interrupt entry object.
_routine | is the interrupt handler routine for the entry. |
_arg | is the interrupt handler argument for the entry. |
_info | is the descriptive information for the entry. |
#define rtems_interrupt_flash | ( | _isr_cookie | ) | _ISR_Local_flash( _isr_cookie ) |
Flashes interrupts on the current processor.
[in,out] | _isr_cookie | is the previous interrupt level. |
This directive is functionally equivalent to a calling rtems_interrupt_enable() immediately followed by a rtems_interrupt_disable(). On some architectures it is possible to provide an optimized implementation for this sequence.
The _isr_cookie
parameter value must be obtained by a previous call to rtems_interrupt_disable() or rtems_interrupt_flash(). Using an otherwise obtained value is undefined behaviour.
Historically, the interrupt flash directive was heavily used in the operating system implementation. However, this is no longer the case. The interrupt flash directive is provided for backward compatibility reasons.
The following constraints apply to this directive:
bool rtems_interrupt_is_in_progress | ( | void | ) | _ISR_Is_in_progress() |
Checks if an ISR is in progress on the current processor.
This directive returns true
, if the current processor is currently servicing an interrupt, and false
otherwise. A return value of true
indicates that the caller is an interrupt service routine, not a task. The directives available to an interrupt service routine are restricted.
The following constraints apply to this directive:
#define rtems_interrupt_local_disable | ( | _isr_cookie | ) | _ISR_Local_disable( _isr_cookie ) |
Disables the maskable interrupts on the current processor.
[out] | _isr_cookie | is a variable of type rtems_interrupt_level which will be used to save the previous interrupt level. |
This directive disables all maskable interrupts on the current processor and returns the previous interrupt level in _isr_cookie
.
A later invocation of the rtems_interrupt_local_enable() directive should be used to restore the previous interrupt level.
This directive is implemented as a macro which sets the _isr_cookie
parameter.
Where the system was built with SMP support enabled, this will not ensure system wide mutual exclusion. Use interrupt locks instead, see rtems_interrupt_lock_acquire(). Interrupt disabled critical sections may be used to access processor-specific data structures or disable thread dispatching.
The following constraints apply to this directive:
#define rtems_interrupt_local_enable | ( | _isr_cookie | ) | _ISR_Local_enable( _isr_cookie ) |
Restores the previous interrupt level on the current processor.
[in] | _isr_cookie | is the previous interrupt level to restore. The value must be obtained by a previous call to rtems_interrupt_local_disable(). |
This directive restores the interrupt level specified by _isr_cookie
on the current processor.
The _isr_cookie
parameter value must be obtained by a previous call to rtems_interrupt_local_disable(). Using an otherwise obtained value is undefined behaviour.
This directive is unsuitable to enable particular interrupt sources, for example in an interrupt controller.
The following constraints apply to this directive:
#define rtems_interrupt_lock_acquire | ( | _lock, | |
_lock_context | |||
) | _ISR_lock_ISR_disable_and_acquire( _lock, _lock_context ) |
Acquires the ISR lock.
[in,out] | _lock | is the ISR lock to acquire. |
[out] | _lock_context | is the ISR lock context. This lock context shall be used to release the lock by calling rtems_interrupt_lock_release(). |
This directive acquires the ISR lock specified by _lock
using the lock context provided by _lock_context
. Maskable interrupts will be disabled on the current processor.
A caller-specific lock context shall be provided for each acquire/release pair, for example an automatic variable.
Where the system was built with SMP support enabled, this directive acquires an SMP lock. An attempt to recursively acquire the lock may result in an infinite loop with maskable interrupts disabled.
This directive establishes a non-preemptive critical section with system wide mutual exclusion on the local node in all RTEMS build configurations.
The following constraints apply to this directive:
#define rtems_interrupt_lock_acquire_isr | ( | _lock, | |
_lock_context | |||
) | do { (void) _lock_context; } while ( 0 ) |
Acquires the ISR lock from within an ISR.
[in,out] | _lock | is the ISR lock to acquire within an ISR. |
[out] | _lock_context | is the ISR lock context. This lock context shall be used to release the lock by calling rtems_interrupt_lock_release_isr(). |
This directive acquires the ISR lock specified by _lock
using the lock context provided by _lock_context
. The interrupt level will remain unchanged.
A caller-specific lock context shall be provided for each acquire/release pair, for example an automatic variable.
Where the system was built with SMP support enabled, this directive acquires an SMP lock. An attempt to recursively acquire the lock may result in an infinite loop.
This directive is intended for device drivers and should be called from the corresponding interrupt service routine.
In case the corresponding interrupt service routine can be interrupted by higher priority interrupts and these interrupts enter the critical section protected by this lock, then the result is unpredictable. This directive may be used under specific circumstances as an optimization. In doubt, use rtems_interrupt_lock_acquire() and rtems_interrupt_lock_release().
The following constraints apply to this directive:
#define RTEMS_INTERRUPT_LOCK_DECLARE | ( | _specifier, | |
_designator | |||
) |
Declares an ISR lock object.
_specifier | is the storage-class specifier for the ISR lock to declare, for example extern or static . |
_designator | is the ISR lock object designator. |
#define RTEMS_INTERRUPT_LOCK_DEFINE | ( | _specifier, | |
_designator, | |||
_name | |||
) |
Defines an ISR lock object.
_specifier | is the storage-class specifier for the ISR lock to declare, for example extern or static . |
_designator | is the ISR lock object designator. |
_name | is the ISR lock name. It shall be a string. The name is only used where the system was built with profiling support enabled. |
Do not add a ";" after this macro.
ISR locks may also be dynamically initialized by rtems_interrupt_lock_initialize() or statically by RTEMS_INTERRUPT_LOCK_INITIALIZER().
#define rtems_interrupt_lock_destroy | ( | _lock | ) | _ISR_lock_Destroy( _lock ) |
Destroys the ISR lock.
[in,out] | _lock | is the ISR lock to destroy. |
The lock must have been dynamically initialized by rtems_interrupt_lock_initialize(), statically defined by RTEMS_INTERRUPT_LOCK_DEFINE(), or statically initialized by RTEMS_INTERRUPT_LOCK_INITIALIZER().
Concurrent lock use during the destruction or concurrent destruction leads to unpredictable results.
The following constraints apply to this directive:
#define rtems_interrupt_lock_initialize | ( | _lock, | |
_name | |||
) | _ISR_lock_Initialize( _lock, _name ) |
Initializes the ISR lock.
[out] | _lock | is the ISR lock to initialize. |
_name | is the ISR lock name. It shall be a string. The name is only used where the system was built with profiling support enabled. |
#define RTEMS_INTERRUPT_LOCK_INITIALIZER | ( | _name | ) | 0 |
Statically initializes an ISR lock object.
_name | is the ISR lock name. It shall be a string. The name is only used where the system was built with profiling support enabled. |
#define rtems_interrupt_lock_interrupt_disable | ( | _lock_context | ) | _ISR_lock_ISR_disable( _lock_context ) |
Disables maskable interrupts on the current processor.
[out] | _lock_context | is the ISR lock context for an acquire and release pair. |
This directive disables maskable interrupts on the current processor and stores the previous interrupt level in _lock_context
.
The following constraints apply to this directive:
#define RTEMS_INTERRUPT_LOCK_MEMBER | ( | _designator | ) |
Defines an ISR lock member.
_designator | is the ISR lock member designator. |
#define RTEMS_INTERRUPT_LOCK_NEEDS_OBJECT ISR_LOCK_NEEDS_OBJECT |
If this define has a non-zero value, then the interrupt lock operations require an object of type rtems_interrupt_lock, otherwise no lock object is required.
#define RTEMS_INTERRUPT_LOCK_REFERENCE | ( | _designator, | |
_target | |||
) |
Defines an ISR lock object reference.
_designator | is the ISR lock reference designator. |
_target | is the target object to reference. |
#define rtems_interrupt_lock_release | ( | _lock, | |
_lock_context | |||
) | _ISR_lock_Release_and_ISR_enable( _lock, _lock_context ) |
Releases the ISR lock.
[in,out] | _lock | is the ISR lock to release. |
[in,out] | _lock_context | is the ISR lock context. This lock context shall have been used to acquire the lock by calling rtems_interrupt_lock_acquire(). |
This directive releases the ISR lock specified by _lock
using the lock context provided by _lock_context
. The previous interrupt level will be restored on the current processor.
The lock context shall be the one used to acquire the lock, otherwise the result is unpredictable.
Where the system was built with SMP support enabled, this directive releases an SMP lock.
The following constraints apply to this directive:
#define rtems_interrupt_lock_release_isr | ( | _lock, | |
_lock_context | |||
) | do { (void) _lock_context; } while ( 0 ) |
Releases the ISR lock from within an ISR.
[in,out] | _lock | is the ISR lock to release within an ISR. |
[in,out] | _lock_context | is the ISR lock context. This lock context shall have been used to acquire the lock by calling rtems_interrupt_lock_acquire_isr(). |
This directive releases the ISR lock specified by _lock
using the lock context provided by _lock_context
. The interrupt level will remain unchanged.
The lock context shall be the one used to acquire the lock, otherwise the result is unpredictable.
Where the system was built with SMP support enabled, this directive releases an SMP lock.
The following constraints apply to this directive:
#define RTEMS_INTERRUPT_UNIQUE ( (rtems_option) 0x00000001 ) |
This interrupt handler install option ensures that the interrupt handler is unique.
This option prevents other handler from using the same interrupt vector.
typedef struct rtems_interrupt_entry rtems_interrupt_entry |
This structure represents an interrupt entry.
The following constraints apply to this structure:
typedef char rtems_interrupt_lock |
This structure represents an ISR lock.
Lock objects are only needed in some RTEMS build configurations, for example where the SMP support is enabled. The RTEMS_INTERRUPT_LOCK_NEEDS_OBJECT constant can be used to determine whether a lock object is needed or not. This may help to reduce the memory demands of an application. All lock operations do not use the lock object parameter if lock objects are not needed.
typedef struct rtems_interrupt_server_action rtems_interrupt_server_action |
This structure represents an interrupt server action.
The following constraints apply to this structure:
typedef struct rtems_interrupt_server_control rtems_interrupt_server_control |
This structure represents an interrupt server.
The following constraints apply to this structure:
typedef ISR_Handler rtems_isr |
This type defines the return type of interrupt service routines.
This type can be used to document interrupt service routines in the source code.
This enumeration provides interrupt trigger signal variants.
rtems_status_code rtems_interrupt_catch | ( | rtems_isr_entry | new_isr_handler, |
rtems_vector_number | vector, | ||
rtems_isr_entry * | old_isr_handler | ||
) |
Establishes an interrupt service routine.
new_isr_handler | is the new interrupt service routine. | |
vector | is the interrupt vector number. | |
[out] | old_isr_handler | is the pointer to an rtems_isr_entry object. When the directive call is successful, the previous interrupt service routine established for this interrupt vector will be stored in this object. |
This directive establishes an interrupt service routine (ISR) for the interrupt specified by the vector
number. The new_isr_handler
parameter specifies the entry point of the ISR. The entry point of the previous ISR for the specified vector is returned in old_isr_handler
.
To release an interrupt vector, pass the old handler's address obtained when the vector was first capture.
RTEMS_SUCCESSFUL | The requested operation was successful. |
RTEMS_INVALID_NUMBER | The interrupt vector number was illegal. |
RTEMS_INVALID_ADDRESS | The new_isr_handler parameter was NULL. |
RTEMS_INVALID_ADDRESS | The old_isr_handler parameter was NULL. |
The following constraints apply to this directive:
rtems_status_code rtems_interrupt_clear | ( | rtems_vector_number | vector | ) |
Clears the interrupt vector.
vector | is the number of the interrupt vector to clear. |
RTEMS_SUCCESSFUL | The requested operation was successful. |
RTEMS_INVALID_ID | There was no interrupt vector associated with the number specified by vector . |
RTEMS_UNSATISFIED | The request to raise the interrupt vector has not been satisfied. |
The following constraints apply to this directive:
rtems_status_code rtems_interrupt_entry_install | ( | rtems_vector_number | vector, |
rtems_option | options, | ||
rtems_interrupt_entry * | entry | ||
) |
Installs the interrupt entry at the interrupt vector.
vector | is the interrupt vector number. |
options | is the interrupt entry install option set. |
entry | is the interrupt entry to install. |
One of the following mutually exclusive options
shall be set in the options
parameter.
The handler routine of the entry specified by entry
will be called with the handler argument of the entry when dispatched. The order in which shared interrupt handlers are dispatched for one vector is defined by the installation order. The first installed handler is dispatched first.
If the option RTEMS_INTERRUPT_UNIQUE is set, then it will be ensured that the handler will be the only one for the interrupt vector.
If the option RTEMS_INTERRUPT_SHARED is set, then multiple handlers may be installed for the interrupt vector.
RTEMS_SUCCESSFUL | The requested operation was successful. |
RTEMS_INVALID_ADDRESS | The entry parameter was NULL. |
RTEMS_INCORRECT_STATE | The service was not initialized. |
RTEMS_INVALID_ADDRESS | The handler routine of the entry was NULL. |
RTEMS_INVALID_ID | There was no interrupt vector associated with the number specified by vector . |
RTEMS_CALLED_FROM_ISR | The directive was called from within interrupt context. |
RTEMS_INVALID_NUMBER | An option specified by options was not applicable. |
RTEMS_RESOURCE_IN_USE | The RTEMS_INTERRUPT_UNIQUE option was set in entry and the interrupt vector was already occupied by a handler. |
RTEMS_RESOURCE_IN_USE | The RTEMS_INTERRUPT_SHARED option was set in entry and the interrupt vector was already occupied by a unique handler. |
RTEMS_TOO_MANY | The handler routine of the entry specified by entry was already installed for the interrupt vector specified by vector with an argument equal to the handler argument of the entry. |
The following constraints apply to this directive:
rtems_status_code rtems_interrupt_entry_remove | ( | rtems_vector_number | vector, |
rtems_interrupt_entry * | entry | ||
) |
Removes the interrupt entry from the interrupt vector.
vector | is the interrupt vector number. |
entry | is the interrupt entry to remove. |
RTEMS_SUCCESSFUL | The requested operation was successful. |
RTEMS_INCORRECT_STATE | The service was not initialized. |
RTEMS_INVALID_ADDRESS | The entry parameter was NULL. |
RTEMS_INVALID_ID | There was no interrupt vector associated with the number specified by vector . |
RTEMS_CALLED_FROM_ISR | The directive was called from within interrupt context. |
RTEMS_UNSATISFIED | The entry specified by entry was not installed at the interrupt vector specified by vector . |
The following constraints apply to this directive:
rtems_status_code rtems_interrupt_get_affinity | ( | rtems_vector_number | vector, |
size_t | affinity_size, | ||
cpu_set_t * | affinity | ||
) |
Gets the processor affinity set of the interrupt vector.
vector | is the interrupt vector number. | |
affinity_size | is the size of the processor set referenced by affinity in bytes. | |
[out] | affinity | is the pointer to a cpu_set_t object. When the directive call is successful, the processor affinity set of the interrupt vector will be stored in this object. A set bit in the processor set means that the corresponding processor is in the processor affinity set of the interrupt vector, otherwise the bit is cleared. |
RTEMS_SUCCESSFUL | The requested operation was successful. |
RTEMS_INVALID_ADDRESS | The affinity parameter was NULL. |
RTEMS_INVALID_ID | There was no interrupt vector associated with the number specified by vector . |
RTEMS_INVALID_SIZE | The size specified by affinity_size of the processor set was too small for the processor affinity set of the interrupt vector. |
The following constraints apply to this directive:
rtems_status_code rtems_interrupt_get_attributes | ( | rtems_vector_number | vector, |
rtems_interrupt_attributes * | attributes | ||
) |
Gets the attributes of the interrupt vector.
vector | is the interrupt vector number. | |
[out] | attributes | is the pointer to an rtems_interrupt_attributes object. When the directive call is successful, the attributes of the interrupt vector will be stored in this object. |
RTEMS_SUCCESSFUL | The requested operation was successful. |
RTEMS_INVALID_ADDRESS | The attributes parameter was NULL. |
RTEMS_INVALID_ID | There was no interrupt vector associated with the number specified by vector . |
The following constraints apply to this directive:
rtems_status_code rtems_interrupt_get_priority | ( | rtems_vector_number | vector, |
uint32_t * | priority | ||
) |
Gets the priority of the interrupt vector.
vector | is the interrupt vector number. | |
[out] | priority | is the pointer to an uint32_t object. When the directive call is successful, the priority of the interrupt vector will be stored in this object. |
RTEMS_SUCCESSFUL | The requested operation was successful. |
RTEMS_INVALID_ADDRESS | The priority parameter was NULL. |
RTEMS_INVALID_ID | There was no interrupt vector associated with the number specified by vector . |
RTEMS_UNSATISFIED | There is no priority associated with the interrupt vector. |
The following constraints apply to this directive:
rtems_status_code rtems_interrupt_handler_install | ( | rtems_vector_number | vector, |
const char * | info, | ||
rtems_option | options, | ||
rtems_interrupt_handler | routine, | ||
void * | arg | ||
) |
Installs the interrupt handler routine and argument at the interrupt vector.
vector | is the interrupt vector number. |
info | is the descriptive information of the interrupt handler to install. |
options | is the interrupt handler install option set. |
routine | is the interrupt handler routine to install. |
arg | is the interrupt handler argument to install. |
One of the following mutually exclusive options
shall be set in the options
parameter.
The handler routine will be called with the argument specified by arg
when dispatched. The order in which shared interrupt handlers are dispatched for one vector is defined by the installation order. The first installed handler is dispatched first.
If the option RTEMS_INTERRUPT_UNIQUE is set, then it will be ensured that the handler will be the only one for the interrupt vector.
If the option RTEMS_INTERRUPT_SHARED is set, then multiple handler may be installed for the interrupt vector.
If the option RTEMS_INTERRUPT_REPLACE is set, then the handler specified by routine
will replace the first handler with the same argument for the interrupt vector if it exists, otherwise an error status will be returned. A second handler with the same argument for the interrupt vector will remain unchanged. The new handler will inherit the unique or shared options from the replaced handler.
An informative description may be provided in info
. It may be used for system debugging and diagnostic tools. The referenced string has to be persistent as long as the handler is installed.
RTEMS_SUCCESSFUL | The requested operation was successful. |
RTEMS_INCORRECT_STATE | The service was not initialized. |
RTEMS_INVALID_ADDRESS | The routine parameter was NULL. |
RTEMS_INVALID_ID | There was no interrupt vector associated with the number specified by vector . |
RTEMS_CALLED_FROM_ISR | The directive was called from within interrupt context. |
RTEMS_NO_MEMORY | There was not enough memory available to allocate data structures to install the handler. |
RTEMS_RESOURCE_IN_USE | The RTEMS_INTERRUPT_UNIQUE option was set in options and the interrupt vector was already occupied by a handler. |
RTEMS_RESOURCE_IN_USE | The RTEMS_INTERRUPT_SHARED option was set in options and the interrupt vector was already occupied by a unique handler. |
RTEMS_TOO_MANY | The handler specified by routine was already installed for the interrupt vector specified by vector with an argument equal to the argument specified by arg . |
RTEMS_UNSATISFIED | The RTEMS_INTERRUPT_REPLACE option was set in options and no handler to replace was installed. |
The following constraints apply to this directive:
rtems_status_code rtems_interrupt_handler_iterate | ( | rtems_vector_number | vector, |
rtems_interrupt_per_handler_routine | routine, | ||
void * | arg | ||
) |
Iterates over all interrupt handler installed at the interrupt vector.
vector | is the interrupt vector number. |
routine | is the visitor routine. |
arg | is the visitor argument. |
For each installed handler at the interrupt vector the visitor function specified by routine
will be called with the argument specified by arg
and the handler information, options, routine and argument.
RTEMS_SUCCESSFUL | The requested operation was successful. |
RTEMS_INCORRECT_STATE | The service was not initialized. |
RTEMS_INVALID_ADDRESS | The routine parameter was NULL. |
RTEMS_INVALID_ID | There was no interrupt vector associated with the number specified by vector . |
RTEMS_CALLED_FROM_ISR | The directive was called from within interrupt context. |
The directive is intended for system information and diagnostics.
Never install or remove an interrupt handler within the visitor function. This may result in a deadlock.
The following constraints apply to this directive:
rtems_status_code rtems_interrupt_handler_remove | ( | rtems_vector_number | vector, |
rtems_interrupt_handler | routine, | ||
void * | arg | ||
) |
Removes the interrupt handler routine and argument from the interrupt vector.
vector | is the interrupt vector number. |
routine | is the interrupt handler routine to remove. |
arg | is the interrupt handler argument to remove. |
RTEMS_SUCCESSFUL | The requested operation was successful. |
RTEMS_INCORRECT_STATE | The service was not initialized. |
RTEMS_INVALID_ADDRESS | The routine parameter was NULL. |
RTEMS_INVALID_ID | There was no interrupt vector associated with the number specified by vector . |
RTEMS_CALLED_FROM_ISR | The directive was called from within interrupt context. |
RTEMS_UNSATISFIED | There was no handler routine and argument pair installed specified by routine and arg . |
The following constraints apply to this directive:
rtems_status_code rtems_interrupt_is_pending | ( | rtems_vector_number | vector, |
bool * | pending | ||
) |
Checks if the interrupt is pending.
vector | is the interrupt vector number. | |
[out] | pending | is the pointer to a bool object. When the directive call is successful, the pending status of the interrupt associated with the interrupt vector specified by vector will be stored in this object. When the interrupt was pending for the processor executing the directive call at some time point during the call, the object value will be set to true, otherwise to false. |
The directive checks if the interrupt associated with the interrupt vector specified by vector
was pending for the processor executing the directive call at some time point during the call.
RTEMS_SUCCESSFUL | The requested operation was successful. |
RTEMS_INVALID_ADDRESS | The pending parameter was NULL. |
RTEMS_INVALID_ID | There was no interrupt vector associated with the number specified by vector . |
RTEMS_UNSATISFIED | The request to get the pending status has not been satisfied. |
The following constraints apply to this directive:
rtems_status_code rtems_interrupt_raise | ( | rtems_vector_number | vector | ) |
Raises the interrupt vector.
vector | is the number of the interrupt vector to raise. |
RTEMS_SUCCESSFUL | The requested operation was successful. |
RTEMS_INVALID_ID | There was no interrupt vector associated with the number specified by vector . |
RTEMS_UNSATISFIED | The request to raise the interrupt vector has not been satisfied. |
The following constraints apply to this directive:
rtems_status_code rtems_interrupt_raise_on | ( | rtems_vector_number | vector, |
uint32_t | cpu_index | ||
) |
Raises the interrupt vector on the processor.
vector | is the number of the interrupt vector to raise. |
cpu_index | is the index of the target processor of the interrupt vector to raise. |
RTEMS_SUCCESSFUL | The requested operation was successful. |
RTEMS_INVALID_ID | There was no interrupt vector associated with the number specified by vector . |
RTEMS_NOT_CONFIGURED | The processor specified by cpu_index was not configured to be used by the application. |
RTEMS_INCORRECT_STATE | The processor specified by cpu_index was configured to be used by the application, however, it was not online. |
RTEMS_UNSATISFIED | The request to raise the interrupt vector has not been satisfied. |
The following constraints apply to this directive:
void rtems_interrupt_server_action_prepend | ( | rtems_interrupt_server_entry * | entry, |
rtems_interrupt_server_action * | action, | ||
rtems_interrupt_handler | routine, | ||
void * | arg | ||
) |
Prepends the interrupt server action to the list of actions of the interrupt server entry.
[in,out] | entry | is the interrupt server entry to prepend the interrupt server action. It shall have been initialized via rtems_interrupt_server_entry_initialize(). |
[out] | action | is the interrupt server action to initialize and prepend to the list of actions of the entry. |
routine | is the interrupt handler routine to set in the action. | |
arg | is the interrupt handler argument to set in the action. |
The following constraints apply to this directive:
rtems_status_code rtems_interrupt_server_create | ( | rtems_interrupt_server_control * | control, |
const rtems_interrupt_server_config * | config, | ||
uint32_t * | server_index | ||
) |
Creates an interrupt server.
[out] | control | is the pointer to an rtems_interrupt_server_control object. When the directive call was successful, the ownership of the object was transferred from the caller of the directive to the interrupt server management. |
config | is the interrupt server configuration. | |
[out] | server_index | is the pointer to an uint32_t object. When the directive call was successful, the index of the created interrupt server will be stored in this object. |
RTEMS_SUCCESSFUL | The requested operation was successful. |
The following constraints apply to this directive:
rtems_status_code rtems_interrupt_server_delete | ( | uint32_t | server_index | ) |
Deletes the interrupt server.
server_index | is the index of the interrupt server to delete. |
RTEMS_SUCCESSFUL | The requested operation was successful. |
RTEMS_INVALID_ID | There was no interrupt server associated with the server index specified by server_index . |
The interrupt server deletes itself, so after the return of the directive the interrupt server may be still in the termination process depending on the task priorities of the system.
See also rtems_interrupt_server_create().
The following constraints apply to this directive:
void rtems_interrupt_server_entry_destroy | ( | rtems_interrupt_server_entry * | entry | ) |
Destroys the interrupt server entry.
[in,out] | entry | is the interrupt server entry to destroy. |
The following constraints apply to this directive:
rtems_status_code rtems_interrupt_server_entry_initialize | ( | uint32_t | server_index, |
rtems_interrupt_server_entry * | entry | ||
) |
Initializes the interrupt server entry.
server_index | is the interrupt server index. The constant RTEMS_INTERRUPT_SERVER_DEFAULT may be used to specify the default interrupt server. |
entry | is the interrupt server entry to initialize. |
RTEMS_SUCCESSFUL | The requested operation was successful. |
RTEMS_INVALID_ID | There was no interrupt server associated with the index specified by server_index . |
The following constraints apply to this directive:
rtems_status_code rtems_interrupt_server_entry_move | ( | rtems_interrupt_server_entry * | entry, |
uint32_t | server_index | ||
) |
Moves the interrupt server entry to the interrupt server.
entry | is the interrupt server entry to move. |
server_index | is the index of the destination interrupt server. The constant RTEMS_INTERRUPT_SERVER_DEFAULT may be used to specify the default interrupt server. |
RTEMS_SUCCESSFUL | The requested operation was successful. |
RTEMS_INVALID_ID | There was no interrupt server associated with the index specified by server_index . |
The following constraints apply to this directive:
void rtems_interrupt_server_entry_submit | ( | rtems_interrupt_server_entry * | entry | ) |
Submits the interrupt server entry to be serviced by the interrupt server.
entry | is the interrupt server entry to submit. |
The directive appends the entry to the pending entries of the interrupt server. The interrupt server is notified that a new entry is pending. Once the interrupt server is scheduled it services the actions of all pending entries.
This directive may be used to do a two-step interrupt processing. The first step is done from within interrupt context by a call to this directive. The second step is then done from within the context of the interrupt server.
No error checking is performed by the directive.
A submitted entry may be destroyed by rtems_interrupt_server_entry_destroy().
The following constraints apply to this directive:
rtems_status_code rtems_interrupt_server_handler_install | ( | uint32_t | server_index, |
rtems_vector_number | vector, | ||
const char * | info, | ||
rtems_option | options, | ||
rtems_interrupt_handler | routine, | ||
void * | arg | ||
) |
Installs the interrupt handler routine and argument at the interrupt vector on the interrupt server.
server_index | is the interrupt server index. The constant RTEMS_INTERRUPT_SERVER_DEFAULT may be used to specify the default interrupt server. |
vector | is the interrupt vector number. |
info | is the descriptive information of the interrupt handler to install. |
options | is the interrupt handler install option set. |
routine | is the interrupt handler routine to install. |
arg | is the interrupt handler argument to install. |
The handler routine specified by routine
will be executed within the context of the interrupt server task specified by server_index
.
RTEMS_SUCCESSFUL | The requested operation was successful. |
RTEMS_INVALID_ID | There was no interrupt server associated with the index specified by server_index . |
RTEMS_CALLED_FROM_ISR | The directive was called from within interrupt context. |
RTEMS_INVALID_ADDRESS | The routine parameter was NULL. |
RTEMS_INVALID_ID | There was no interrupt vector associated with the number specified by vector . |
RTEMS_INVALID_NUMBER | An option specified by info was not applicable. |
RTEMS_RESOURCE_IN_USE | The RTEMS_INTERRUPT_UNIQUE option was set in info and the interrupt vector was already occupied by a handler. |
RTEMS_RESOURCE_IN_USE | The RTEMS_INTERRUPT_SHARED option was set in info and the interrupt vector was already occupied by a unique handler. |
RTEMS_TOO_MANY | The handler specified by routine was already installed for the interrupt vector specified by vector with an argument equal to the argument specified by arg . |
RTEMS_UNSATISFIED | The RTEMS_INTERRUPT_REPLACE option was set in info and no handler to replace was installed. |
The following constraints apply to this directive:
rtems_status_code rtems_interrupt_server_handler_iterate | ( | uint32_t | server_index, |
rtems_vector_number | vector, | ||
rtems_interrupt_per_handler_routine | routine, | ||
void * | arg | ||
) |
Iterates over all interrupt handler installed at the interrupt vector and interrupt server.
server_index | is the index of the interrupt server. |
vector | is the interrupt vector number. |
routine | is the visitor routine. |
arg | is the visitor argument. |
For each installed handler at the interrupt vector and interrupt server the visitor function specified by vector
will be called with the argument specified by routine
and the handler information, options, routine and argument.
RTEMS_SUCCESSFUL | The requested operation was successful. |
RTEMS_INVALID_ID | There was no interrupt server associated with the index specified by server_index . |
RTEMS_INVALID_ID | There was no interrupt vector associated with the number specified by vector . |
The directive is intended for system information and diagnostics.
Never install or remove an interrupt handler within the visitor function. This may result in a deadlock.
The following constraints apply to this directive:
rtems_status_code rtems_interrupt_server_handler_remove | ( | uint32_t | server_index, |
rtems_vector_number | vector, | ||
rtems_interrupt_handler | routine, | ||
void * | arg | ||
) |
Removes the interrupt handler routine and argument from the interrupt vector and the interrupt server.
server_index | is the interrupt server index. The constant RTEMS_INTERRUPT_SERVER_DEFAULT may be used to specify the default interrupt server. |
vector | is the interrupt vector number. |
routine | is the interrupt handler routine to remove. |
arg | is the interrupt handler argument to remove. |
RTEMS_SUCCESSFUL | The requested operation was successful. |
RTEMS_INVALID_ID | There was no interrupt server associated with the index specified by server_index . |
RTEMS_INVALID_ID | There was no interrupt vector associated with the number specified by vector . |
RTEMS_UNSATISFIED | There was no handler routine and argument pair installed specified by routine and arg . |
The following constraints apply to this directive:
rtems_status_code rtems_interrupt_server_initialize | ( | rtems_task_priority | priority, |
size_t | stack_size, | ||
rtems_mode | modes, | ||
rtems_attribute | attributes, | ||
uint32_t * | server_count | ||
) |
Initializes the interrupt server tasks.
priority | is the initial task priority of the created interrupt servers. | |
stack_size | is the task stack size of the created interrupt servers. | |
modes | is the initial mode set of the created interrupt servers. | |
attributes | is the attribute set of the created interrupt servers. | |
[out] | server_count | is the pointer to an uint32_t object or NULL. When the pointer is not equal to NULL, the count of successfully created interrupt servers is stored in this object regardless of the return status. |
The directive tries to create an interrupt server task for each online processor in the system. The tasks will have the initial priority specified by priority
, the stack size specified by stack_size
, the initial mode set specified by modes
, and the attribute set specified by attributes
. The count of successfully created server tasks will be returned in server_count
if the pointer is not equal to NULL.
RTEMS_SUCCESSFUL | The requested operation was successful. |
RTEMS_INCORRECT_STATE | The interrupt servers were already initialized. |
Interrupt handlers may be installed on an interrupt server with rtems_interrupt_server_handler_install() and removed with rtems_interrupt_server_handler_remove() using a server index. In case of an interrupt, the request will be forwarded to the interrupt server. The handlers are executed within the interrupt server context. If one handler blocks on something this may delay the processing of other handlers.
Interrupt servers may be deleted by rtems_interrupt_server_delete().
The following constraints apply to this directive:
rtems_status_code rtems_interrupt_server_move | ( | uint32_t | source_server_index, |
rtems_vector_number | vector, | ||
uint32_t | destination_server_index | ||
) |
Moves the interrupt handlers installed at the interrupt vector and the source interrupt server to the destination interrupt server.
source_server_index | is the index of the source interrupt server. The constant RTEMS_INTERRUPT_SERVER_DEFAULT may be used to specify the default interrupt server. |
vector | is the interrupt vector number. |
destination_server_index | is the index of the destination interrupt server. The constant RTEMS_INTERRUPT_SERVER_DEFAULT may be used to specify the default interrupt server. |
RTEMS_SUCCESSFUL | The requested operation was successful. |
RTEMS_INVALID_ID | There was no interrupt server associated with the index specified by source_server_index . |
RTEMS_INVALID_ID | There was no interrupt server associated with the index specified by destination_server_index . |
RTEMS_INVALID_ID | There was no interrupt vector associated with the number specified by vector . |
The following constraints apply to this directive:
rtems_status_code rtems_interrupt_server_request_initialize | ( | uint32_t | server_index, |
rtems_interrupt_server_request * | request, | ||
rtems_interrupt_handler | routine, | ||
void * | arg | ||
) |
Initializes the interrupt server request.
server_index | is the interrupt server index. The constant RTEMS_INTERRUPT_SERVER_DEFAULT may be used to specify the default interrupt server. | |
[out] | request | is the interrupt server request to initialize. |
routine | is the interrupt handler routine for the request action. | |
arg | is the interrupt handler argument for the request action. |
RTEMS_SUCCESSFUL | The requested operation was successful. |
RTEMS_INVALID_ID | There was no interrupt server associated with the index specified by server_index . |
The following constraints apply to this directive:
rtems_status_code rtems_interrupt_server_resume | ( | uint32_t | server_index | ) |
Resumes the interrupt server.
server_index | is the index of the interrupt server to resume. The constant RTEMS_INTERRUPT_SERVER_DEFAULT may be used to specify the default interrupt server. |
RTEMS_SUCCESSFUL | The requested operation was successful. |
RTEMS_INVALID_ID | There was no interrupt server associated with the index specified by server_index . |
The following constraints apply to this directive:
rtems_status_code rtems_interrupt_server_set_affinity | ( | uint32_t | server_index, |
size_t | affinity_size, | ||
const cpu_set_t * | affinity, | ||
rtems_task_priority | priority | ||
) |
Sets the processor affinity of the interrupt server.
server_index | is the interrupt server index. The constant RTEMS_INTERRUPT_SERVER_DEFAULT may be used to specify the default interrupt server. |
affinity_size | is the size of the processor set referenced by affinity in bytes. |
affinity | is the pointer to a cpu_set_t object. The processor set defines the new processor affinity set of the interrupt server. A set bit in the processor set means that the corresponding processor shall be in the processor affinity set of the task, otherwise the bit shall be cleared. |
priority | is the new real priority for the interrupt server. |
RTEMS_SUCCESSFUL | The requested operation was successful. |
RTEMS_INVALID_ID | There was no interrupt server associated with the index specified by server_index . |
The scheduler is set determined by the highest numbered processor in the affinity set specified by affinity
.
This operation is only reliable in case the interrupt server was suspended via rtems_interrupt_server_suspend().
The following constraints apply to this directive:
rtems_status_code rtems_interrupt_server_suspend | ( | uint32_t | server_index | ) |
Suspends the interrupt server.
server_index | is the index of the interrupt server to suspend. The constant RTEMS_INTERRUPT_SERVER_DEFAULT may be used to specify the default interrupt server. |
RTEMS_SUCCESSFUL | The requested operation was successful. |
RTEMS_INVALID_ID | There was no interrupt server associated with the index specified by server_index . |
The following constraints apply to this directive:
rtems_status_code rtems_interrupt_set_affinity | ( | rtems_vector_number | vector, |
size_t | affinity_size, | ||
const cpu_set_t * | affinity | ||
) |
Sets the processor affinity set of the interrupt vector.
vector | is the interrupt vector number. |
affinity_size | is the size of the processor set referenced by affinity in bytes. |
affinity | is the pointer to a cpu_set_t object. The processor set defines the new processor affinity set of the interrupt vector. A set bit in the processor set means that the corresponding processor shall be in the processor affinity set of the interrupt vector, otherwise the bit shall be cleared. |
RTEMS_SUCCESSFUL | The requested operation was successful. |
RTEMS_INVALID_ADDRESS | The affinity parameter was NULL. |
RTEMS_INVALID_ID | There was no interrupt vector associated with the number specified by vector . |
RTEMS_INVALID_NUMBER | The referenced processor set was not a valid new processor affinity set for the interrupt vector. |
RTEMS_UNSATISFIED | The request to set the processor affinity of the interrupt vector has not been satisfied. |
The rtems_interrupt_get_attributes() directive may be used to check if the processor affinity of an interrupt vector can be set.
Only online processors of the affinity set specified by affinity_size
and affinity
are considered by the directive. Other processors of the set are ignored. If the set contains no online processor, then the set is invalid and an error status is returned.
The following constraints apply to this directive:
rtems_status_code rtems_interrupt_set_priority | ( | rtems_vector_number | vector, |
uint32_t | priority | ||
) |
Sets the priority of the interrupt vector.
vector | is the interrupt vector number. |
priority | is the new priority for the interrupt vector. |
This directive sets the priority of the interrupt specified by vector
to the priority specified by priority
.
For processor-specific interrupts, the priority of the interrupt specific to a processor executing the directive call will be set.
RTEMS_SUCCESSFUL | The requested operation was successful. |
RTEMS_INVALID_ID | There was no interrupt vector associated with the number specified by vector . |
RTEMS_INVALID_PRIORITY | The priority specified by priority was not a valid new priority for the interrupt vector. |
RTEMS_UNSATISFIED | The request to set the priority of the interrupt vector has not been satisfied. |
The rtems_interrupt_get_priority() directive may be used to get the priority associated with an interrupt vector.
The interrupt prioritization support depends on the interrupt controller of the target. It is strongly recommended to read the relevant hardware documentation. What happens when the priority of a pending or active interrupt is changed, depends on the interrupt controller. In general, you should set the interrupt priority of an interrupt vector before a handler is installed. On some interrupt controllers, setting the priority to the maximum value (lowest importance) effectively disables the interrupt.
On some architectures, a range of interrupt priority values may be not disabled by the interrupt disable directives such as rtems_interrupt_disable() and rtems_interrupt_local_disable(). These interrupts are called non-maskable interrupts. Handlers of non-maskable interrupts shall not use operating system services. In addition, non-maskable interrupts may be not installable through rtems_interrupt_entry_install() or rtems_interrupt_handler_install(), and may require architecture-specific prologue and epilogue code.
The interrupt priority settings affect the maximum nesting depth while servicing interrupts. The interrupt stack size calculation needs to take this into account, see also CONFIGURE_INTERRUPT_STACK_SIZE.
For the ARM Generic Interrupt Controller (GIC), an 8-bit priority value is supported. The granularity of the priority levels depends on the interrupt controller configuration. Some low-order bits of a priority value may be read-as-zero (RAZ) and writes are ignored (WI). Where group 0 (FIQ) and group 1 (IRQ) interrupts are used, it is recommended to use the lower half of the supported priority value range for the group 0 interrupts and the upper half for group 1 interrupts. This ensures that group 1 interrupts cannot preempt group 0 interrupts.
For the Armv7-M Nested Vector Interrupt Controller (NVIC), an 8-bit priority value is supported. The granularity of the priority levels depends on the interrupt controller configuration. Some lower bits of a priority value may be read-as-zero (RAZ) and writes are ignored (WI). Interrupts with a priority value less than 128 are not disabled by the RTEMS interrupt disable directives. Handlers of such interrupts shall not use operating system services.
For the RISC-V Platform-Level Interrupt Controller (PLIC), all priority values from 0 up to and including the 0xffffffff are supported since the priority for the PLIC is defined by a write-any-read-legal (WARL) register. Please note that for this directive in contrast to the PLIC, a higher priority value is associated with a lower importance. The maximum priority value (mapped to the value 0 for the PLIC) is reserved to mean "never interrupt" and effectively disables the interrupt.
For the QorIQ Multicore Programmable Interrupt Controller (MPIC), a 4-bit priority value is supported. Please note that for this directive in contrast to the MPIC, a higher priority value is associated with a lower importance. The maximum priority value of 15 (mapped to the value 0 for the MPIC) inhibits signalling of this interrupt.
Consult the RTEMS CPU Architecture Supplement and the BSP documentation in the RTEMS User Manual for further information.
The following constraints apply to this directive:
rtems_status_code rtems_interrupt_vector_disable | ( | rtems_vector_number | vector | ) |
Disables the interrupt vector.
vector | is the number of the interrupt vector to disable. |
The directive disables the interrupt vector specified by vector
. This prevents that an interrupt service request is issued to the target processors of the interrupt vector.
RTEMS_SUCCESSFUL | The requested operation was successful. |
RTEMS_INVALID_ID | There was no interrupt vector associated with the number specified by vector . |
RTEMS_UNSATISFIED | The request to disable the interrupt vector has not been satisfied. |
The following constraints apply to this directive:
rtems_status_code rtems_interrupt_vector_enable | ( | rtems_vector_number | vector | ) |
Enables the interrupt vector.
vector | is the number of the interrupt vector to enable. |
The directive enables the interrupt vector specified by vector
. This allows that interrupt service requests are issued to the target processors of the interrupt vector. Interrupt service requests for an interrupt vector may be raised by rtems_interrupt_raise(), rtems_interrupt_raise_on(), external signals, or messages.
RTEMS_SUCCESSFUL | The requested operation was successful. |
RTEMS_INVALID_ID | There was no interrupt vector associated with the number specified by vector . |
RTEMS_UNSATISFIED | The request to enable the interrupt vector has not been satisfied. |
The following constraints apply to this directive:
rtems_status_code rtems_interrupt_vector_is_enabled | ( | rtems_vector_number | vector, |
bool * | enabled | ||
) |
Checks if the interrupt vector is enabled.
vector | is the interrupt vector number. | |
[out] | enabled | is the pointer to a bool object. When the directive call is successful, the enabled status of the interrupt associated with the interrupt vector specified by vector will be stored in this object. When the interrupt was enabled for the processor executing the directive call at some time point during the call, the object value will be set to true, otherwise to false. |
The directive checks if the interrupt associated with the interrupt vector specified by vector
was enabled for the processor executing the directive call at some time point during the call.
RTEMS_SUCCESSFUL | The requested operation was successful. |
RTEMS_INVALID_ADDRESS | The enabled parameter was NULL. |
RTEMS_INVALID_ID | There was no interrupt vector associated with the number specified by vector . |
The following constraints apply to this directive: