mirror of
https://git.rtems.org/rtems-docs/
synced 2025-05-15 19:57:07 +08:00
3645 lines
98 KiB
ReStructuredText
3645 lines
98 KiB
ReStructuredText
.. SPDX-License-Identifier: CC-BY-SA-4.0
|
|
|
|
.. Copyright (C) 2008, 2022 embedded brains GmbH (http://www.embedded-brains.de)
|
|
.. Copyright (C) 1988, 2008 On-Line Applications Research Corporation (OAR)
|
|
|
|
.. This file is part of the RTEMS quality process and was automatically
|
|
.. generated. If you find something that needs to be fixed or
|
|
.. worded better please post a report or patch to an RTEMS mailing list
|
|
.. or raise a bug report:
|
|
..
|
|
.. https://www.rtems.org/bugs.html
|
|
..
|
|
.. For information on updating and regenerating please refer to the How-To
|
|
.. section in the Software Requirements Engineering chapter of the
|
|
.. RTEMS Software Engineering manual. The manual is provided as a part of
|
|
.. a release. For development sources please refer to the online
|
|
.. documentation at:
|
|
..
|
|
.. https://docs.rtems.org
|
|
|
|
.. _InterruptManagerDirectives:
|
|
|
|
Directives
|
|
==========
|
|
|
|
This section details the directives of the Interrupt Manager. A subsection is
|
|
dedicated to each of this manager's directives and lists the calling sequence,
|
|
parameters, description, return values, and notes of the directive.
|
|
|
|
.. Generated from spec:/rtems/intr/if/catch
|
|
|
|
.. raw:: latex
|
|
|
|
\clearpage
|
|
|
|
.. index:: rtems_interrupt_catch()
|
|
.. index:: establish an ISR
|
|
.. index:: install an ISR
|
|
|
|
.. _InterfaceRtemsInterruptCatch:
|
|
|
|
rtems_interrupt_catch()
|
|
-----------------------
|
|
|
|
Establishes an interrupt service routine.
|
|
|
|
.. rubric:: CALLING SEQUENCE:
|
|
|
|
.. code-block:: c
|
|
|
|
rtems_status_code rtems_interrupt_catch(
|
|
rtems_isr_entry new_isr_handler,
|
|
rtems_vector_number vector,
|
|
rtems_isr_entry *old_isr_handler
|
|
);
|
|
|
|
.. rubric:: PARAMETERS:
|
|
|
|
``new_isr_handler``
|
|
This parameter is the new interrupt service routine.
|
|
|
|
``vector``
|
|
This parameter is the interrupt vector number.
|
|
|
|
``old_isr_handler``
|
|
This parameter is the pointer to an :c:type:`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.
|
|
|
|
.. rubric:: DESCRIPTION:
|
|
|
|
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.
|
|
|
|
.. rubric:: RETURN VALUES:
|
|
|
|
:c:macro:`RTEMS_SUCCESSFUL`
|
|
The requested operation was successful.
|
|
|
|
:c:macro:`RTEMS_INVALID_NUMBER`
|
|
The interrupt vector number was illegal.
|
|
|
|
:c:macro:`RTEMS_INVALID_ADDRESS`
|
|
The ``new_isr_handler`` parameter was `NULL
|
|
<https://en.cppreference.com/w/c/types/NULL>`_.
|
|
|
|
:c:macro:`RTEMS_INVALID_ADDRESS`
|
|
The ``old_isr_handler`` parameter was `NULL
|
|
<https://en.cppreference.com/w/c/types/NULL>`_.
|
|
|
|
.. rubric:: CONSTRAINTS:
|
|
|
|
The following constraints apply to this directive:
|
|
|
|
* The directive may be called from within interrupt context.
|
|
|
|
* The directive may be called from within device driver initialization context.
|
|
|
|
* The directive may be called from within task context.
|
|
|
|
* The directive will not cause the calling task to be preempted.
|
|
|
|
* The directive is only available where the :term:`target architecture` support
|
|
enabled simple vectored interrupts.
|
|
|
|
.. Generated from spec:/rtems/intr/if/disable
|
|
|
|
.. raw:: latex
|
|
|
|
\clearpage
|
|
|
|
.. index:: rtems_interrupt_disable()
|
|
.. index:: disable interrupts
|
|
|
|
.. _InterfaceRtemsInterruptDisable:
|
|
|
|
rtems_interrupt_disable()
|
|
-------------------------
|
|
|
|
Disables the maskable interrupts on the current processor.
|
|
|
|
.. rubric:: CALLING SEQUENCE:
|
|
|
|
.. code-block:: c
|
|
|
|
void rtems_interrupt_disable( rtems_interrupt_level isr_cookie );
|
|
|
|
.. rubric:: PARAMETERS:
|
|
|
|
``isr_cookie``
|
|
This parameter is a variable of type :c:type:`rtems_interrupt_level` which
|
|
will be used to save the previous interrupt level.
|
|
|
|
.. rubric:: DESCRIPTION:
|
|
|
|
This directive disables all maskable interrupts on the current processor and
|
|
returns the previous interrupt level in ``isr_cookie``.
|
|
|
|
.. rubric:: NOTES:
|
|
|
|
A later invocation of the :ref:`InterfaceRtemsInterruptEnable` directive should
|
|
be used to restore the previous interrupt level.
|
|
|
|
This directive is implemented as a macro which sets the ``isr_cookie``
|
|
parameter.
|
|
|
|
.. code-block:: c
|
|
:linenos:
|
|
|
|
#include <rtems.h>
|
|
|
|
void local_critical_section( void )
|
|
{
|
|
rtems_interrupt_level level;
|
|
|
|
// Please note that the rtems_interrupt_disable() is a macro. The
|
|
// previous interrupt level (before the maskable interrupts are
|
|
// disabled) is returned here in the level macro parameter. This
|
|
// would be wrong:
|
|
//
|
|
// rtems_interrupt_disable( &level );
|
|
rtems_interrupt_disable( level );
|
|
|
|
// Here is the critical section: maskable interrupts are disabled
|
|
|
|
{
|
|
rtems_interrupt_level nested_level;
|
|
|
|
rtems_interrupt_disable( nested_level );
|
|
|
|
// Here is a nested critical section
|
|
|
|
rtems_interrupt_enable( nested_level );
|
|
}
|
|
|
|
// Maskable interrupts are still disabled
|
|
|
|
rtems_interrupt_enable( level );
|
|
}
|
|
|
|
.. rubric:: CONSTRAINTS:
|
|
|
|
The following constraints apply to this directive:
|
|
|
|
* The directive may be called from within any runtime context.
|
|
|
|
* The directive will not cause the calling task to be preempted.
|
|
|
|
* Where the system was built with SMP support enabled, the directive is not
|
|
available. Its use will result in compiler warnings and linker errors. The
|
|
:ref:`InterfaceRtemsInterruptLocalDisable` and
|
|
:ref:`InterfaceRtemsInterruptLocalEnable` directives are available in all
|
|
build configurations.
|
|
|
|
.. Generated from spec:/rtems/intr/if/enable
|
|
|
|
.. raw:: latex
|
|
|
|
\clearpage
|
|
|
|
.. index:: rtems_interrupt_enable()
|
|
.. index:: enable interrupts
|
|
.. index:: restore interrupt level
|
|
|
|
.. _InterfaceRtemsInterruptEnable:
|
|
|
|
rtems_interrupt_enable()
|
|
------------------------
|
|
|
|
Restores the previous interrupt level on the current processor.
|
|
|
|
.. rubric:: CALLING SEQUENCE:
|
|
|
|
.. code-block:: c
|
|
|
|
void rtems_interrupt_enable( rtems_interrupt_level isr_cookie );
|
|
|
|
.. rubric:: PARAMETERS:
|
|
|
|
``isr_cookie``
|
|
This parameter is the previous interrupt level to restore. The value must
|
|
be obtained by a previous call to :ref:`InterfaceRtemsInterruptDisable` or
|
|
:ref:`InterfaceRtemsInterruptFlash`.
|
|
|
|
.. rubric:: DESCRIPTION:
|
|
|
|
This directive restores the interrupt level specified by ``isr_cookie`` on the
|
|
current processor.
|
|
|
|
.. rubric:: NOTES:
|
|
|
|
The ``isr_cookie`` parameter value must be obtained by a previous call to
|
|
:ref:`InterfaceRtemsInterruptDisable` or :ref:`InterfaceRtemsInterruptFlash`.
|
|
Using an otherwise obtained value is undefined behaviour.
|
|
|
|
This directive is unsuitable to enable particular interrupt sources, for
|
|
example in an interrupt controller.
|
|
|
|
.. rubric:: CONSTRAINTS:
|
|
|
|
The following constraints apply to this directive:
|
|
|
|
* The directive may be called from within any runtime context.
|
|
|
|
* The directive will not cause the calling task to be preempted.
|
|
|
|
* While at least one maskable interrupt is pending, when the directive enables
|
|
maskable interrupts, the pending interrupts are immediately serviced. The
|
|
interrupt service routines may unblock higher priority tasks which may
|
|
preempt the calling task.
|
|
|
|
* Where the system was built with SMP support enabled, the directive is not
|
|
available. Its use will result in compiler warnings and linker errors. The
|
|
:ref:`InterfaceRtemsInterruptLocalDisable` and
|
|
:ref:`InterfaceRtemsInterruptLocalEnable` directives are available in all
|
|
build configurations.
|
|
|
|
.. Generated from spec:/rtems/intr/if/flash
|
|
|
|
.. raw:: latex
|
|
|
|
\clearpage
|
|
|
|
.. index:: rtems_interrupt_flash()
|
|
.. index:: flash interrupts
|
|
|
|
.. _InterfaceRtemsInterruptFlash:
|
|
|
|
rtems_interrupt_flash()
|
|
-----------------------
|
|
|
|
Flashes interrupts on the current processor.
|
|
|
|
.. rubric:: CALLING SEQUENCE:
|
|
|
|
.. code-block:: c
|
|
|
|
void rtems_interrupt_flash( rtems_interrupt_level isr_cookie );
|
|
|
|
.. rubric:: PARAMETERS:
|
|
|
|
``isr_cookie``
|
|
This parameter is the previous interrupt level.
|
|
|
|
.. rubric:: DESCRIPTION:
|
|
|
|
This directive is functionally equivalent to a calling
|
|
:ref:`InterfaceRtemsInterruptEnable` immediately followed by a
|
|
:ref:`InterfaceRtemsInterruptDisable`. On some architectures it is possible to
|
|
provide an optimized implementation for this sequence.
|
|
|
|
.. rubric:: NOTES:
|
|
|
|
The ``isr_cookie`` parameter value must be obtained by a previous call to
|
|
:ref:`InterfaceRtemsInterruptDisable` or :ref:`InterfaceRtemsInterruptFlash`.
|
|
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.
|
|
|
|
.. rubric:: CONSTRAINTS:
|
|
|
|
The following constraints apply to this directive:
|
|
|
|
* The directive may be called from within any runtime context.
|
|
|
|
* The directive will not cause the calling task to be preempted.
|
|
|
|
* Where the system was built with SMP support enabled, the directive is not
|
|
available. Its use will result in compiler warnings and linker errors. The
|
|
:ref:`InterfaceRtemsInterruptLocalDisable` and
|
|
:ref:`InterfaceRtemsInterruptLocalEnable` directives are available in all
|
|
build configurations.
|
|
|
|
.. Generated from spec:/rtems/intr/if/local-disable
|
|
|
|
.. raw:: latex
|
|
|
|
\clearpage
|
|
|
|
.. index:: rtems_interrupt_local_disable()
|
|
.. index:: disable interrupts
|
|
|
|
.. _InterfaceRtemsInterruptLocalDisable:
|
|
|
|
rtems_interrupt_local_disable()
|
|
-------------------------------
|
|
|
|
Disables the maskable interrupts on the current processor.
|
|
|
|
.. rubric:: CALLING SEQUENCE:
|
|
|
|
.. code-block:: c
|
|
|
|
void rtems_interrupt_local_disable( rtems_interrupt_level isr_cookie );
|
|
|
|
.. rubric:: PARAMETERS:
|
|
|
|
``isr_cookie``
|
|
This parameter is a variable of type :c:type:`rtems_interrupt_level` which
|
|
will be used to save the previous interrupt level.
|
|
|
|
.. rubric:: DESCRIPTION:
|
|
|
|
This directive disables all maskable interrupts on the current processor and
|
|
returns the previous interrupt level in ``isr_cookie``.
|
|
|
|
.. rubric:: NOTES:
|
|
|
|
A later invocation of the :ref:`InterfaceRtemsInterruptLocalEnable` 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
|
|
:ref:`InterfaceRtemsInterruptLockAcquire`. Interrupt disabled critical
|
|
sections may be used to access processor-specific data structures or disable
|
|
thread dispatching.
|
|
|
|
.. code-block:: c
|
|
:linenos:
|
|
|
|
#include <rtems.h>
|
|
|
|
void local_critical_section( void )
|
|
{
|
|
rtems_interrupt_level level;
|
|
|
|
// Please note that the rtems_interrupt_local_disable() is a macro.
|
|
// The previous interrupt level (before the maskable interrupts are
|
|
// disabled) is returned here in the level macro parameter. This would
|
|
// be wrong:
|
|
//
|
|
// rtems_interrupt_local_disable( &level );
|
|
rtems_interrupt_local_disable( level );
|
|
|
|
// Here is the critical section: maskable interrupts are disabled
|
|
|
|
{
|
|
rtems_interrupt_level nested_level;
|
|
|
|
rtems_interrupt_local_disable( nested_level );
|
|
|
|
// Here is a nested critical section
|
|
|
|
rtems_interrupt_local_enable( nested_level );
|
|
}
|
|
|
|
// Maskable interrupts are still disabled
|
|
|
|
rtems_interrupt_local_enable( level );
|
|
}
|
|
|
|
.. rubric:: CONSTRAINTS:
|
|
|
|
The following constraints apply to this directive:
|
|
|
|
* The directive may be called from within any runtime context.
|
|
|
|
* The directive will not cause the calling task to be preempted.
|
|
|
|
.. Generated from spec:/rtems/intr/if/local-enable
|
|
|
|
.. raw:: latex
|
|
|
|
\clearpage
|
|
|
|
.. index:: rtems_interrupt_local_enable()
|
|
.. index:: enable interrupts
|
|
.. index:: restore interrupt level
|
|
|
|
.. _InterfaceRtemsInterruptLocalEnable:
|
|
|
|
rtems_interrupt_local_enable()
|
|
------------------------------
|
|
|
|
Restores the previous interrupt level on the current processor.
|
|
|
|
.. rubric:: CALLING SEQUENCE:
|
|
|
|
.. code-block:: c
|
|
|
|
void rtems_interrupt_local_enable( rtems_interrupt_level isr_cookie );
|
|
|
|
.. rubric:: PARAMETERS:
|
|
|
|
``isr_cookie``
|
|
This parameter is the previous interrupt level to restore. The value must
|
|
be obtained by a previous call to
|
|
:ref:`InterfaceRtemsInterruptLocalDisable`.
|
|
|
|
.. rubric:: DESCRIPTION:
|
|
|
|
This directive restores the interrupt level specified by ``isr_cookie`` on the
|
|
current processor.
|
|
|
|
.. rubric:: NOTES:
|
|
|
|
The ``isr_cookie`` parameter value must be obtained by a previous call to
|
|
:ref:`InterfaceRtemsInterruptLocalDisable`. Using an otherwise obtained value
|
|
is undefined behaviour.
|
|
|
|
This directive is unsuitable to enable particular interrupt sources, for
|
|
example in an interrupt controller.
|
|
|
|
.. rubric:: CONSTRAINTS:
|
|
|
|
The following constraints apply to this directive:
|
|
|
|
* The directive may be called from within any runtime context.
|
|
|
|
* The directive will not cause the calling task to be preempted.
|
|
|
|
* While at least one maskable interrupt is pending, when the directive enables
|
|
maskable interrupts, the pending interrupts are immediately serviced. The
|
|
interrupt service routines may unblock higher priority tasks which may
|
|
preempt the calling task.
|
|
|
|
.. Generated from spec:/rtems/intr/if/is-in-progress
|
|
|
|
.. raw:: latex
|
|
|
|
\clearpage
|
|
|
|
.. index:: rtems_interrupt_is_in_progress()
|
|
.. index:: is interrupt in progress
|
|
|
|
.. _InterfaceRtemsInterruptIsInProgress:
|
|
|
|
rtems_interrupt_is_in_progress()
|
|
--------------------------------
|
|
|
|
Checks if an ISR is in progress on the current processor.
|
|
|
|
.. rubric:: CALLING SEQUENCE:
|
|
|
|
.. code-block:: c
|
|
|
|
bool rtems_interrupt_is_in_progress( void );
|
|
|
|
.. rubric:: DESCRIPTION:
|
|
|
|
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.
|
|
|
|
.. rubric:: RETURN VALUES:
|
|
|
|
Returns true, if the current processor is currently servicing an interrupt,
|
|
otherwise false.
|
|
|
|
.. rubric:: CONSTRAINTS:
|
|
|
|
The following constraints apply to this directive:
|
|
|
|
* The directive may be called from within any runtime context.
|
|
|
|
* The directive will not cause the calling task to be preempted.
|
|
|
|
.. Generated from spec:/rtems/intr/if/lock-initialize
|
|
|
|
.. raw:: latex
|
|
|
|
\clearpage
|
|
|
|
.. index:: rtems_interrupt_lock_initialize()
|
|
|
|
.. _InterfaceRtemsInterruptLockInitialize:
|
|
|
|
rtems_interrupt_lock_initialize()
|
|
---------------------------------
|
|
|
|
Initializes the ISR lock.
|
|
|
|
.. rubric:: CALLING SEQUENCE:
|
|
|
|
.. code-block:: c
|
|
|
|
void rtems_interrupt_lock_initialize(
|
|
rtems_interrupt_lock *lock,
|
|
const char *name
|
|
);
|
|
|
|
.. rubric:: PARAMETERS:
|
|
|
|
``lock``
|
|
This parameter is the ISR lock to initialize.
|
|
|
|
``name``
|
|
This parameter is the ISR lock name. It shall be a string. The name is
|
|
only used where the system was built with profiling support enabled.
|
|
|
|
.. rubric:: NOTES:
|
|
|
|
ISR locks may also be statically defined by
|
|
:ref:`InterfaceRTEMSINTERRUPTLOCKDEFINE` or statically initialized by
|
|
:ref:`InterfaceRTEMSINTERRUPTLOCKINITIALIZER`.
|
|
|
|
.. Generated from spec:/rtems/intr/if/lock-destroy
|
|
|
|
.. raw:: latex
|
|
|
|
\clearpage
|
|
|
|
.. index:: rtems_interrupt_lock_destroy()
|
|
|
|
.. _InterfaceRtemsInterruptLockDestroy:
|
|
|
|
rtems_interrupt_lock_destroy()
|
|
------------------------------
|
|
|
|
Destroys the ISR lock.
|
|
|
|
.. rubric:: CALLING SEQUENCE:
|
|
|
|
.. code-block:: c
|
|
|
|
void rtems_interrupt_lock_destroy( rtems_interrupt_lock *lock );
|
|
|
|
.. rubric:: PARAMETERS:
|
|
|
|
``lock``
|
|
This parameter is the ISR lock to destroy.
|
|
|
|
.. rubric:: NOTES:
|
|
|
|
The lock must have been dynamically initialized by
|
|
:ref:`InterfaceRtemsInterruptLockInitialize`, statically defined by
|
|
:ref:`InterfaceRTEMSINTERRUPTLOCKDEFINE`, or statically initialized by
|
|
:ref:`InterfaceRTEMSINTERRUPTLOCKINITIALIZER`.
|
|
|
|
Concurrent lock use during the destruction or concurrent destruction leads to
|
|
unpredictable results.
|
|
|
|
.. rubric:: CONSTRAINTS:
|
|
|
|
The following constraints apply to this directive:
|
|
|
|
* The directive may be called from within any runtime context.
|
|
|
|
* The directive will not cause the calling task to be preempted.
|
|
|
|
.. Generated from spec:/rtems/intr/if/lock-acquire
|
|
|
|
.. raw:: latex
|
|
|
|
\clearpage
|
|
|
|
.. index:: rtems_interrupt_lock_acquire()
|
|
|
|
.. _InterfaceRtemsInterruptLockAcquire:
|
|
|
|
rtems_interrupt_lock_acquire()
|
|
------------------------------
|
|
|
|
Acquires the ISR lock.
|
|
|
|
.. rubric:: CALLING SEQUENCE:
|
|
|
|
.. code-block:: c
|
|
|
|
void rtems_interrupt_lock_acquire(
|
|
rtems_interrupt_lock *lock,
|
|
rtems_interrupt_lock_context *lock_context
|
|
);
|
|
|
|
.. rubric:: PARAMETERS:
|
|
|
|
``lock``
|
|
This parameter is the ISR lock to acquire.
|
|
|
|
``lock_context``
|
|
This parameter is the ISR lock context. This lock context shall be used to
|
|
release the lock by calling :ref:`InterfaceRtemsInterruptLockRelease`.
|
|
|
|
.. rubric:: DESCRIPTION:
|
|
|
|
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.
|
|
|
|
.. rubric:: NOTES:
|
|
|
|
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.
|
|
|
|
.. code-block:: c
|
|
:linenos:
|
|
|
|
#include <rtems.h>
|
|
|
|
void critical_section( rtems_interrupt_lock *lock )
|
|
{
|
|
rtems_interrupt_lock_context lock_context;
|
|
|
|
rtems_interrupt_lock_acquire( lock, &lock_context );
|
|
|
|
// Here is the critical section. Maskable interrupts are disabled.
|
|
// Where the system was built with SMP support enabled, this section
|
|
// is protected by an SMP lock.
|
|
|
|
rtems_interrupt_lock_release( lock, &lock_context );
|
|
}
|
|
|
|
.. rubric:: CONSTRAINTS:
|
|
|
|
The following constraints apply to this directive:
|
|
|
|
* The directive may be called from within any runtime context.
|
|
|
|
* The directive will not cause the calling task to be preempted.
|
|
|
|
.. Generated from spec:/rtems/intr/if/lock-release
|
|
|
|
.. raw:: latex
|
|
|
|
\clearpage
|
|
|
|
.. index:: rtems_interrupt_lock_release()
|
|
|
|
.. _InterfaceRtemsInterruptLockRelease:
|
|
|
|
rtems_interrupt_lock_release()
|
|
------------------------------
|
|
|
|
Releases the ISR lock.
|
|
|
|
.. rubric:: CALLING SEQUENCE:
|
|
|
|
.. code-block:: c
|
|
|
|
void rtems_interrupt_lock_release( rtems_interrupt_lock_context *lock );
|
|
|
|
.. rubric:: PARAMETERS:
|
|
|
|
``lock``
|
|
This parameter is the ISR lock to release.
|
|
|
|
``lock_context``
|
|
This parameter is the ISR lock context. This lock context shall have been
|
|
used to acquire the lock by calling
|
|
:ref:`InterfaceRtemsInterruptLockAcquire`.
|
|
|
|
.. rubric:: DESCRIPTION:
|
|
|
|
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.
|
|
|
|
.. rubric:: NOTES:
|
|
|
|
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.
|
|
|
|
.. rubric:: CONSTRAINTS:
|
|
|
|
The following constraints apply to this directive:
|
|
|
|
* The directive may be called from within any runtime context.
|
|
|
|
* The directive will not cause the calling task to be preempted.
|
|
|
|
* While at least one maskable interrupt is pending, when the directive enables
|
|
maskable interrupts, the pending interrupts are immediately serviced. The
|
|
interrupt service routines may unblock higher priority tasks which may
|
|
preempt the calling task.
|
|
|
|
.. Generated from spec:/rtems/intr/if/lock-acquire-isr
|
|
|
|
.. raw:: latex
|
|
|
|
\clearpage
|
|
|
|
.. index:: rtems_interrupt_lock_acquire_isr()
|
|
|
|
.. _InterfaceRtemsInterruptLockAcquireIsr:
|
|
|
|
rtems_interrupt_lock_acquire_isr()
|
|
----------------------------------
|
|
|
|
Acquires the ISR lock from within an ISR.
|
|
|
|
.. rubric:: CALLING SEQUENCE:
|
|
|
|
.. code-block:: c
|
|
|
|
void rtems_interrupt_lock_acquire_isr(
|
|
rtems_interrupt_lock *lock,
|
|
rtems_interrupt_lock_context *lock_context
|
|
);
|
|
|
|
.. rubric:: PARAMETERS:
|
|
|
|
``lock``
|
|
This parameter is the ISR lock to acquire within an ISR.
|
|
|
|
``lock_context``
|
|
This parameter is the ISR lock context. This lock context shall be used to
|
|
release the lock by calling :ref:`InterfaceRtemsInterruptLockReleaseIsr`.
|
|
|
|
.. rubric:: DESCRIPTION:
|
|
|
|
This directive acquires the ISR lock specified by ``lock`` using the lock
|
|
context provided by ``lock_context``. The interrupt level will remain
|
|
unchanged.
|
|
|
|
.. rubric:: NOTES:
|
|
|
|
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
|
|
:ref:`InterfaceRtemsInterruptLockAcquire` and
|
|
:ref:`InterfaceRtemsInterruptLockRelease`.
|
|
|
|
.. rubric:: CONSTRAINTS:
|
|
|
|
The following constraints apply to this directive:
|
|
|
|
* The directive may be called from within any runtime context.
|
|
|
|
* The directive will not cause the calling task to be preempted.
|
|
|
|
.. Generated from spec:/rtems/intr/if/lock-release-isr
|
|
|
|
.. raw:: latex
|
|
|
|
\clearpage
|
|
|
|
.. index:: rtems_interrupt_lock_release_isr()
|
|
|
|
.. _InterfaceRtemsInterruptLockReleaseIsr:
|
|
|
|
rtems_interrupt_lock_release_isr()
|
|
----------------------------------
|
|
|
|
Releases the ISR lock from within an ISR.
|
|
|
|
.. rubric:: CALLING SEQUENCE:
|
|
|
|
.. code-block:: c
|
|
|
|
void rtems_interrupt_lock_release_isr(
|
|
rtems_interrupt_lock *lock,
|
|
rtems_interrupt_lock_context *lock_context
|
|
);
|
|
|
|
.. rubric:: PARAMETERS:
|
|
|
|
``lock``
|
|
This parameter is the ISR lock to release within an ISR.
|
|
|
|
``lock_context``
|
|
This parameter is the ISR lock context. This lock context shall have been
|
|
used to acquire the lock by calling
|
|
:ref:`InterfaceRtemsInterruptLockAcquireIsr`.
|
|
|
|
.. rubric:: DESCRIPTION:
|
|
|
|
This directive releases the ISR lock specified by ``lock`` using the lock
|
|
context provided by ``lock_context``. The interrupt level will remain
|
|
unchanged.
|
|
|
|
.. rubric:: NOTES:
|
|
|
|
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.
|
|
|
|
.. rubric:: CONSTRAINTS:
|
|
|
|
The following constraints apply to this directive:
|
|
|
|
* The directive may be called from within any runtime context.
|
|
|
|
* The directive will not cause the calling task to be preempted.
|
|
|
|
.. Generated from spec:/rtems/intr/if/lock-isr-disable
|
|
|
|
.. raw:: latex
|
|
|
|
\clearpage
|
|
|
|
.. index:: rtems_interrupt_lock_interrupt_disable()
|
|
|
|
.. _InterfaceRtemsInterruptLockInterruptDisable:
|
|
|
|
rtems_interrupt_lock_interrupt_disable()
|
|
----------------------------------------
|
|
|
|
Disables maskable interrupts on the current processor.
|
|
|
|
.. rubric:: CALLING SEQUENCE:
|
|
|
|
.. code-block:: c
|
|
|
|
void rtems_interrupt_lock_interrupt_disable(
|
|
rtems_interrupt_lock_context *lock_context
|
|
);
|
|
|
|
.. rubric:: PARAMETERS:
|
|
|
|
``lock_context``
|
|
This parameter is the ISR lock context for an acquire and release pair.
|
|
|
|
.. rubric:: DESCRIPTION:
|
|
|
|
This directive disables maskable interrupts on the current processor and stores
|
|
the previous interrupt level in ``lock_context``.
|
|
|
|
.. rubric:: CONSTRAINTS:
|
|
|
|
The following constraints apply to this directive:
|
|
|
|
* The directive may be called from within any runtime context.
|
|
|
|
* The directive will not cause the calling task to be preempted.
|
|
|
|
.. Generated from spec:/rtems/intr/if/lock-declare
|
|
|
|
.. raw:: latex
|
|
|
|
\clearpage
|
|
|
|
.. index:: RTEMS_INTERRUPT_LOCK_DECLARE()
|
|
|
|
.. _InterfaceRTEMSINTERRUPTLOCKDECLARE:
|
|
|
|
RTEMS_INTERRUPT_LOCK_DECLARE()
|
|
------------------------------
|
|
|
|
Declares an ISR lock object.
|
|
|
|
.. rubric:: CALLING SEQUENCE:
|
|
|
|
.. code-block:: c
|
|
|
|
RTEMS_INTERRUPT_LOCK_DECLARE( specifier, designator );
|
|
|
|
.. rubric:: PARAMETERS:
|
|
|
|
``specifier``
|
|
This parameter is the storage-class specifier for the ISR lock to declare,
|
|
for example ``extern`` or ``static``.
|
|
|
|
``designator``
|
|
This parameter is the ISR lock object designator.
|
|
|
|
.. rubric:: NOTES:
|
|
|
|
Do not add a ";" after this macro.
|
|
|
|
.. Generated from spec:/rtems/intr/if/lock-define
|
|
|
|
.. raw:: latex
|
|
|
|
\clearpage
|
|
|
|
.. index:: RTEMS_INTERRUPT_LOCK_DEFINE()
|
|
|
|
.. _InterfaceRTEMSINTERRUPTLOCKDEFINE:
|
|
|
|
RTEMS_INTERRUPT_LOCK_DEFINE()
|
|
-----------------------------
|
|
|
|
Defines an ISR lock object.
|
|
|
|
.. rubric:: CALLING SEQUENCE:
|
|
|
|
.. code-block:: c
|
|
|
|
RTEMS_INTERRUPT_LOCK_DEFINE( specifier, designator, const char *name );
|
|
|
|
.. rubric:: PARAMETERS:
|
|
|
|
``specifier``
|
|
This parameter is the storage-class specifier for the ISR lock to declare,
|
|
for example ``extern`` or ``static``.
|
|
|
|
``designator``
|
|
This parameter is the ISR lock object designator.
|
|
|
|
``name``
|
|
This parameter is the ISR lock name. It shall be a string. The name is
|
|
only used where the system was built with profiling support enabled.
|
|
|
|
.. rubric:: NOTES:
|
|
|
|
Do not add a ";" after this macro.
|
|
|
|
ISR locks may also be dynamically initialized by
|
|
:ref:`InterfaceRtemsInterruptLockInitialize` or statically by
|
|
:ref:`InterfaceRTEMSINTERRUPTLOCKINITIALIZER`.
|
|
|
|
.. Generated from spec:/rtems/intr/if/lock-initializer
|
|
|
|
.. raw:: latex
|
|
|
|
\clearpage
|
|
|
|
.. index:: RTEMS_INTERRUPT_LOCK_INITIALIZER()
|
|
|
|
.. _InterfaceRTEMSINTERRUPTLOCKINITIALIZER:
|
|
|
|
RTEMS_INTERRUPT_LOCK_INITIALIZER()
|
|
----------------------------------
|
|
|
|
Statically initializes an ISR lock object.
|
|
|
|
.. rubric:: CALLING SEQUENCE:
|
|
|
|
.. code-block:: c
|
|
|
|
RTEMS_INTERRUPT_LOCK_INITIALIZER( const char *name );
|
|
|
|
.. rubric:: PARAMETERS:
|
|
|
|
``name``
|
|
This parameter is the ISR lock name. It shall be a string. The name is
|
|
only used where the system was built with profiling support enabled.
|
|
|
|
.. rubric:: NOTES:
|
|
|
|
ISR locks may also be dynamically initialized by
|
|
:ref:`InterfaceRtemsInterruptLockInitialize` or statically defined by
|
|
:ref:`InterfaceRTEMSINTERRUPTLOCKDEFINE`.
|
|
|
|
.. Generated from spec:/rtems/intr/if/lock-member
|
|
|
|
.. raw:: latex
|
|
|
|
\clearpage
|
|
|
|
.. index:: RTEMS_INTERRUPT_LOCK_MEMBER()
|
|
|
|
.. _InterfaceRTEMSINTERRUPTLOCKMEMBER:
|
|
|
|
RTEMS_INTERRUPT_LOCK_MEMBER()
|
|
-----------------------------
|
|
|
|
Defines an ISR lock member.
|
|
|
|
.. rubric:: CALLING SEQUENCE:
|
|
|
|
.. code-block:: c
|
|
|
|
RTEMS_INTERRUPT_LOCK_MEMBER( designator );
|
|
|
|
.. rubric:: PARAMETERS:
|
|
|
|
``designator``
|
|
This parameter is the ISR lock member designator.
|
|
|
|
.. rubric:: NOTES:
|
|
|
|
Do not add a ";" after this macro.
|
|
|
|
.. Generated from spec:/rtems/intr/if/lock-reference
|
|
|
|
.. raw:: latex
|
|
|
|
\clearpage
|
|
|
|
.. index:: RTEMS_INTERRUPT_LOCK_REFERENCE()
|
|
|
|
.. _InterfaceRTEMSINTERRUPTLOCKREFERENCE:
|
|
|
|
RTEMS_INTERRUPT_LOCK_REFERENCE()
|
|
--------------------------------
|
|
|
|
Defines an ISR lock object reference.
|
|
|
|
.. rubric:: CALLING SEQUENCE:
|
|
|
|
.. code-block:: c
|
|
|
|
RTEMS_INTERRUPT_LOCK_REFERENCE( designator, rtems_interrupt_lock *target );
|
|
|
|
.. rubric:: PARAMETERS:
|
|
|
|
``designator``
|
|
This parameter is the ISR lock reference designator.
|
|
|
|
``target``
|
|
This parameter is the target object to reference.
|
|
|
|
.. rubric:: NOTES:
|
|
|
|
Do not add a ";" after this macro.
|
|
|
|
.. Generated from spec:/rtems/intr/if/entry-initializer
|
|
|
|
.. raw:: latex
|
|
|
|
\clearpage
|
|
|
|
.. index:: RTEMS_INTERRUPT_ENTRY_INITIALIZER()
|
|
|
|
.. _InterfaceRTEMSINTERRUPTENTRYINITIALIZER:
|
|
|
|
RTEMS_INTERRUPT_ENTRY_INITIALIZER()
|
|
-----------------------------------
|
|
|
|
Statically initializes an interrupt entry object.
|
|
|
|
.. rubric:: CALLING SEQUENCE:
|
|
|
|
.. code-block:: c
|
|
|
|
RTEMS_INTERRUPT_ENTRY_INITIALIZER(
|
|
rtems_interrupt_handler routine,
|
|
void *arg,
|
|
const char *info
|
|
);
|
|
|
|
.. rubric:: PARAMETERS:
|
|
|
|
``routine``
|
|
This parameter is the interrupt handler routine for the entry.
|
|
|
|
``arg``
|
|
This parameter is the interrupt handler argument for the entry.
|
|
|
|
``info``
|
|
This parameter is the descriptive information for the entry.
|
|
|
|
.. rubric:: NOTES:
|
|
|
|
Alternatively, :ref:`InterfaceRtemsInterruptEntryInitialize` may be used to
|
|
dynamically initialize an interrupt entry.
|
|
|
|
.. Generated from spec:/rtems/intr/if/entry-initialize
|
|
|
|
.. raw:: latex
|
|
|
|
\clearpage
|
|
|
|
.. index:: rtems_interrupt_entry_initialize()
|
|
|
|
.. _InterfaceRtemsInterruptEntryInitialize:
|
|
|
|
rtems_interrupt_entry_initialize()
|
|
----------------------------------
|
|
|
|
Initializes the interrupt entry.
|
|
|
|
.. rubric:: CALLING SEQUENCE:
|
|
|
|
.. code-block:: c
|
|
|
|
void rtems_interrupt_entry_initialize(
|
|
rtems_interrupt_entry *entry,
|
|
rtems_interrupt_handler routine,
|
|
void *arg,
|
|
const char *info
|
|
);
|
|
|
|
.. rubric:: PARAMETERS:
|
|
|
|
``entry``
|
|
This parameter is the interrupt entry to initialize.
|
|
|
|
``routine``
|
|
This parameter is the interrupt handler routine for the entry.
|
|
|
|
``arg``
|
|
This parameter is the interrupt handler argument for the entry.
|
|
|
|
``info``
|
|
This parameter is the descriptive information for the entry.
|
|
|
|
.. rubric:: NOTES:
|
|
|
|
Alternatively, :ref:`InterfaceRTEMSINTERRUPTENTRYINITIALIZER` may be used to
|
|
statically initialize an interrupt entry.
|
|
|
|
.. rubric:: CONSTRAINTS:
|
|
|
|
The following constraints apply to this directive:
|
|
|
|
* The directive may be called from within any runtime context.
|
|
|
|
* The directive will not cause the calling task to be preempted.
|
|
|
|
.. Generated from spec:/rtems/intr/if/entry-install
|
|
|
|
.. raw:: latex
|
|
|
|
\clearpage
|
|
|
|
.. index:: rtems_interrupt_entry_install()
|
|
|
|
.. _InterfaceRtemsInterruptEntryInstall:
|
|
|
|
rtems_interrupt_entry_install()
|
|
-------------------------------
|
|
|
|
Installs the interrupt entry at the interrupt vector.
|
|
|
|
.. rubric:: CALLING SEQUENCE:
|
|
|
|
.. code-block:: c
|
|
|
|
rtems_status_code rtems_interrupt_entry_install(
|
|
rtems_vector_number vector,
|
|
rtems_option options,
|
|
rtems_interrupt_entry *entry
|
|
);
|
|
|
|
.. rubric:: PARAMETERS:
|
|
|
|
``vector``
|
|
This parameter is the interrupt vector number.
|
|
|
|
``options``
|
|
This parameter is the interrupt entry install option set.
|
|
|
|
``entry``
|
|
This parameter is the interrupt entry to install.
|
|
|
|
.. rubric:: DESCRIPTION:
|
|
|
|
One of the following mutually exclusive options
|
|
|
|
* :c:macro:`RTEMS_INTERRUPT_UNIQUE`, and
|
|
|
|
* :c:macro:`RTEMS_INTERRUPT_SHARED`
|
|
|
|
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 :c:macro:`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 :c:macro:`RTEMS_INTERRUPT_SHARED` is set, then multiple handlers
|
|
may be installed for the interrupt vector.
|
|
|
|
.. rubric:: RETURN VALUES:
|
|
|
|
:c:macro:`RTEMS_SUCCESSFUL`
|
|
The requested operation was successful.
|
|
|
|
:c:macro:`RTEMS_INVALID_ADDRESS`
|
|
The ``entry`` parameter was `NULL
|
|
<https://en.cppreference.com/w/c/types/NULL>`_.
|
|
|
|
:c:macro:`RTEMS_INCORRECT_STATE`
|
|
The service was not initialized.
|
|
|
|
:c:macro:`RTEMS_INVALID_ADDRESS`
|
|
The handler routine of the entry was `NULL
|
|
<https://en.cppreference.com/w/c/types/NULL>`_.
|
|
|
|
:c:macro:`RTEMS_INVALID_ID`
|
|
There was no interrupt vector associated with the number specified by
|
|
``vector``.
|
|
|
|
:c:macro:`RTEMS_CALLED_FROM_ISR`
|
|
The directive was called from within interrupt context.
|
|
|
|
:c:macro:`RTEMS_INVALID_NUMBER`
|
|
An option specified by ``options`` was not applicable.
|
|
|
|
:c:macro:`RTEMS_RESOURCE_IN_USE`
|
|
The :c:macro:`RTEMS_INTERRUPT_UNIQUE` option was set in ``entry`` and the
|
|
interrupt vector was already occupied by a handler.
|
|
|
|
:c:macro:`RTEMS_RESOURCE_IN_USE`
|
|
The :c:macro:`RTEMS_INTERRUPT_SHARED` option was set in ``entry`` and the
|
|
interrupt vector was already occupied by a unique handler.
|
|
|
|
:c:macro:`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.
|
|
|
|
.. rubric:: NOTES:
|
|
|
|
When the directive call was successful, the ownership of the interrupt entry
|
|
has been transferred from the caller to the interrupt service. An installed
|
|
interrupt entry may be removed from the interrupt service by calling
|
|
:ref:`InterfaceRtemsInterruptEntryRemove`.
|
|
|
|
.. rubric:: CONSTRAINTS:
|
|
|
|
The following constraints apply to this directive:
|
|
|
|
* The directive may be called from within device driver initialization context.
|
|
|
|
* The directive may be called from within task context.
|
|
|
|
* The directive may obtain and release the object allocator mutex. This may
|
|
cause the calling task to be preempted.
|
|
|
|
* The interrupt entry shall have been initialized by
|
|
:ref:`InterfaceRtemsInterruptEntryInitialize` or
|
|
:ref:`InterfaceRTEMSINTERRUPTENTRYINITIALIZER`.
|
|
|
|
.. Generated from spec:/rtems/intr/if/entry-remove
|
|
|
|
.. raw:: latex
|
|
|
|
\clearpage
|
|
|
|
.. index:: rtems_interrupt_entry_remove()
|
|
|
|
.. _InterfaceRtemsInterruptEntryRemove:
|
|
|
|
rtems_interrupt_entry_remove()
|
|
------------------------------
|
|
|
|
Removes the interrupt entry from the interrupt vector.
|
|
|
|
.. rubric:: CALLING SEQUENCE:
|
|
|
|
.. code-block:: c
|
|
|
|
rtems_status_code rtems_interrupt_entry_remove(
|
|
rtems_vector_number vector,
|
|
rtems_interrupt_entry *entry
|
|
);
|
|
|
|
.. rubric:: PARAMETERS:
|
|
|
|
``vector``
|
|
This parameter is the interrupt vector number.
|
|
|
|
``entry``
|
|
This parameter is the interrupt entry to remove.
|
|
|
|
.. rubric:: RETURN VALUES:
|
|
|
|
:c:macro:`RTEMS_SUCCESSFUL`
|
|
The requested operation was successful.
|
|
|
|
:c:macro:`RTEMS_INCORRECT_STATE`
|
|
The service was not initialized.
|
|
|
|
:c:macro:`RTEMS_INVALID_ADDRESS`
|
|
The ``entry`` parameter was `NULL
|
|
<https://en.cppreference.com/w/c/types/NULL>`_.
|
|
|
|
:c:macro:`RTEMS_INVALID_ID`
|
|
There was no interrupt vector associated with the number specified by
|
|
``vector``.
|
|
|
|
:c:macro:`RTEMS_CALLED_FROM_ISR`
|
|
The directive was called from within interrupt context.
|
|
|
|
:c:macro:`RTEMS_UNSATISFIED`
|
|
The entry specified by ``entry`` was not installed at the interrupt vector
|
|
specified by ``vector``.
|
|
|
|
.. rubric:: NOTES:
|
|
|
|
When the directive call was successful, the ownership of the interrupt entry
|
|
has been transferred from the interrupt service to the caller.
|
|
|
|
.. rubric:: CONSTRAINTS:
|
|
|
|
The following constraints apply to this directive:
|
|
|
|
* The directive may be called from within device driver initialization context.
|
|
|
|
* The directive may be called from within task context.
|
|
|
|
* The directive may obtain and release the object allocator mutex. This may
|
|
cause the calling task to be preempted.
|
|
|
|
* The interrupt entry shall have been installed by
|
|
:ref:`InterfaceRtemsInterruptEntryInstall`.
|
|
|
|
.. Generated from spec:/rtems/intr/if/handler-install
|
|
|
|
.. raw:: latex
|
|
|
|
\clearpage
|
|
|
|
.. index:: rtems_interrupt_handler_install()
|
|
|
|
.. _InterfaceRtemsInterruptHandlerInstall:
|
|
|
|
rtems_interrupt_handler_install()
|
|
---------------------------------
|
|
|
|
Installs the interrupt handler routine and argument at the interrupt vector.
|
|
|
|
.. rubric:: CALLING SEQUENCE:
|
|
|
|
.. code-block:: c
|
|
|
|
rtems_status_code rtems_interrupt_handler_install(
|
|
rtems_vector_number vector,
|
|
const char *info,
|
|
rtems_option options,
|
|
rtems_interrupt_handler routine,
|
|
void *arg
|
|
);
|
|
|
|
.. rubric:: PARAMETERS:
|
|
|
|
``vector``
|
|
This parameter is the interrupt vector number.
|
|
|
|
``info``
|
|
This parameter is the descriptive information of the interrupt handler to
|
|
install.
|
|
|
|
``options``
|
|
This parameter is the interrupt handler install option set.
|
|
|
|
``routine``
|
|
This parameter is the interrupt handler routine to install.
|
|
|
|
``arg``
|
|
This parameter is the interrupt handler argument to install.
|
|
|
|
.. rubric:: DESCRIPTION:
|
|
|
|
One of the following mutually exclusive options
|
|
|
|
* :c:macro:`RTEMS_INTERRUPT_UNIQUE`,
|
|
|
|
* :c:macro:`RTEMS_INTERRUPT_SHARED`, and
|
|
|
|
* :c:macro:`RTEMS_INTERRUPT_REPLACE`
|
|
|
|
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 :c:macro:`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 :c:macro:`RTEMS_INTERRUPT_SHARED` is set, then multiple handler
|
|
may be installed for the interrupt vector.
|
|
|
|
If the option :c:macro:`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.
|
|
|
|
.. rubric:: RETURN VALUES:
|
|
|
|
:c:macro:`RTEMS_SUCCESSFUL`
|
|
The requested operation was successful.
|
|
|
|
:c:macro:`RTEMS_INCORRECT_STATE`
|
|
The service was not initialized.
|
|
|
|
:c:macro:`RTEMS_INVALID_ADDRESS`
|
|
The ``routine`` parameter was `NULL
|
|
<https://en.cppreference.com/w/c/types/NULL>`_.
|
|
|
|
:c:macro:`RTEMS_INVALID_ID`
|
|
There was no interrupt vector associated with the number specified by
|
|
``vector``.
|
|
|
|
:c:macro:`RTEMS_CALLED_FROM_ISR`
|
|
The directive was called from within interrupt context.
|
|
|
|
:c:macro:`RTEMS_NO_MEMORY`
|
|
There was not enough memory available to allocate data structures to
|
|
install the handler.
|
|
|
|
:c:macro:`RTEMS_RESOURCE_IN_USE`
|
|
The :c:macro:`RTEMS_INTERRUPT_UNIQUE` option was set in ``options`` and the
|
|
interrupt vector was already occupied by a handler.
|
|
|
|
:c:macro:`RTEMS_RESOURCE_IN_USE`
|
|
The :c:macro:`RTEMS_INTERRUPT_SHARED` option was set in ``options`` and the
|
|
interrupt vector was already occupied by a unique handler.
|
|
|
|
:c:macro:`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``.
|
|
|
|
:c:macro:`RTEMS_UNSATISFIED`
|
|
The :c:macro:`RTEMS_INTERRUPT_REPLACE` option was set in ``options`` and no
|
|
handler to replace was installed.
|
|
|
|
.. rubric:: CONSTRAINTS:
|
|
|
|
The following constraints apply to this directive:
|
|
|
|
* The directive may be called from within device driver initialization context.
|
|
|
|
* The directive may be called from within task context.
|
|
|
|
* The directive may obtain and release the object allocator mutex. This may
|
|
cause the calling task to be preempted.
|
|
|
|
.. Generated from spec:/rtems/intr/if/handler-remove
|
|
|
|
.. raw:: latex
|
|
|
|
\clearpage
|
|
|
|
.. index:: rtems_interrupt_handler_remove()
|
|
|
|
.. _InterfaceRtemsInterruptHandlerRemove:
|
|
|
|
rtems_interrupt_handler_remove()
|
|
--------------------------------
|
|
|
|
Removes the interrupt handler routine and argument from the interrupt vector.
|
|
|
|
.. rubric:: CALLING SEQUENCE:
|
|
|
|
.. code-block:: c
|
|
|
|
rtems_status_code rtems_interrupt_handler_remove(
|
|
rtems_vector_number vector,
|
|
rtems_interrupt_handler routine,
|
|
void *arg
|
|
);
|
|
|
|
.. rubric:: PARAMETERS:
|
|
|
|
``vector``
|
|
This parameter is the interrupt vector number.
|
|
|
|
``routine``
|
|
This parameter is the interrupt handler routine to remove.
|
|
|
|
``arg``
|
|
This parameter is the interrupt handler argument to remove.
|
|
|
|
.. rubric:: RETURN VALUES:
|
|
|
|
:c:macro:`RTEMS_SUCCESSFUL`
|
|
The requested operation was successful.
|
|
|
|
:c:macro:`RTEMS_INCORRECT_STATE`
|
|
The service was not initialized.
|
|
|
|
:c:macro:`RTEMS_INVALID_ADDRESS`
|
|
The ``routine`` parameter was `NULL
|
|
<https://en.cppreference.com/w/c/types/NULL>`_.
|
|
|
|
:c:macro:`RTEMS_INVALID_ID`
|
|
There was no interrupt vector associated with the number specified by
|
|
``vector``.
|
|
|
|
:c:macro:`RTEMS_CALLED_FROM_ISR`
|
|
The directive was called from within interrupt context.
|
|
|
|
:c:macro:`RTEMS_UNSATISFIED`
|
|
There was no handler routine and argument pair installed specified by
|
|
``routine`` and ``arg``.
|
|
|
|
.. rubric:: CONSTRAINTS:
|
|
|
|
The following constraints apply to this directive:
|
|
|
|
* The directive may be called from within device driver initialization context.
|
|
|
|
* The directive may be called from within task context.
|
|
|
|
* The directive may obtain and release the object allocator mutex. This may
|
|
cause the calling task to be preempted.
|
|
|
|
.. Generated from spec:/rtems/intr/if/vector-is-enabled
|
|
|
|
.. raw:: latex
|
|
|
|
\clearpage
|
|
|
|
.. index:: rtems_interrupt_vector_is_enabled()
|
|
|
|
.. _InterfaceRtemsInterruptVectorIsEnabled:
|
|
|
|
rtems_interrupt_vector_is_enabled()
|
|
-----------------------------------
|
|
|
|
Checks if the interrupt vector is enabled.
|
|
|
|
.. rubric:: CALLING SEQUENCE:
|
|
|
|
.. code-block:: c
|
|
|
|
rtems_status_code rtems_interrupt_vector_is_enabled(
|
|
rtems_vector_number vector,
|
|
bool *enabled
|
|
);
|
|
|
|
.. rubric:: PARAMETERS:
|
|
|
|
``vector``
|
|
This parameter is the interrupt vector number.
|
|
|
|
``enabled``
|
|
This parameter 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
|
|
:c:macro:`true`, otherwise to :c:macro:`false`.
|
|
|
|
.. rubric:: DESCRIPTION:
|
|
|
|
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.
|
|
|
|
.. rubric:: RETURN VALUES:
|
|
|
|
:c:macro:`RTEMS_SUCCESSFUL`
|
|
The requested operation was successful.
|
|
|
|
:c:macro:`RTEMS_INVALID_ADDRESS`
|
|
The ``enabled`` parameter was `NULL
|
|
<https://en.cppreference.com/w/c/types/NULL>`_.
|
|
|
|
:c:macro:`RTEMS_INVALID_ID`
|
|
There was no interrupt vector associated with the number specified by
|
|
``vector``.
|
|
|
|
.. rubric:: NOTES:
|
|
|
|
Interrupt vectors may be enabled by :ref:`InterfaceRtemsInterruptVectorEnable`
|
|
and disabled by :ref:`InterfaceRtemsInterruptVectorDisable`.
|
|
|
|
.. rubric:: CONSTRAINTS:
|
|
|
|
The following constraints apply to this directive:
|
|
|
|
* The directive may be called from within interrupt context.
|
|
|
|
* The directive may be called from within device driver initialization context.
|
|
|
|
* The directive may be called from within task context.
|
|
|
|
* The directive will not cause the calling task to be preempted.
|
|
|
|
.. Generated from spec:/rtems/intr/if/vector-enable
|
|
|
|
.. raw:: latex
|
|
|
|
\clearpage
|
|
|
|
.. index:: rtems_interrupt_vector_enable()
|
|
|
|
.. _InterfaceRtemsInterruptVectorEnable:
|
|
|
|
rtems_interrupt_vector_enable()
|
|
-------------------------------
|
|
|
|
Enables the interrupt vector.
|
|
|
|
.. rubric:: CALLING SEQUENCE:
|
|
|
|
.. code-block:: c
|
|
|
|
rtems_status_code rtems_interrupt_vector_enable( rtems_vector_number vector );
|
|
|
|
.. rubric:: PARAMETERS:
|
|
|
|
``vector``
|
|
This parameter is the number of the interrupt vector to enable.
|
|
|
|
.. rubric:: DESCRIPTION:
|
|
|
|
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 :ref:`InterfaceRtemsInterruptRaise`,
|
|
:ref:`InterfaceRtemsInterruptRaiseOn`, external signals, or messages.
|
|
|
|
.. rubric:: RETURN VALUES:
|
|
|
|
:c:macro:`RTEMS_SUCCESSFUL`
|
|
The requested operation was successful.
|
|
|
|
:c:macro:`RTEMS_INVALID_ID`
|
|
There was no interrupt vector associated with the number specified by
|
|
``vector``.
|
|
|
|
:c:macro:`RTEMS_UNSATISFIED`
|
|
The request to enable the interrupt vector has not been satisfied.
|
|
|
|
.. rubric:: NOTES:
|
|
|
|
The :ref:`InterfaceRtemsInterruptGetAttributes` directive may be used to check
|
|
if an interrupt vector can be enabled. Interrupt vectors may be disabled by
|
|
:ref:`InterfaceRtemsInterruptVectorDisable`.
|
|
|
|
.. rubric:: CONSTRAINTS:
|
|
|
|
The following constraints apply to this directive:
|
|
|
|
* The directive may be called from within interrupt context.
|
|
|
|
* The directive may be called from within device driver initialization context.
|
|
|
|
* The directive may be called from within task context.
|
|
|
|
* The directive will not cause the calling task to be preempted.
|
|
|
|
.. Generated from spec:/rtems/intr/if/vector-disable
|
|
|
|
.. raw:: latex
|
|
|
|
\clearpage
|
|
|
|
.. index:: rtems_interrupt_vector_disable()
|
|
|
|
.. _InterfaceRtemsInterruptVectorDisable:
|
|
|
|
rtems_interrupt_vector_disable()
|
|
--------------------------------
|
|
|
|
Disables the interrupt vector.
|
|
|
|
.. rubric:: CALLING SEQUENCE:
|
|
|
|
.. code-block:: c
|
|
|
|
rtems_status_code rtems_interrupt_vector_disable( rtems_vector_number vector );
|
|
|
|
.. rubric:: PARAMETERS:
|
|
|
|
``vector``
|
|
This parameter is the number of the interrupt vector to disable.
|
|
|
|
.. rubric:: DESCRIPTION:
|
|
|
|
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.
|
|
|
|
.. rubric:: RETURN VALUES:
|
|
|
|
:c:macro:`RTEMS_SUCCESSFUL`
|
|
The requested operation was successful.
|
|
|
|
:c:macro:`RTEMS_INVALID_ID`
|
|
There was no interrupt vector associated with the number specified by
|
|
``vector``.
|
|
|
|
:c:macro:`RTEMS_UNSATISFIED`
|
|
The request to disable the interrupt vector has not been satisfied.
|
|
|
|
.. rubric:: NOTES:
|
|
|
|
The :ref:`InterfaceRtemsInterruptGetAttributes` directive may be used to check
|
|
if an interrupt vector can be disabled. Interrupt vectors may be enabled by
|
|
:ref:`InterfaceRtemsInterruptVectorEnable`. There may be targets on which some
|
|
interrupt vectors cannot be disabled, for example a hardware watchdog interrupt
|
|
or software generated interrupts.
|
|
|
|
.. rubric:: CONSTRAINTS:
|
|
|
|
The following constraints apply to this directive:
|
|
|
|
* The directive may be called from within interrupt context.
|
|
|
|
* The directive may be called from within device driver initialization context.
|
|
|
|
* The directive may be called from within task context.
|
|
|
|
* The directive will not cause the calling task to be preempted.
|
|
|
|
.. Generated from spec:/rtems/intr/if/is-pending
|
|
|
|
.. raw:: latex
|
|
|
|
\clearpage
|
|
|
|
.. index:: rtems_interrupt_is_pending()
|
|
|
|
.. _InterfaceRtemsInterruptIsPending:
|
|
|
|
rtems_interrupt_is_pending()
|
|
----------------------------
|
|
|
|
Checks if the interrupt is pending.
|
|
|
|
.. rubric:: CALLING SEQUENCE:
|
|
|
|
.. code-block:: c
|
|
|
|
rtems_status_code rtems_interrupt_is_pending(
|
|
rtems_vector_number vector,
|
|
bool *pending
|
|
);
|
|
|
|
.. rubric:: PARAMETERS:
|
|
|
|
``vector``
|
|
This parameter is the interrupt vector number.
|
|
|
|
``pending``
|
|
This parameter 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
|
|
:c:macro:`true`, otherwise to :c:macro:`false`.
|
|
|
|
.. rubric:: DESCRIPTION:
|
|
|
|
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.
|
|
|
|
.. rubric:: RETURN VALUES:
|
|
|
|
:c:macro:`RTEMS_SUCCESSFUL`
|
|
The requested operation was successful.
|
|
|
|
:c:macro:`RTEMS_INVALID_ADDRESS`
|
|
The ``pending`` parameter was `NULL
|
|
<https://en.cppreference.com/w/c/types/NULL>`_.
|
|
|
|
:c:macro:`RTEMS_INVALID_ID`
|
|
There was no interrupt vector associated with the number specified by
|
|
``vector``.
|
|
|
|
:c:macro:`RTEMS_UNSATISFIED`
|
|
The request to get the pending status has not been satisfied.
|
|
|
|
.. rubric:: NOTES:
|
|
|
|
Interrupts may be made pending by calling the
|
|
:ref:`InterfaceRtemsInterruptRaise` or :ref:`InterfaceRtemsInterruptRaiseOn`
|
|
directives or due to external signals or messages. The pending state may be
|
|
cleared by :ref:`InterfaceRtemsInterruptClear`.
|
|
|
|
.. rubric:: CONSTRAINTS:
|
|
|
|
The following constraints apply to this directive:
|
|
|
|
* The directive may be called from within interrupt context.
|
|
|
|
* The directive may be called from within device driver initialization context.
|
|
|
|
* The directive may be called from within task context.
|
|
|
|
* The directive will not cause the calling task to be preempted.
|
|
|
|
.. Generated from spec:/rtems/intr/if/raise
|
|
|
|
.. raw:: latex
|
|
|
|
\clearpage
|
|
|
|
.. index:: rtems_interrupt_raise()
|
|
|
|
.. _InterfaceRtemsInterruptRaise:
|
|
|
|
rtems_interrupt_raise()
|
|
-----------------------
|
|
|
|
Raises the interrupt vector.
|
|
|
|
.. rubric:: CALLING SEQUENCE:
|
|
|
|
.. code-block:: c
|
|
|
|
rtems_status_code rtems_interrupt_raise( rtems_vector_number vector );
|
|
|
|
.. rubric:: PARAMETERS:
|
|
|
|
``vector``
|
|
This parameter is the number of the interrupt vector to raise.
|
|
|
|
.. rubric:: RETURN VALUES:
|
|
|
|
:c:macro:`RTEMS_SUCCESSFUL`
|
|
The requested operation was successful.
|
|
|
|
:c:macro:`RTEMS_INVALID_ID`
|
|
There was no interrupt vector associated with the number specified by
|
|
``vector``.
|
|
|
|
:c:macro:`RTEMS_UNSATISFIED`
|
|
The request to raise the interrupt vector has not been satisfied.
|
|
|
|
.. rubric:: NOTES:
|
|
|
|
The :ref:`InterfaceRtemsInterruptGetAttributes` directive may be used to check
|
|
if an interrupt vector can be raised.
|
|
|
|
.. rubric:: CONSTRAINTS:
|
|
|
|
The following constraints apply to this directive:
|
|
|
|
* The directive may be called from within interrupt context.
|
|
|
|
* The directive may be called from within device driver initialization context.
|
|
|
|
* The directive may be called from within task context.
|
|
|
|
* The directive will not cause the calling task to be preempted.
|
|
|
|
.. Generated from spec:/rtems/intr/if/raise-on
|
|
|
|
.. raw:: latex
|
|
|
|
\clearpage
|
|
|
|
.. index:: rtems_interrupt_raise_on()
|
|
|
|
.. _InterfaceRtemsInterruptRaiseOn:
|
|
|
|
rtems_interrupt_raise_on()
|
|
--------------------------
|
|
|
|
Raises the interrupt vector on the processor.
|
|
|
|
.. rubric:: CALLING SEQUENCE:
|
|
|
|
.. code-block:: c
|
|
|
|
rtems_status_code rtems_interrupt_raise_on(
|
|
rtems_vector_number vector,
|
|
uint32_t cpu_index
|
|
);
|
|
|
|
.. rubric:: PARAMETERS:
|
|
|
|
``vector``
|
|
This parameter is the number of the interrupt vector to raise.
|
|
|
|
``cpu_index``
|
|
This parameter is the index of the target processor of the interrupt vector
|
|
to raise.
|
|
|
|
.. rubric:: RETURN VALUES:
|
|
|
|
:c:macro:`RTEMS_SUCCESSFUL`
|
|
The requested operation was successful.
|
|
|
|
:c:macro:`RTEMS_INVALID_ID`
|
|
There was no interrupt vector associated with the number specified by
|
|
``vector``.
|
|
|
|
:c:macro:`RTEMS_NOT_CONFIGURED`
|
|
The processor specified by ``cpu_index`` was not configured to be used by
|
|
the application.
|
|
|
|
:c:macro:`RTEMS_INCORRECT_STATE`
|
|
The processor specified by ``cpu_index`` was configured to be used by the
|
|
application, however, it was not online.
|
|
|
|
:c:macro:`RTEMS_UNSATISFIED`
|
|
The request to raise the interrupt vector has not been satisfied.
|
|
|
|
.. rubric:: NOTES:
|
|
|
|
The :ref:`InterfaceRtemsInterruptGetAttributes` directive may be used to check
|
|
if an interrupt vector can be raised on a processor.
|
|
|
|
.. rubric:: CONSTRAINTS:
|
|
|
|
The following constraints apply to this directive:
|
|
|
|
* The directive may be called from within interrupt context.
|
|
|
|
* The directive may be called from within device driver initialization context.
|
|
|
|
* The directive may be called from within task context.
|
|
|
|
* The directive will not cause the calling task to be preempted.
|
|
|
|
.. Generated from spec:/rtems/intr/if/clear
|
|
|
|
.. raw:: latex
|
|
|
|
\clearpage
|
|
|
|
.. index:: rtems_interrupt_clear()
|
|
|
|
.. _InterfaceRtemsInterruptClear:
|
|
|
|
rtems_interrupt_clear()
|
|
-----------------------
|
|
|
|
Clears the interrupt vector.
|
|
|
|
.. rubric:: CALLING SEQUENCE:
|
|
|
|
.. code-block:: c
|
|
|
|
rtems_status_code rtems_interrupt_clear( rtems_vector_number vector );
|
|
|
|
.. rubric:: PARAMETERS:
|
|
|
|
``vector``
|
|
This parameter is the number of the interrupt vector to clear.
|
|
|
|
.. rubric:: RETURN VALUES:
|
|
|
|
:c:macro:`RTEMS_SUCCESSFUL`
|
|
The requested operation was successful.
|
|
|
|
:c:macro:`RTEMS_INVALID_ID`
|
|
There was no interrupt vector associated with the number specified by
|
|
``vector``.
|
|
|
|
:c:macro:`RTEMS_UNSATISFIED`
|
|
The request to raise the interrupt vector has not been satisfied.
|
|
|
|
.. rubric:: NOTES:
|
|
|
|
The :ref:`InterfaceRtemsInterruptGetAttributes` directive may be used to check
|
|
if an interrupt vector can be cleared.
|
|
|
|
.. rubric:: CONSTRAINTS:
|
|
|
|
The following constraints apply to this directive:
|
|
|
|
* The directive may be called from within interrupt context.
|
|
|
|
* The directive may be called from within device driver initialization context.
|
|
|
|
* The directive may be called from within task context.
|
|
|
|
* The directive will not cause the calling task to be preempted.
|
|
|
|
.. Generated from spec:/rtems/intr/if/get-affinity
|
|
|
|
.. raw:: latex
|
|
|
|
\clearpage
|
|
|
|
.. index:: rtems_interrupt_get_affinity()
|
|
|
|
.. _InterfaceRtemsInterruptGetAffinity:
|
|
|
|
rtems_interrupt_get_affinity()
|
|
------------------------------
|
|
|
|
Gets the processor affinity set of the interrupt vector.
|
|
|
|
.. rubric:: CALLING SEQUENCE:
|
|
|
|
.. code-block:: c
|
|
|
|
rtems_status_code rtems_interrupt_get_affinity(
|
|
rtems_vector_number vector,
|
|
size_t affinity_size,
|
|
cpu_set_t *affinity
|
|
);
|
|
|
|
.. rubric:: PARAMETERS:
|
|
|
|
``vector``
|
|
This parameter is the interrupt vector number.
|
|
|
|
``affinity_size``
|
|
This parameter is the size of the processor set referenced by ``affinity``
|
|
in bytes.
|
|
|
|
``affinity``
|
|
This parameter is the pointer to a :c:type:`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.
|
|
|
|
.. rubric:: RETURN VALUES:
|
|
|
|
:c:macro:`RTEMS_SUCCESSFUL`
|
|
The requested operation was successful.
|
|
|
|
:c:macro:`RTEMS_INVALID_ADDRESS`
|
|
The ``affinity`` parameter was `NULL
|
|
<https://en.cppreference.com/w/c/types/NULL>`_.
|
|
|
|
:c:macro:`RTEMS_INVALID_ID`
|
|
There was no interrupt vector associated with the number specified by
|
|
``vector``.
|
|
|
|
:c:macro:`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.
|
|
|
|
.. rubric:: CONSTRAINTS:
|
|
|
|
The following constraints apply to this directive:
|
|
|
|
* The directive may be called from within interrupt context.
|
|
|
|
* The directive may be called from within device driver initialization context.
|
|
|
|
* The directive may be called from within task context.
|
|
|
|
* The directive will not cause the calling task to be preempted.
|
|
|
|
.. Generated from spec:/rtems/intr/if/set-affinity
|
|
|
|
.. raw:: latex
|
|
|
|
\clearpage
|
|
|
|
.. index:: rtems_interrupt_set_affinity()
|
|
|
|
.. _InterfaceRtemsInterruptSetAffinity:
|
|
|
|
rtems_interrupt_set_affinity()
|
|
------------------------------
|
|
|
|
Sets the processor affinity set of the interrupt vector.
|
|
|
|
.. rubric:: CALLING SEQUENCE:
|
|
|
|
.. code-block:: c
|
|
|
|
rtems_status_code rtems_interrupt_set_affinity(
|
|
rtems_vector_number vector,
|
|
size_t affinity_size,
|
|
const cpu_set_t *affinity
|
|
);
|
|
|
|
.. rubric:: PARAMETERS:
|
|
|
|
``vector``
|
|
This parameter is the interrupt vector number.
|
|
|
|
``affinity_size``
|
|
This parameter is the size of the processor set referenced by ``affinity``
|
|
in bytes.
|
|
|
|
``affinity``
|
|
This parameter is the pointer to a :c:type:`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.
|
|
|
|
.. rubric:: RETURN VALUES:
|
|
|
|
:c:macro:`RTEMS_SUCCESSFUL`
|
|
The requested operation was successful.
|
|
|
|
:c:macro:`RTEMS_INVALID_ADDRESS`
|
|
The ``affinity`` parameter was `NULL
|
|
<https://en.cppreference.com/w/c/types/NULL>`_.
|
|
|
|
:c:macro:`RTEMS_INVALID_ID`
|
|
There was no interrupt vector associated with the number specified by
|
|
``vector``.
|
|
|
|
:c:macro:`RTEMS_INVALID_NUMBER`
|
|
The referenced processor set was not a valid new processor affinity set for
|
|
the interrupt vector.
|
|
|
|
:c:macro:`RTEMS_UNSATISFIED`
|
|
The request to set the processor affinity of the interrupt vector has not
|
|
been satisfied.
|
|
|
|
.. rubric:: NOTES:
|
|
|
|
The :ref:`InterfaceRtemsInterruptGetAttributes` 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.
|
|
|
|
.. rubric:: CONSTRAINTS:
|
|
|
|
The following constraints apply to this directive:
|
|
|
|
* The directive may be called from within interrupt context.
|
|
|
|
* The directive may be called from within device driver initialization context.
|
|
|
|
* The directive may be called from within task context.
|
|
|
|
* The directive will not cause the calling task to be preempted.
|
|
|
|
.. Generated from spec:/rtems/intr/if/get-attributes
|
|
|
|
.. raw:: latex
|
|
|
|
\clearpage
|
|
|
|
.. index:: rtems_interrupt_get_attributes()
|
|
|
|
.. _InterfaceRtemsInterruptGetAttributes:
|
|
|
|
rtems_interrupt_get_attributes()
|
|
--------------------------------
|
|
|
|
Gets the attributes of the interrupt vector.
|
|
|
|
.. rubric:: CALLING SEQUENCE:
|
|
|
|
.. code-block:: c
|
|
|
|
rtems_status_code rtems_interrupt_get_attributes(
|
|
rtems_vector_number vector,
|
|
rtems_interrupt_attributes *attributes
|
|
);
|
|
|
|
.. rubric:: PARAMETERS:
|
|
|
|
``vector``
|
|
This parameter is the interrupt vector number.
|
|
|
|
``attributes``
|
|
This parameter is the pointer to an :c:type:`rtems_interrupt_attributes`
|
|
object. When the directive call is successful, the attributes of the
|
|
interrupt vector will be stored in this object.
|
|
|
|
.. rubric:: RETURN VALUES:
|
|
|
|
:c:macro:`RTEMS_SUCCESSFUL`
|
|
The requested operation was successful.
|
|
|
|
:c:macro:`RTEMS_INVALID_ADDRESS`
|
|
The ``attributes`` parameter was `NULL
|
|
<https://en.cppreference.com/w/c/types/NULL>`_.
|
|
|
|
:c:macro:`RTEMS_INVALID_ID`
|
|
There was no interrupt vector associated with the number specified by
|
|
``vector``.
|
|
|
|
.. rubric:: CONSTRAINTS:
|
|
|
|
The following constraints apply to this directive:
|
|
|
|
* The directive may be called from within interrupt context.
|
|
|
|
* The directive may be called from within device driver initialization context.
|
|
|
|
* The directive may be called from within task context.
|
|
|
|
* The directive will not cause the calling task to be preempted.
|
|
|
|
.. Generated from spec:/rtems/intr/if/handler-iterate
|
|
|
|
.. raw:: latex
|
|
|
|
\clearpage
|
|
|
|
.. index:: rtems_interrupt_handler_iterate()
|
|
|
|
.. _InterfaceRtemsInterruptHandlerIterate:
|
|
|
|
rtems_interrupt_handler_iterate()
|
|
---------------------------------
|
|
|
|
Iterates over all interrupt handler installed at the interrupt vector.
|
|
|
|
.. rubric:: CALLING SEQUENCE:
|
|
|
|
.. code-block:: c
|
|
|
|
rtems_status_code rtems_interrupt_handler_iterate(
|
|
rtems_vector_number vector,
|
|
rtems_interrupt_per_handler_routine routine,
|
|
void *arg
|
|
);
|
|
|
|
.. rubric:: PARAMETERS:
|
|
|
|
``vector``
|
|
This parameter is the interrupt vector number.
|
|
|
|
``routine``
|
|
This parameter is the visitor routine.
|
|
|
|
``arg``
|
|
This parameter is the visitor argument.
|
|
|
|
.. rubric:: DESCRIPTION:
|
|
|
|
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.
|
|
|
|
.. rubric:: RETURN VALUES:
|
|
|
|
:c:macro:`RTEMS_SUCCESSFUL`
|
|
The requested operation was successful.
|
|
|
|
:c:macro:`RTEMS_INCORRECT_STATE`
|
|
The service was not initialized.
|
|
|
|
:c:macro:`RTEMS_INVALID_ADDRESS`
|
|
The ``routine`` parameter was `NULL
|
|
<https://en.cppreference.com/w/c/types/NULL>`_.
|
|
|
|
:c:macro:`RTEMS_INVALID_ID`
|
|
There was no interrupt vector associated with the number specified by
|
|
``vector``.
|
|
|
|
:c:macro:`RTEMS_CALLED_FROM_ISR`
|
|
The directive was called from within interrupt context.
|
|
|
|
.. rubric:: NOTES:
|
|
|
|
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.
|
|
|
|
.. rubric:: CONSTRAINTS:
|
|
|
|
The following constraints apply to this directive:
|
|
|
|
* The directive may be called from within device driver initialization context.
|
|
|
|
* The directive may be called from within task context.
|
|
|
|
* The directive may obtain and release the object allocator mutex. This may
|
|
cause the calling task to be preempted.
|
|
|
|
.. Generated from spec:/rtems/intr/if/server-initialize
|
|
|
|
.. raw:: latex
|
|
|
|
\clearpage
|
|
|
|
.. index:: rtems_interrupt_server_initialize()
|
|
|
|
.. _InterfaceRtemsInterruptServerInitialize:
|
|
|
|
rtems_interrupt_server_initialize()
|
|
-----------------------------------
|
|
|
|
Initializes the interrupt server tasks.
|
|
|
|
.. rubric:: CALLING SEQUENCE:
|
|
|
|
.. code-block:: c
|
|
|
|
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
|
|
);
|
|
|
|
.. rubric:: PARAMETERS:
|
|
|
|
``priority``
|
|
This parameter is the initial :term:`task priority` of the created
|
|
interrupt servers.
|
|
|
|
``stack_size``
|
|
This parameter is the task stack size of the created interrupt servers.
|
|
|
|
``modes``
|
|
This parameter is the initial mode set of the created interrupt servers.
|
|
|
|
``attributes``
|
|
This parameter is the attribute set of the created interrupt servers.
|
|
|
|
``server_count``
|
|
This parameter is the pointer to an `uint32_t
|
|
<https://en.cppreference.com/w/c/types/integer>`_ object or `NULL
|
|
<https://en.cppreference.com/w/c/types/NULL>`_. When the pointer is not
|
|
equal to `NULL <https://en.cppreference.com/w/c/types/NULL>`_, the count of
|
|
successfully created interrupt servers is stored in this object regardless
|
|
of the return status.
|
|
|
|
.. rubric:: DESCRIPTION:
|
|
|
|
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
|
|
<https://en.cppreference.com/w/c/types/NULL>`_.
|
|
|
|
.. rubric:: RETURN VALUES:
|
|
|
|
:c:macro:`RTEMS_SUCCESSFUL`
|
|
The requested operation was successful.
|
|
|
|
:c:macro:`RTEMS_INCORRECT_STATE`
|
|
The interrupt servers were already initialized.
|
|
|
|
The directive uses :ref:`InterfaceRtemsTaskCreate`. If this directive fails,
|
|
then its error status will be returned.
|
|
|
|
.. rubric:: NOTES:
|
|
|
|
Interrupt handlers may be installed on an interrupt server with
|
|
:ref:`InterfaceRtemsInterruptServerHandlerInstall` and removed with
|
|
:ref:`InterfaceRtemsInterruptServerHandlerRemove` 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 :ref:`InterfaceRtemsInterruptServerDelete`.
|
|
|
|
.. rubric:: CONSTRAINTS:
|
|
|
|
The following constraints apply to this directive:
|
|
|
|
* The directive may be called from within device driver initialization context.
|
|
|
|
* The directive may be called from within task context.
|
|
|
|
* The directive may obtain and release the object allocator mutex. This may
|
|
cause the calling task to be preempted.
|
|
|
|
.. Generated from spec:/rtems/intr/if/server-create
|
|
|
|
.. raw:: latex
|
|
|
|
\clearpage
|
|
|
|
.. index:: rtems_interrupt_server_create()
|
|
|
|
.. _InterfaceRtemsInterruptServerCreate:
|
|
|
|
rtems_interrupt_server_create()
|
|
-------------------------------
|
|
|
|
Creates an interrupt server.
|
|
|
|
.. rubric:: CALLING SEQUENCE:
|
|
|
|
.. code-block:: c
|
|
|
|
rtems_status_code rtems_interrupt_server_create(
|
|
rtems_interrupt_server_control *control,
|
|
const rtems_interrupt_server_config *config,
|
|
uint32_t *server_index
|
|
);
|
|
|
|
.. rubric:: PARAMETERS:
|
|
|
|
``control``
|
|
This parameter is the pointer to an
|
|
:c:type:`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``
|
|
This parameter is the interrupt server configuration.
|
|
|
|
``server_index``
|
|
This parameter is the pointer to an `uint32_t
|
|
<https://en.cppreference.com/w/c/types/integer>`_ object. When the
|
|
directive call was successful, the index of the created interrupt server
|
|
will be stored in this object.
|
|
|
|
.. rubric:: RETURN VALUES:
|
|
|
|
:c:macro:`RTEMS_SUCCESSFUL`
|
|
The requested operation was successful.
|
|
|
|
The directive uses :ref:`InterfaceRtemsTaskCreate`. If this directive fails,
|
|
then its error status will be returned.
|
|
|
|
.. rubric:: NOTES:
|
|
|
|
See also :ref:`InterfaceRtemsInterruptServerInitialize` and
|
|
:ref:`InterfaceRtemsInterruptServerDelete`.
|
|
|
|
.. rubric:: CONSTRAINTS:
|
|
|
|
The following constraints apply to this directive:
|
|
|
|
* The directive may be called from within device driver initialization context.
|
|
|
|
* The directive may be called from within task context.
|
|
|
|
* The directive may obtain and release the object allocator mutex. This may
|
|
cause the calling task to be preempted.
|
|
|
|
.. Generated from spec:/rtems/intr/if/server-handler-install
|
|
|
|
.. raw:: latex
|
|
|
|
\clearpage
|
|
|
|
.. index:: rtems_interrupt_server_handler_install()
|
|
|
|
.. _InterfaceRtemsInterruptServerHandlerInstall:
|
|
|
|
rtems_interrupt_server_handler_install()
|
|
----------------------------------------
|
|
|
|
Installs the interrupt handler routine and argument at the interrupt vector on
|
|
the interrupt server.
|
|
|
|
.. rubric:: CALLING SEQUENCE:
|
|
|
|
.. code-block:: c
|
|
|
|
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
|
|
);
|
|
|
|
.. rubric:: PARAMETERS:
|
|
|
|
``server_index``
|
|
This parameter is the interrupt server index. The constant
|
|
:c:macro:`RTEMS_INTERRUPT_SERVER_DEFAULT` may be used to specify the
|
|
default interrupt server.
|
|
|
|
``vector``
|
|
This parameter is the interrupt vector number.
|
|
|
|
``info``
|
|
This parameter is the descriptive information of the interrupt handler to
|
|
install.
|
|
|
|
``options``
|
|
This parameter is the interrupt handler install option set.
|
|
|
|
``routine``
|
|
This parameter is the interrupt handler routine to install.
|
|
|
|
``arg``
|
|
This parameter is the interrupt handler argument to install.
|
|
|
|
.. rubric:: DESCRIPTION:
|
|
|
|
The handler routine specified by ``routine`` will be executed within the
|
|
context of the interrupt server task specified by ``server_index``.
|
|
|
|
.. rubric:: RETURN VALUES:
|
|
|
|
:c:macro:`RTEMS_SUCCESSFUL`
|
|
The requested operation was successful.
|
|
|
|
:c:macro:`RTEMS_INVALID_ID`
|
|
There was no interrupt server associated with the index specified by
|
|
``server_index``.
|
|
|
|
:c:macro:`RTEMS_CALLED_FROM_ISR`
|
|
The directive was called from within interrupt context.
|
|
|
|
:c:macro:`RTEMS_INVALID_ADDRESS`
|
|
The ``routine`` parameter was `NULL
|
|
<https://en.cppreference.com/w/c/types/NULL>`_.
|
|
|
|
:c:macro:`RTEMS_INVALID_ID`
|
|
There was no interrupt vector associated with the number specified by
|
|
``vector``.
|
|
|
|
:c:macro:`RTEMS_INVALID_NUMBER`
|
|
An option specified by ``info`` was not applicable.
|
|
|
|
:c:macro:`RTEMS_RESOURCE_IN_USE`
|
|
The :c:macro:`RTEMS_INTERRUPT_UNIQUE` option was set in ``info`` and the
|
|
interrupt vector was already occupied by a handler.
|
|
|
|
:c:macro:`RTEMS_RESOURCE_IN_USE`
|
|
The :c:macro:`RTEMS_INTERRUPT_SHARED` option was set in ``info`` and the
|
|
interrupt vector was already occupied by a unique handler.
|
|
|
|
:c:macro:`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``.
|
|
|
|
:c:macro:`RTEMS_UNSATISFIED`
|
|
The :c:macro:`RTEMS_INTERRUPT_REPLACE` option was set in ``info`` and no
|
|
handler to replace was installed.
|
|
|
|
.. rubric:: NOTES:
|
|
|
|
See also :ref:`InterfaceRtemsInterruptHandlerInstall`.
|
|
|
|
.. rubric:: CONSTRAINTS:
|
|
|
|
The following constraints apply to this directive:
|
|
|
|
* The directive may be called from within device driver initialization context.
|
|
|
|
* The directive may be called from within task context.
|
|
|
|
* The directive may obtain and release the object allocator mutex. This may
|
|
cause the calling task to be preempted.
|
|
|
|
.. Generated from spec:/rtems/intr/if/server-handler-remove
|
|
|
|
.. raw:: latex
|
|
|
|
\clearpage
|
|
|
|
.. index:: rtems_interrupt_server_handler_remove()
|
|
|
|
.. _InterfaceRtemsInterruptServerHandlerRemove:
|
|
|
|
rtems_interrupt_server_handler_remove()
|
|
---------------------------------------
|
|
|
|
Removes the interrupt handler routine and argument from the interrupt vector
|
|
and the interrupt server.
|
|
|
|
.. rubric:: CALLING SEQUENCE:
|
|
|
|
.. code-block:: c
|
|
|
|
rtems_status_code rtems_interrupt_server_handler_remove(
|
|
uint32_t server_index,
|
|
rtems_vector_number vector,
|
|
rtems_interrupt_handler routine,
|
|
void *arg
|
|
);
|
|
|
|
.. rubric:: PARAMETERS:
|
|
|
|
``server_index``
|
|
This parameter is the interrupt server index. The constant
|
|
:c:macro:`RTEMS_INTERRUPT_SERVER_DEFAULT` may be used to specify the
|
|
default interrupt server.
|
|
|
|
``vector``
|
|
This parameter is the interrupt vector number.
|
|
|
|
``routine``
|
|
This parameter is the interrupt handler routine to remove.
|
|
|
|
``arg``
|
|
This parameter is the interrupt handler argument to remove.
|
|
|
|
.. rubric:: RETURN VALUES:
|
|
|
|
:c:macro:`RTEMS_SUCCESSFUL`
|
|
The requested operation was successful.
|
|
|
|
:c:macro:`RTEMS_INVALID_ID`
|
|
There was no interrupt server associated with the index specified by
|
|
``server_index``.
|
|
|
|
:c:macro:`RTEMS_INVALID_ID`
|
|
There was no interrupt vector associated with the number specified by
|
|
``vector``.
|
|
|
|
:c:macro:`RTEMS_UNSATISFIED`
|
|
There was no handler routine and argument pair installed specified by
|
|
``routine`` and ``arg``.
|
|
|
|
.. rubric:: CONSTRAINTS:
|
|
|
|
The following constraints apply to this directive:
|
|
|
|
* The directive may be called from within task context.
|
|
|
|
* The directive may obtain and release the object allocator mutex. This may
|
|
cause the calling task to be preempted.
|
|
|
|
* The directive sends a request to another task and waits for a response. This
|
|
may cause the calling task to be blocked and unblocked.
|
|
|
|
* The directive shall not be called from within the context of an interrupt
|
|
server. Calling the directive from within the context of an interrupt server
|
|
is undefined behaviour.
|
|
|
|
.. Generated from spec:/rtems/intr/if/server-set-affinity
|
|
|
|
.. raw:: latex
|
|
|
|
\clearpage
|
|
|
|
.. index:: rtems_interrupt_server_set_affinity()
|
|
|
|
.. _InterfaceRtemsInterruptServerSetAffinity:
|
|
|
|
rtems_interrupt_server_set_affinity()
|
|
-------------------------------------
|
|
|
|
Sets the processor affinity of the interrupt server.
|
|
|
|
.. rubric:: CALLING SEQUENCE:
|
|
|
|
.. code-block:: c
|
|
|
|
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
|
|
);
|
|
|
|
.. rubric:: PARAMETERS:
|
|
|
|
``server_index``
|
|
This parameter is the interrupt server index. The constant
|
|
:c:macro:`RTEMS_INTERRUPT_SERVER_DEFAULT` may be used to specify the
|
|
default interrupt server.
|
|
|
|
``affinity_size``
|
|
This parameter is the size of the processor set referenced by ``affinity``
|
|
in bytes.
|
|
|
|
``affinity``
|
|
This parameter is the pointer to a :c:type:`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``
|
|
This parameter is the new :term:`real priority` for the interrupt server.
|
|
|
|
.. rubric:: RETURN VALUES:
|
|
|
|
:c:macro:`RTEMS_SUCCESSFUL`
|
|
The requested operation was successful.
|
|
|
|
:c:macro:`RTEMS_INVALID_ID`
|
|
There was no interrupt server associated with the index specified by
|
|
``server_index``.
|
|
|
|
The directive uses :ref:`InterfaceRtemsSchedulerIdentByProcessorSet`,
|
|
:ref:`InterfaceRtemsTaskSetScheduler`, and
|
|
:ref:`InterfaceRtemsTaskSetAffinity`. If one of these directive fails, then
|
|
its error status will be returned.
|
|
|
|
.. rubric:: NOTES:
|
|
|
|
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
|
|
:ref:`InterfaceRtemsInterruptServerSuspend`.
|
|
|
|
.. rubric:: CONSTRAINTS:
|
|
|
|
The following constraints apply to this directive:
|
|
|
|
* The directive may be called from within interrupt context.
|
|
|
|
* The directive may be called from within device driver initialization context.
|
|
|
|
* The directive may be called from within task context.
|
|
|
|
* The directive may change the processor affinity of a task. This may cause
|
|
the calling task to be preempted.
|
|
|
|
* The directive may change the priority of a task. This may cause the calling
|
|
task to be preempted.
|
|
|
|
.. Generated from spec:/rtems/intr/if/server-delete
|
|
|
|
.. raw:: latex
|
|
|
|
\clearpage
|
|
|
|
.. index:: rtems_interrupt_server_delete()
|
|
|
|
.. _InterfaceRtemsInterruptServerDelete:
|
|
|
|
rtems_interrupt_server_delete()
|
|
-------------------------------
|
|
|
|
Deletes the interrupt server.
|
|
|
|
.. rubric:: CALLING SEQUENCE:
|
|
|
|
.. code-block:: c
|
|
|
|
rtems_status_code rtems_interrupt_server_delete( uint32_t server_index );
|
|
|
|
.. rubric:: PARAMETERS:
|
|
|
|
``server_index``
|
|
This parameter is the index of the interrupt server to delete.
|
|
|
|
.. rubric:: RETURN VALUES:
|
|
|
|
:c:macro:`RTEMS_SUCCESSFUL`
|
|
The requested operation was successful.
|
|
|
|
:c:macro:`RTEMS_INVALID_ID`
|
|
There was no interrupt server associated with the server index specified by
|
|
``server_index``.
|
|
|
|
.. rubric:: NOTES:
|
|
|
|
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 :ref:`InterfaceRtemsInterruptServerCreate`.
|
|
|
|
.. rubric:: CONSTRAINTS:
|
|
|
|
The following constraints apply to this directive:
|
|
|
|
* The directive may be called from within task context.
|
|
|
|
* The directive shall not be called from within the context of an interrupt
|
|
server. Calling the directive from within the context of an interrupt server
|
|
is undefined behaviour.
|
|
|
|
* The directive sends a request to another task and waits for a response. This
|
|
may cause the calling task to be blocked and unblocked.
|
|
|
|
.. Generated from spec:/rtems/intr/if/server-suspend
|
|
|
|
.. raw:: latex
|
|
|
|
\clearpage
|
|
|
|
.. index:: rtems_interrupt_server_suspend()
|
|
|
|
.. _InterfaceRtemsInterruptServerSuspend:
|
|
|
|
rtems_interrupt_server_suspend()
|
|
--------------------------------
|
|
|
|
Suspends the interrupt server.
|
|
|
|
.. rubric:: CALLING SEQUENCE:
|
|
|
|
.. code-block:: c
|
|
|
|
rtems_status_code rtems_interrupt_server_suspend( uint32_t server_index );
|
|
|
|
.. rubric:: PARAMETERS:
|
|
|
|
``server_index``
|
|
This parameter is the index of the interrupt server to suspend. The
|
|
constant :c:macro:`RTEMS_INTERRUPT_SERVER_DEFAULT` may be used to specify
|
|
the default interrupt server.
|
|
|
|
.. rubric:: RETURN VALUES:
|
|
|
|
:c:macro:`RTEMS_SUCCESSFUL`
|
|
The requested operation was successful.
|
|
|
|
:c:macro:`RTEMS_INVALID_ID`
|
|
There was no interrupt server associated with the index specified by
|
|
``server_index``.
|
|
|
|
.. rubric:: NOTES:
|
|
|
|
Interrupt server may be resumed by :ref:`InterfaceRtemsInterruptServerResume`.
|
|
|
|
.. rubric:: CONSTRAINTS:
|
|
|
|
The following constraints apply to this directive:
|
|
|
|
* The directive may be called from within task context.
|
|
|
|
* The directive shall not be called from within the context of an interrupt
|
|
server. Calling the directive from within the context of an interrupt server
|
|
is undefined behaviour.
|
|
|
|
* The directive sends a request to another task and waits for a response. This
|
|
may cause the calling task to be blocked and unblocked.
|
|
|
|
.. Generated from spec:/rtems/intr/if/server-resume
|
|
|
|
.. raw:: latex
|
|
|
|
\clearpage
|
|
|
|
.. index:: rtems_interrupt_server_resume()
|
|
|
|
.. _InterfaceRtemsInterruptServerResume:
|
|
|
|
rtems_interrupt_server_resume()
|
|
-------------------------------
|
|
|
|
Resumes the interrupt server.
|
|
|
|
.. rubric:: CALLING SEQUENCE:
|
|
|
|
.. code-block:: c
|
|
|
|
rtems_status_code rtems_interrupt_server_resume( uint32_t server_index );
|
|
|
|
.. rubric:: PARAMETERS:
|
|
|
|
``server_index``
|
|
This parameter is the index of the interrupt server to resume. The
|
|
constant :c:macro:`RTEMS_INTERRUPT_SERVER_DEFAULT` may be used to specify
|
|
the default interrupt server.
|
|
|
|
.. rubric:: RETURN VALUES:
|
|
|
|
:c:macro:`RTEMS_SUCCESSFUL`
|
|
The requested operation was successful.
|
|
|
|
:c:macro:`RTEMS_INVALID_ID`
|
|
There was no interrupt server associated with the index specified by
|
|
``server_index``.
|
|
|
|
.. rubric:: NOTES:
|
|
|
|
Interrupt server may be suspended by
|
|
:ref:`InterfaceRtemsInterruptServerSuspend`.
|
|
|
|
.. rubric:: CONSTRAINTS:
|
|
|
|
The following constraints apply to this directive:
|
|
|
|
* The directive may be called from within task context.
|
|
|
|
* The directive shall not be called from within the context of an interrupt
|
|
server. Calling the directive from within the context of an interrupt server
|
|
is undefined behaviour.
|
|
|
|
* The directive sends a request to another task and waits for a response. This
|
|
may cause the calling task to be blocked and unblocked.
|
|
|
|
.. Generated from spec:/rtems/intr/if/server-move
|
|
|
|
.. raw:: latex
|
|
|
|
\clearpage
|
|
|
|
.. index:: rtems_interrupt_server_move()
|
|
|
|
.. _InterfaceRtemsInterruptServerMove:
|
|
|
|
rtems_interrupt_server_move()
|
|
-----------------------------
|
|
|
|
Moves the interrupt handlers installed at the interrupt vector and the source
|
|
interrupt server to the destination interrupt server.
|
|
|
|
.. rubric:: CALLING SEQUENCE:
|
|
|
|
.. code-block:: c
|
|
|
|
rtems_status_code rtems_interrupt_server_move(
|
|
uint32_t source_server_index,
|
|
rtems_vector_number vector,
|
|
uint32_t destination_server_index
|
|
);
|
|
|
|
.. rubric:: PARAMETERS:
|
|
|
|
``source_server_index``
|
|
This parameter is the index of the source interrupt server. The constant
|
|
:c:macro:`RTEMS_INTERRUPT_SERVER_DEFAULT` may be used to specify the
|
|
default interrupt server.
|
|
|
|
``vector``
|
|
This parameter is the interrupt vector number.
|
|
|
|
``destination_server_index``
|
|
This parameter is the index of the destination interrupt server. The
|
|
constant :c:macro:`RTEMS_INTERRUPT_SERVER_DEFAULT` may be used to specify
|
|
the default interrupt server.
|
|
|
|
.. rubric:: RETURN VALUES:
|
|
|
|
:c:macro:`RTEMS_SUCCESSFUL`
|
|
The requested operation was successful.
|
|
|
|
:c:macro:`RTEMS_INVALID_ID`
|
|
There was no interrupt server associated with the index specified by
|
|
``source_server_index``.
|
|
|
|
:c:macro:`RTEMS_INVALID_ID`
|
|
There was no interrupt server associated with the index specified by
|
|
``destination_server_index``.
|
|
|
|
:c:macro:`RTEMS_INVALID_ID`
|
|
There was no interrupt vector associated with the number specified by
|
|
``vector``.
|
|
|
|
.. rubric:: CONSTRAINTS:
|
|
|
|
The following constraints apply to this directive:
|
|
|
|
* The directive may be called from within task context.
|
|
|
|
* The directive shall not be called from within the context of an interrupt
|
|
server. Calling the directive from within the context of an interrupt server
|
|
is undefined behaviour.
|
|
|
|
* The directive sends a request to another task and waits for a response. This
|
|
may cause the calling task to be blocked and unblocked.
|
|
|
|
.. Generated from spec:/rtems/intr/if/server-handler-iterate
|
|
|
|
.. raw:: latex
|
|
|
|
\clearpage
|
|
|
|
.. index:: rtems_interrupt_server_handler_iterate()
|
|
|
|
.. _InterfaceRtemsInterruptServerHandlerIterate:
|
|
|
|
rtems_interrupt_server_handler_iterate()
|
|
----------------------------------------
|
|
|
|
Iterates over all interrupt handler installed at the interrupt vector and
|
|
interrupt server.
|
|
|
|
.. rubric:: CALLING SEQUENCE:
|
|
|
|
.. code-block:: c
|
|
|
|
rtems_status_code rtems_interrupt_server_handler_iterate(
|
|
uint32_t server_index,
|
|
rtems_vector_number vector,
|
|
rtems_interrupt_per_handler_routine routine,
|
|
void *arg
|
|
);
|
|
|
|
.. rubric:: PARAMETERS:
|
|
|
|
``server_index``
|
|
This parameter is the index of the interrupt server.
|
|
|
|
``vector``
|
|
This parameter is the interrupt vector number.
|
|
|
|
``routine``
|
|
This parameter is the visitor routine.
|
|
|
|
``arg``
|
|
This parameter is the visitor argument.
|
|
|
|
.. rubric:: DESCRIPTION:
|
|
|
|
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.
|
|
|
|
.. rubric:: RETURN VALUES:
|
|
|
|
:c:macro:`RTEMS_SUCCESSFUL`
|
|
The requested operation was successful.
|
|
|
|
:c:macro:`RTEMS_INVALID_ID`
|
|
There was no interrupt server associated with the index specified by
|
|
``server_index``.
|
|
|
|
:c:macro:`RTEMS_INVALID_ID`
|
|
There was no interrupt vector associated with the number specified by
|
|
``vector``.
|
|
|
|
.. rubric:: NOTES:
|
|
|
|
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.
|
|
|
|
.. rubric:: CONSTRAINTS:
|
|
|
|
The following constraints apply to this directive:
|
|
|
|
* The directive may be called from within device driver initialization context.
|
|
|
|
* The directive may be called from within task context.
|
|
|
|
* The directive may obtain and release the object allocator mutex. This may
|
|
cause the calling task to be preempted.
|
|
|
|
.. Generated from spec:/rtems/intr/if/server-entry-initialize
|
|
|
|
.. raw:: latex
|
|
|
|
\clearpage
|
|
|
|
.. index:: rtems_interrupt_server_entry_initialize()
|
|
|
|
.. _InterfaceRtemsInterruptServerEntryInitialize:
|
|
|
|
rtems_interrupt_server_entry_initialize()
|
|
-----------------------------------------
|
|
|
|
Initializes the interrupt server entry.
|
|
|
|
.. rubric:: CALLING SEQUENCE:
|
|
|
|
.. code-block:: c
|
|
|
|
rtems_status_code rtems_interrupt_server_entry_initialize(
|
|
uint32_t server_index,
|
|
rtems_interrupt_server_entry *entry
|
|
);
|
|
|
|
.. rubric:: PARAMETERS:
|
|
|
|
``server_index``
|
|
This parameter is the interrupt server index. The constant
|
|
:c:macro:`RTEMS_INTERRUPT_SERVER_DEFAULT` may be used to specify the
|
|
default interrupt server.
|
|
|
|
``entry``
|
|
This parameter is the interrupt server entry to initialize.
|
|
|
|
.. rubric:: RETURN VALUES:
|
|
|
|
:c:macro:`RTEMS_SUCCESSFUL`
|
|
The requested operation was successful.
|
|
|
|
:c:macro:`RTEMS_INVALID_ID`
|
|
There was no interrupt server associated with the index specified by
|
|
``server_index``.
|
|
|
|
.. rubric:: NOTES:
|
|
|
|
After initialization, the list of actions of the interrupt server entry is
|
|
empty. Actions may be prepended by
|
|
:ref:`InterfaceRtemsInterruptServerActionPrepend`. Interrupt server entries may
|
|
be moved to another interrupt vector with
|
|
:ref:`InterfaceRtemsInterruptServerEntryMove`. Server entries may be submitted
|
|
to get serviced by the interrupt server with
|
|
:ref:`InterfaceRtemsInterruptServerEntrySubmit`. Server entries may be
|
|
destroyed by :ref:`InterfaceRtemsInterruptServerEntryDestroy`.
|
|
|
|
.. rubric:: CONSTRAINTS:
|
|
|
|
The following constraints apply to this directive:
|
|
|
|
* The directive may be called from within device driver initialization context.
|
|
|
|
* The directive may be called from within task context.
|
|
|
|
* The directive may obtain and release the object allocator mutex. This may
|
|
cause the calling task to be preempted.
|
|
|
|
.. Generated from spec:/rtems/intr/if/server-action-prepend
|
|
|
|
.. raw:: latex
|
|
|
|
\clearpage
|
|
|
|
.. index:: rtems_interrupt_server_action_prepend()
|
|
|
|
.. _InterfaceRtemsInterruptServerActionPrepend:
|
|
|
|
rtems_interrupt_server_action_prepend()
|
|
---------------------------------------
|
|
|
|
Prepends the interrupt server action to the list of actions of the interrupt
|
|
server entry.
|
|
|
|
.. rubric:: CALLING SEQUENCE:
|
|
|
|
.. code-block:: c
|
|
|
|
void rtems_interrupt_server_action_prepend(
|
|
rtems_interrupt_server_entry *entry,
|
|
rtems_interrupt_server_action *action,
|
|
rtems_interrupt_handler routine,
|
|
void *arg
|
|
);
|
|
|
|
.. rubric:: PARAMETERS:
|
|
|
|
``entry``
|
|
This parameter is the interrupt server entry to prepend the interrupt
|
|
server action. It shall have been initialized via
|
|
:ref:`InterfaceRtemsInterruptServerEntryInitialize`.
|
|
|
|
``action``
|
|
This parameter is the interrupt server action to initialize and prepend to
|
|
the list of actions of the entry.
|
|
|
|
``routine``
|
|
This parameter is the interrupt handler routine to set in the action.
|
|
|
|
``arg``
|
|
This parameter is the interrupt handler argument to set in the action.
|
|
|
|
.. rubric:: NOTES:
|
|
|
|
No error checking is performed by the directive.
|
|
|
|
.. rubric:: CONSTRAINTS:
|
|
|
|
The following constraints apply to this directive:
|
|
|
|
* The directive may be called from within interrupt context.
|
|
|
|
* The directive may be called from within device driver initialization context.
|
|
|
|
* The directive may be called from within task context.
|
|
|
|
* The directive will not cause the calling task to be preempted.
|
|
|
|
* The interrupt server entry shall have been initialized by
|
|
:ref:`InterfaceRtemsInterruptServerEntryInitialize` and further optional
|
|
calls to :ref:`InterfaceRtemsInterruptServerActionPrepend`.
|
|
|
|
* The directive shall not be called concurrently with
|
|
:ref:`InterfaceRtemsInterruptServerActionPrepend` with the same interrupt
|
|
server entry. Calling the directive under this condition is undefined
|
|
behaviour.
|
|
|
|
* The directive shall not be called concurrently with
|
|
:ref:`InterfaceRtemsInterruptServerEntryMove` with the same interrupt server
|
|
entry. Calling the directive under this condition is undefined behaviour.
|
|
|
|
* The directive shall not be called concurrently with
|
|
:ref:`InterfaceRtemsInterruptServerEntrySubmit` with the same interrupt
|
|
server entry. Calling the directive under this condition is undefined
|
|
behaviour.
|
|
|
|
* The directive shall not be called while the interrupt server entry is pending
|
|
on or serviced by its current interrupt server. Calling the directive under
|
|
these conditions is undefined behaviour.
|
|
|
|
.. Generated from spec:/rtems/intr/if/server-entry-destroy
|
|
|
|
.. raw:: latex
|
|
|
|
\clearpage
|
|
|
|
.. index:: rtems_interrupt_server_entry_destroy()
|
|
|
|
.. _InterfaceRtemsInterruptServerEntryDestroy:
|
|
|
|
rtems_interrupt_server_entry_destroy()
|
|
--------------------------------------
|
|
|
|
Destroys the interrupt server entry.
|
|
|
|
.. rubric:: CALLING SEQUENCE:
|
|
|
|
.. code-block:: c
|
|
|
|
void rtems_interrupt_server_entry_destroy(
|
|
rtems_interrupt_server_entry *entry
|
|
);
|
|
|
|
.. rubric:: PARAMETERS:
|
|
|
|
``entry``
|
|
This parameter is the interrupt server entry to destroy.
|
|
|
|
.. rubric:: NOTES:
|
|
|
|
No error checking is performed by the directive.
|
|
|
|
.. rubric:: CONSTRAINTS:
|
|
|
|
The following constraints apply to this directive:
|
|
|
|
* The directive may be called from within task context.
|
|
|
|
* The directive shall not be called from within the context of an interrupt
|
|
server. Calling the directive from within the context of an interrupt server
|
|
is undefined behaviour.
|
|
|
|
* The directive sends a request to another task and waits for a response. This
|
|
may cause the calling task to be blocked and unblocked.
|
|
|
|
* The interrupt server entry shall have been initialized by
|
|
:ref:`InterfaceRtemsInterruptServerEntryInitialize` and further optional
|
|
calls to :ref:`InterfaceRtemsInterruptServerActionPrepend`.
|
|
|
|
.. Generated from spec:/rtems/intr/if/server-entry-submit
|
|
|
|
.. raw:: latex
|
|
|
|
\clearpage
|
|
|
|
.. index:: rtems_interrupt_server_entry_submit()
|
|
|
|
.. _InterfaceRtemsInterruptServerEntrySubmit:
|
|
|
|
rtems_interrupt_server_entry_submit()
|
|
-------------------------------------
|
|
|
|
Submits the interrupt server entry to be serviced by the interrupt server.
|
|
|
|
.. rubric:: CALLING SEQUENCE:
|
|
|
|
.. code-block:: c
|
|
|
|
void rtems_interrupt_server_entry_submit(
|
|
rtems_interrupt_server_entry *entry
|
|
);
|
|
|
|
.. rubric:: PARAMETERS:
|
|
|
|
``entry``
|
|
This parameter is the interrupt server entry to submit.
|
|
|
|
.. rubric:: DESCRIPTION:
|
|
|
|
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.
|
|
|
|
.. rubric:: NOTES:
|
|
|
|
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
|
|
:ref:`InterfaceRtemsInterruptServerEntryDestroy`.
|
|
|
|
.. rubric:: CONSTRAINTS:
|
|
|
|
The following constraints apply to this directive:
|
|
|
|
* The directive may be called from within interrupt context.
|
|
|
|
* The directive may be called from within device driver initialization context.
|
|
|
|
* The directive may be called from within task context.
|
|
|
|
* The directive may unblock a task. This may cause the calling task to be
|
|
preempted.
|
|
|
|
* The interrupt server entry shall have been initialized by
|
|
:ref:`InterfaceRtemsInterruptServerEntryInitialize` and further optional
|
|
calls to :ref:`InterfaceRtemsInterruptServerActionPrepend`.
|
|
|
|
* The directive shall not be called concurrently with
|
|
:ref:`InterfaceRtemsInterruptServerActionPrepend` with the same interrupt
|
|
server entry. Calling the directive under this condition is undefined
|
|
behaviour.
|
|
|
|
* The directive shall not be called concurrently with
|
|
:ref:`InterfaceRtemsInterruptServerEntryMove` with the same interrupt server
|
|
entry. Calling the directive under this condition is undefined behaviour.
|
|
|
|
.. Generated from spec:/rtems/intr/if/server-entry-move
|
|
|
|
.. raw:: latex
|
|
|
|
\clearpage
|
|
|
|
.. index:: rtems_interrupt_server_entry_move()
|
|
|
|
.. _InterfaceRtemsInterruptServerEntryMove:
|
|
|
|
rtems_interrupt_server_entry_move()
|
|
-----------------------------------
|
|
|
|
Moves the interrupt server entry to the interrupt server.
|
|
|
|
.. rubric:: CALLING SEQUENCE:
|
|
|
|
.. code-block:: c
|
|
|
|
rtems_status_code rtems_interrupt_server_entry_move(
|
|
rtems_interrupt_server_entry *entry,
|
|
uint32_t server_index
|
|
);
|
|
|
|
.. rubric:: PARAMETERS:
|
|
|
|
``entry``
|
|
This parameter is the interrupt server entry to move.
|
|
|
|
``server_index``
|
|
This parameter is the index of the destination interrupt server. The
|
|
constant :c:macro:`RTEMS_INTERRUPT_SERVER_DEFAULT` may be used to specify
|
|
the default interrupt server.
|
|
|
|
.. rubric:: RETURN VALUES:
|
|
|
|
:c:macro:`RTEMS_SUCCESSFUL`
|
|
The requested operation was successful.
|
|
|
|
:c:macro:`RTEMS_INVALID_ID`
|
|
There was no interrupt server associated with the index specified by
|
|
``server_index``.
|
|
|
|
.. rubric:: CONSTRAINTS:
|
|
|
|
The following constraints apply to this directive:
|
|
|
|
* The directive may be called from within device driver initialization context.
|
|
|
|
* The directive may be called from within task context.
|
|
|
|
* The directive may obtain and release the object allocator mutex. This may
|
|
cause the calling task to be preempted.
|
|
|
|
* The interrupt server entry shall have been initialized by
|
|
:ref:`InterfaceRtemsInterruptServerEntryInitialize` and further optional
|
|
calls to :ref:`InterfaceRtemsInterruptServerActionPrepend`.
|
|
|
|
* The directive shall not be called concurrently with
|
|
:ref:`InterfaceRtemsInterruptServerActionPrepend` with the same interrupt
|
|
server entry. Calling the directive under this condition is undefined
|
|
behaviour.
|
|
|
|
* The directive shall not be called concurrently with
|
|
:ref:`InterfaceRtemsInterruptServerEntryMove` with the same interrupt server
|
|
entry. Calling the directive under this condition is undefined behaviour.
|
|
|
|
* The directive shall not be called concurrently with
|
|
:ref:`InterfaceRtemsInterruptServerEntrySubmit` with the same interrupt
|
|
server entry. Calling the directive under this condition is undefined
|
|
behaviour.
|
|
|
|
* The directive shall not be called while the interrupt server entry is pending
|
|
on or serviced by its current interrupt server. Calling the directive under
|
|
these conditions is undefined behaviour.
|
|
|
|
.. Generated from spec:/rtems/intr/if/server-request-initialize
|
|
|
|
.. raw:: latex
|
|
|
|
\clearpage
|
|
|
|
.. index:: rtems_interrupt_server_request_initialize()
|
|
|
|
.. _InterfaceRtemsInterruptServerRequestInitialize:
|
|
|
|
rtems_interrupt_server_request_initialize()
|
|
-------------------------------------------
|
|
|
|
Initializes the interrupt server request.
|
|
|
|
.. rubric:: CALLING SEQUENCE:
|
|
|
|
.. code-block:: c
|
|
|
|
rtems_status_code rtems_interrupt_server_request_initialize(
|
|
uint32_t server_index,
|
|
rtems_interrupt_server_request *request,
|
|
rtems_interrupt_handler routine,
|
|
void *arg
|
|
);
|
|
|
|
.. rubric:: PARAMETERS:
|
|
|
|
``server_index``
|
|
This parameter is the interrupt server index. The constant
|
|
:c:macro:`RTEMS_INTERRUPT_SERVER_DEFAULT` may be used to specify the
|
|
default interrupt server.
|
|
|
|
``request``
|
|
This parameter is the interrupt server request to initialize.
|
|
|
|
``routine``
|
|
This parameter is the interrupt handler routine for the request action.
|
|
|
|
``arg``
|
|
This parameter is the interrupt handler argument for the request action.
|
|
|
|
.. rubric:: RETURN VALUES:
|
|
|
|
:c:macro:`RTEMS_SUCCESSFUL`
|
|
The requested operation was successful.
|
|
|
|
:c:macro:`RTEMS_INVALID_ID`
|
|
There was no interrupt server associated with the index specified by
|
|
``server_index``.
|
|
|
|
.. rubric:: NOTES:
|
|
|
|
An interrupt server requests consists of an interrupt server entry and exactly
|
|
one interrupt server action. The interrupt vector of the request may be
|
|
changed with :ref:`InterfaceRtemsInterruptServerRequestSetVector`. Interrupt
|
|
server requests may be submitted to get serviced by the interrupt server with
|
|
:ref:`InterfaceRtemsInterruptServerRequestSubmit`. Requests may be destroyed
|
|
by :ref:`InterfaceRtemsInterruptServerRequestDestroy`.
|
|
|
|
.. rubric:: CONSTRAINTS:
|
|
|
|
The following constraints apply to this directive:
|
|
|
|
* The directive may be called from within device driver initialization context.
|
|
|
|
* The directive may be called from within task context.
|
|
|
|
* The directive may obtain and release the object allocator mutex. This may
|
|
cause the calling task to be preempted.
|
|
|
|
.. Generated from spec:/rtems/intr/if/server-request-set-vector
|
|
|
|
.. raw:: latex
|
|
|
|
\clearpage
|
|
|
|
.. index:: rtems_interrupt_server_request_set_vector()
|
|
|
|
.. _InterfaceRtemsInterruptServerRequestSetVector:
|
|
|
|
rtems_interrupt_server_request_set_vector()
|
|
-------------------------------------------
|
|
|
|
Sets the interrupt vector in the interrupt server request.
|
|
|
|
.. rubric:: CALLING SEQUENCE:
|
|
|
|
.. code-block:: c
|
|
|
|
void rtems_interrupt_server_request_set_vector(
|
|
rtems_interrupt_server_request *request,
|
|
rtems_vector_number vector
|
|
);
|
|
|
|
.. rubric:: PARAMETERS:
|
|
|
|
``request``
|
|
This parameter is the interrupt server request to change.
|
|
|
|
``vector``
|
|
This parameter is the interrupt vector number to be used by the request.
|
|
|
|
.. rubric:: NOTES:
|
|
|
|
By default, the interrupt vector of an interrupt server request is set to a
|
|
special value which is outside the range of vectors supported by the interrupt
|
|
controller hardware.
|
|
|
|
Calls to :ref:`InterfaceRtemsInterruptServerRequestSubmit` will disable the
|
|
interrupt vector of the request. After processing of the request by the
|
|
interrupt server the interrupt vector will be enabled again.
|
|
|
|
.. rubric:: CONSTRAINTS:
|
|
|
|
The following constraints apply to this directive:
|
|
|
|
* The directive may be called from within interrupt context.
|
|
|
|
* The directive may be called from within device driver initialization context.
|
|
|
|
* The directive may be called from within task context.
|
|
|
|
* The directive will not cause the calling task to be preempted.
|
|
|
|
* The interrupt server request shall have been initialized by
|
|
:ref:`InterfaceRtemsInterruptServerRequestInitialize`.
|
|
|
|
* The directive shall not be called concurrently with
|
|
:ref:`InterfaceRtemsInterruptServerRequestSetVector` with the same interrupt
|
|
server request. Calling the directive under this condition is undefined
|
|
behaviour.
|
|
|
|
* The directive shall not be called concurrently with
|
|
:ref:`InterfaceRtemsInterruptServerRequestSubmit` with the same interrupt
|
|
server request. Calling the directive under this condition is undefined
|
|
behaviour.
|
|
|
|
* The directive shall not be called while the interrupt server entry is pending
|
|
on or serviced by its current interrupt server. Calling the directive under
|
|
these conditions is undefined behaviour.
|
|
|
|
.. Generated from spec:/rtems/intr/if/server-request-destroy
|
|
|
|
.. raw:: latex
|
|
|
|
\clearpage
|
|
|
|
.. index:: rtems_interrupt_server_request_destroy()
|
|
|
|
.. _InterfaceRtemsInterruptServerRequestDestroy:
|
|
|
|
rtems_interrupt_server_request_destroy()
|
|
----------------------------------------
|
|
|
|
Destroys the interrupt server request.
|
|
|
|
.. rubric:: CALLING SEQUENCE:
|
|
|
|
.. code-block:: c
|
|
|
|
void rtems_interrupt_server_request_destroy(
|
|
rtems_interrupt_server_request *request
|
|
);
|
|
|
|
.. rubric:: PARAMETERS:
|
|
|
|
``request``
|
|
This parameter is the interrupt server request to destroy.
|
|
|
|
.. rubric:: NOTES:
|
|
|
|
No error checking is performed by the directive.
|
|
|
|
.. rubric:: CONSTRAINTS:
|
|
|
|
The following constraints apply to this directive:
|
|
|
|
* The directive may be called from within task context.
|
|
|
|
* The directive shall not be called from within the context of an interrupt
|
|
server. Calling the directive from within the context of an interrupt server
|
|
is undefined behaviour.
|
|
|
|
* The directive sends a request to another task and waits for a response. This
|
|
may cause the calling task to be blocked and unblocked.
|
|
|
|
* The interrupt server request shall have been initialized by
|
|
:ref:`InterfaceRtemsInterruptServerRequestInitialize`.
|
|
|
|
.. Generated from spec:/rtems/intr/if/server-request-submit
|
|
|
|
.. raw:: latex
|
|
|
|
\clearpage
|
|
|
|
.. index:: rtems_interrupt_server_request_submit()
|
|
|
|
.. _InterfaceRtemsInterruptServerRequestSubmit:
|
|
|
|
rtems_interrupt_server_request_submit()
|
|
---------------------------------------
|
|
|
|
Submits the interrupt server request to be serviced by the interrupt server.
|
|
|
|
.. rubric:: CALLING SEQUENCE:
|
|
|
|
.. code-block:: c
|
|
|
|
void rtems_interrupt_server_request_submit(
|
|
rtems_interrupt_server_request *request
|
|
);
|
|
|
|
.. rubric:: PARAMETERS:
|
|
|
|
``request``
|
|
This parameter is the interrupt server request to submit.
|
|
|
|
.. rubric:: DESCRIPTION:
|
|
|
|
The directive appends the interrupt server entry of the request 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.
|
|
|
|
.. rubric:: NOTES:
|
|
|
|
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 request may be destroyed by
|
|
:ref:`InterfaceRtemsInterruptServerRequestDestroy`.
|
|
|
|
.. rubric:: CONSTRAINTS:
|
|
|
|
The following constraints apply to this directive:
|
|
|
|
* The directive may be called from within interrupt context.
|
|
|
|
* The directive may be called from within device driver initialization context.
|
|
|
|
* The directive may be called from within task context.
|
|
|
|
* The directive may unblock a task. This may cause the calling task to be
|
|
preempted.
|
|
|
|
* The interrupt server request shall have been initialized by
|
|
:ref:`InterfaceRtemsInterruptServerRequestInitialize`.
|
|
|
|
* The directive shall not be called concurrently with
|
|
:ref:`InterfaceRtemsInterruptServerRequestSetVector` with the same interrupt
|
|
server request. Calling the directive under this condition is undefined
|
|
behaviour.
|