mirror of
https://git.rtems.org/rtems-docs/
synced 2025-07-02 06:20:16 +08:00
c-user: Split up barrier manager
This makes it easier to automatically generate parts of the manager documentation in the future. Update #3993.
This commit is contained in:
parent
ba6825ca63
commit
91f0f97698
68
c-user/barrier/background.rst
Normal file
68
c-user/barrier/background.rst
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
.. SPDX-License-Identifier: CC-BY-SA-4.0
|
||||||
|
|
||||||
|
.. Copyright (C) 1988, 2018 On-Line Applications Research Corporation (OAR)
|
||||||
|
|
||||||
|
Background
|
||||||
|
==========
|
||||||
|
|
||||||
|
A barrier can be viewed as a gate at which tasks wait until the gate is opened.
|
||||||
|
This has many analogies in the real world. Horses and other farm animals may
|
||||||
|
approach a closed gate and gather in front of it, waiting for someone to open
|
||||||
|
the gate so they may proceed. Similarly, ticket holders gather at the gates of
|
||||||
|
arenas before concerts or sporting events waiting for the arena personnel to
|
||||||
|
open the gates so they may enter.
|
||||||
|
|
||||||
|
Barriers are useful during application initialization. Each application task
|
||||||
|
can perform its local initialization before waiting for the application as a
|
||||||
|
whole to be initialized. Once all tasks have completed their independent
|
||||||
|
initializations, the "application ready" barrier can be released.
|
||||||
|
|
||||||
|
Automatic Versus Manual Barriers
|
||||||
|
--------------------------------
|
||||||
|
|
||||||
|
Just as with a real-world gate, barriers may be configured to be manually
|
||||||
|
opened or automatically opened. All tasks calling the ``rtems_barrier_wait``
|
||||||
|
directive will block until a controlling task invokes
|
||||||
|
the ``rtems_barrier_release`` directive.
|
||||||
|
|
||||||
|
Automatic barriers are created with a limit to the number of tasks which may
|
||||||
|
simultaneously block at the barrier. Once this limit is reached, all of the
|
||||||
|
tasks are released. For example, if the automatic limit is ten tasks, then the
|
||||||
|
first nine tasks calling the ``rtems_barrier_wait`` directive will block. When
|
||||||
|
the tenth task calls the ``rtems_barrier_wait`` directive, the nine blocked
|
||||||
|
tasks will be released and the tenth task returns to the caller without
|
||||||
|
blocking.
|
||||||
|
|
||||||
|
Building a Barrier Attribute Set
|
||||||
|
--------------------------------
|
||||||
|
|
||||||
|
In general, an attribute set is built by a bitwise OR of the desired attribute
|
||||||
|
components. The following table lists the set of valid barrier attributes:
|
||||||
|
|
||||||
|
``RTEMS_BARRIER_AUTOMATIC_RELEASE``
|
||||||
|
automatically release the barrier when the configured number of tasks are
|
||||||
|
blocked
|
||||||
|
|
||||||
|
``RTEMS_BARRIER_MANUAL_RELEASE``
|
||||||
|
only release the barrier when the application invokes the
|
||||||
|
``rtems_barrier_release`` directive. (default)
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
Barriers only support FIFO blocking order because all waiting tasks are
|
||||||
|
released as a set. Thus the released tasks will all become ready to execute
|
||||||
|
at the same time and compete for the processor based upon their priority.
|
||||||
|
|
||||||
|
Attribute values are specifically designed to be mutually exclusive, therefore
|
||||||
|
bitwise OR and addition operations are equivalent as long as each attribute
|
||||||
|
appears exactly once in the component list. An attribute listed as a default
|
||||||
|
is not required to appear in the attribute list, although it is a good
|
||||||
|
programming practice to specify default attributes. If all defaults are
|
||||||
|
desired, the attribute ``RTEMS_DEFAULT_ATTRIBUTES`` should be specified on this
|
||||||
|
call.
|
||||||
|
|
||||||
|
This example demonstrates the attribute_set parameter needed to create a
|
||||||
|
barrier with the automatic release policy. The ``attribute_set`` parameter
|
||||||
|
passed to the ``rtems_barrier_create`` directive will be
|
||||||
|
``RTEMS_BARRIER_AUTOMATIC_RELEASE``. In this case, the user must also specify
|
||||||
|
the ``maximum_waiters`` parameter.
|
@ -1,153 +1,6 @@
|
|||||||
.. SPDX-License-Identifier: CC-BY-SA-4.0
|
.. SPDX-License-Identifier: CC-BY-SA-4.0
|
||||||
|
|
||||||
.. Copyright (C) 1988, 2008, 2018.
|
.. Copyright (C) 1988, 2018 On-Line Applications Research Corporation (OAR)
|
||||||
.. COMMENT: On-Line Applications Research Corporation (OAR).
|
|
||||||
|
|
||||||
.. index:: barrier
|
|
||||||
|
|
||||||
.. _barrier_manager:
|
|
||||||
|
|
||||||
Barrier Manager
|
|
||||||
***************
|
|
||||||
|
|
||||||
Introduction
|
|
||||||
============
|
|
||||||
|
|
||||||
The barrier manager provides a unique synchronization capability which can be
|
|
||||||
used to have a set of tasks block and be unblocked as a set. The directives
|
|
||||||
provided by the barrier manager are:
|
|
||||||
|
|
||||||
- rtems_barrier_create_ - Create a barrier
|
|
||||||
|
|
||||||
- rtems_barrier_ident_ - Get ID of a barrier
|
|
||||||
|
|
||||||
- rtems_barrier_delete_ - Delete a barrier
|
|
||||||
|
|
||||||
- rtems_barrier_wait_ - Wait at a barrier
|
|
||||||
|
|
||||||
- rtems_barrier_release_ - Release a barrier
|
|
||||||
|
|
||||||
Background
|
|
||||||
==========
|
|
||||||
|
|
||||||
A barrier can be viewed as a gate at which tasks wait until the gate is opened.
|
|
||||||
This has many analogies in the real world. Horses and other farm animals may
|
|
||||||
approach a closed gate and gather in front of it, waiting for someone to open
|
|
||||||
the gate so they may proceed. Similarly, ticket holders gather at the gates of
|
|
||||||
arenas before concerts or sporting events waiting for the arena personnel to
|
|
||||||
open the gates so they may enter.
|
|
||||||
|
|
||||||
Barriers are useful during application initialization. Each application task
|
|
||||||
can perform its local initialization before waiting for the application as a
|
|
||||||
whole to be initialized. Once all tasks have completed their independent
|
|
||||||
initializations, the "application ready" barrier can be released.
|
|
||||||
|
|
||||||
Automatic Versus Manual Barriers
|
|
||||||
--------------------------------
|
|
||||||
|
|
||||||
Just as with a real-world gate, barriers may be configured to be manually
|
|
||||||
opened or automatically opened. All tasks calling the ``rtems_barrier_wait``
|
|
||||||
directive will block until a controlling task invokes
|
|
||||||
the ``rtems_barrier_release`` directive.
|
|
||||||
|
|
||||||
Automatic barriers are created with a limit to the number of tasks which may
|
|
||||||
simultaneously block at the barrier. Once this limit is reached, all of the
|
|
||||||
tasks are released. For example, if the automatic limit is ten tasks, then the
|
|
||||||
first nine tasks calling the ``rtems_barrier_wait`` directive will block. When
|
|
||||||
the tenth task calls the ``rtems_barrier_wait`` directive, the nine blocked
|
|
||||||
tasks will be released and the tenth task returns to the caller without
|
|
||||||
blocking.
|
|
||||||
|
|
||||||
Building a Barrier Attribute Set
|
|
||||||
--------------------------------
|
|
||||||
|
|
||||||
In general, an attribute set is built by a bitwise OR of the desired attribute
|
|
||||||
components. The following table lists the set of valid barrier attributes:
|
|
||||||
|
|
||||||
``RTEMS_BARRIER_AUTOMATIC_RELEASE``
|
|
||||||
automatically release the barrier when the configured number of tasks are
|
|
||||||
blocked
|
|
||||||
|
|
||||||
``RTEMS_BARRIER_MANUAL_RELEASE``
|
|
||||||
only release the barrier when the application invokes the
|
|
||||||
``rtems_barrier_release`` directive. (default)
|
|
||||||
|
|
||||||
.. note::
|
|
||||||
|
|
||||||
Barriers only support FIFO blocking order because all waiting tasks are
|
|
||||||
released as a set. Thus the released tasks will all become ready to execute
|
|
||||||
at the same time and compete for the processor based upon their priority.
|
|
||||||
|
|
||||||
Attribute values are specifically designed to be mutually exclusive, therefore
|
|
||||||
bitwise OR and addition operations are equivalent as long as each attribute
|
|
||||||
appears exactly once in the component list. An attribute listed as a default
|
|
||||||
is not required to appear in the attribute list, although it is a good
|
|
||||||
programming practice to specify default attributes. If all defaults are
|
|
||||||
desired, the attribute ``RTEMS_DEFAULT_ATTRIBUTES`` should be specified on this
|
|
||||||
call.
|
|
||||||
|
|
||||||
This example demonstrates the attribute_set parameter needed to create a
|
|
||||||
barrier with the automatic release policy. The ``attribute_set`` parameter
|
|
||||||
passed to the ``rtems_barrier_create`` directive will be
|
|
||||||
``RTEMS_BARRIER_AUTOMATIC_RELEASE``. In this case, the user must also specify
|
|
||||||
the ``maximum_waiters`` parameter.
|
|
||||||
|
|
||||||
Operations
|
|
||||||
==========
|
|
||||||
|
|
||||||
Creating a Barrier
|
|
||||||
------------------
|
|
||||||
|
|
||||||
The ``rtems_barrier_create`` directive creates a barrier with a user-specified
|
|
||||||
name and the desired attributes. RTEMS allocates a Barrier Control Block (BCB)
|
|
||||||
from the BCB free list. This data structure is used by RTEMS to manage the
|
|
||||||
newly created barrier. Also, a unique barrier ID is generated and returned to
|
|
||||||
the calling task.
|
|
||||||
|
|
||||||
Obtaining Barrier IDs
|
|
||||||
---------------------
|
|
||||||
|
|
||||||
When a barrier is created, RTEMS generates a unique barrier ID and assigns it
|
|
||||||
to the created barrier until it is deleted. The barrier ID may be obtained by
|
|
||||||
either of two methods. First, as the result of an invocation of the
|
|
||||||
``rtems_barrier_create`` directive, the barrier ID is stored in a user provided
|
|
||||||
location. Second, the barrier ID may be obtained later using the
|
|
||||||
``rtems_barrier_ident`` directive. The barrier ID is used by other barrier
|
|
||||||
manager directives to access this barrier.
|
|
||||||
|
|
||||||
Waiting at a Barrier
|
|
||||||
--------------------
|
|
||||||
|
|
||||||
The ``rtems_barrier_wait`` directive is used to wait at
|
|
||||||
the specified barrier. The task may wait forever for the barrier to be
|
|
||||||
released or it may specify a timeout. Specifying a timeout limits the interval
|
|
||||||
the task will wait before returning with an error status code.
|
|
||||||
|
|
||||||
If the barrier is configured as automatic and there are already one less then
|
|
||||||
the maximum number of waiters, then the call will unblock all tasks waiting at
|
|
||||||
the barrier and the caller will return immediately.
|
|
||||||
|
|
||||||
When the task does wait to acquire the barrier, then it is placed in the
|
|
||||||
barrier's task wait queue in FIFO order. All tasks waiting on a barrier are
|
|
||||||
returned an error code when the barrier is deleted.
|
|
||||||
|
|
||||||
Releasing a Barrier
|
|
||||||
-------------------
|
|
||||||
|
|
||||||
The ``rtems_barrier_release`` directive is used to release the specified
|
|
||||||
barrier. When the ``rtems_barrier_release`` is invoked, all tasks waiting at
|
|
||||||
the barrier are immediately made ready to execute and begin to compete for the
|
|
||||||
processor to execute.
|
|
||||||
|
|
||||||
Deleting a Barrier
|
|
||||||
------------------
|
|
||||||
|
|
||||||
The ``rtems_barrier_delete`` directive removes a barrier from the system and
|
|
||||||
frees its control block. A barrier can be deleted by any local task that knows
|
|
||||||
the barrier's ID. As a result of this directive, all tasks blocked waiting for
|
|
||||||
the barrier to be released, will be readied and returned a status code which
|
|
||||||
indicates that the barrier was deleted. Any subsequent references to the
|
|
||||||
barrier's name and ID are invalid.
|
|
||||||
|
|
||||||
Directives
|
Directives
|
||||||
==========
|
==========
|
||||||
@ -160,11 +13,11 @@ sequence, related constants, usage, and status codes.
|
|||||||
|
|
||||||
\clearpage
|
\clearpage
|
||||||
|
|
||||||
.. _rtems_barrier_create:
|
|
||||||
|
|
||||||
.. index:: create a barrier
|
.. index:: create a barrier
|
||||||
.. index:: rtems_barrier_create
|
.. index:: rtems_barrier_create
|
||||||
|
|
||||||
|
.. _rtems_barrier_create:
|
||||||
|
|
||||||
BARRIER_CREATE - Create a barrier
|
BARRIER_CREATE - Create a barrier
|
||||||
---------------------------------
|
---------------------------------
|
||||||
|
|
||||||
@ -237,12 +90,12 @@ NOTES:
|
|||||||
|
|
||||||
\clearpage
|
\clearpage
|
||||||
|
|
||||||
.. _rtems_barrier_ident:
|
|
||||||
|
|
||||||
.. index:: get ID of a barrier
|
.. index:: get ID of a barrier
|
||||||
.. index:: obtain ID of a barrier
|
.. index:: obtain ID of a barrier
|
||||||
.. index:: rtems_barrier_ident
|
.. index:: rtems_barrier_ident
|
||||||
|
|
||||||
|
.. _rtems_barrier_ident:
|
||||||
|
|
||||||
BARRIER_IDENT - Get ID of a barrier
|
BARRIER_IDENT - Get ID of a barrier
|
||||||
-----------------------------------
|
-----------------------------------
|
||||||
|
|
||||||
@ -279,11 +132,11 @@ NOTES:
|
|||||||
|
|
||||||
\clearpage
|
\clearpage
|
||||||
|
|
||||||
.. _rtems_barrier_delete:
|
|
||||||
|
|
||||||
.. index:: delete a barrier
|
.. index:: delete a barrier
|
||||||
.. index:: rtems_barrier_delete
|
.. index:: rtems_barrier_delete
|
||||||
|
|
||||||
|
.. _rtems_barrier_delete:
|
||||||
|
|
||||||
BARRIER_DELETE - Delete a barrier
|
BARRIER_DELETE - Delete a barrier
|
||||||
---------------------------------
|
---------------------------------
|
||||||
|
|
||||||
@ -325,11 +178,11 @@ NOTES:
|
|||||||
|
|
||||||
\clearpage
|
\clearpage
|
||||||
|
|
||||||
.. _rtems_barrier_wait:
|
|
||||||
|
|
||||||
.. index:: wait at a barrier
|
.. index:: wait at a barrier
|
||||||
.. index:: rtems_barrier_wait
|
.. index:: rtems_barrier_wait
|
||||||
|
|
||||||
|
.. _rtems_barrier_wait:
|
||||||
|
|
||||||
BARRIER_WAIT - Wait at a barrier
|
BARRIER_WAIT - Wait at a barrier
|
||||||
----------------------------------
|
----------------------------------
|
||||||
|
|
||||||
@ -378,11 +231,11 @@ NOTES:
|
|||||||
|
|
||||||
\clearpage
|
\clearpage
|
||||||
|
|
||||||
.. _rtems_barrier_release:
|
|
||||||
|
|
||||||
.. index:: release a barrier
|
.. index:: release a barrier
|
||||||
.. index:: rtems_barrier_release
|
.. index:: rtems_barrier_release
|
||||||
|
|
||||||
|
.. _rtems_barrier_release:
|
||||||
|
|
||||||
BARRIER_RELEASE - Release a barrier
|
BARRIER_RELEASE - Release a barrier
|
||||||
-----------------------------------
|
-----------------------------------
|
||||||
|
|
14
c-user/barrier/index.rst
Normal file
14
c-user/barrier/index.rst
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
.. SPDX-License-Identifier: CC-BY-SA-4.0
|
||||||
|
|
||||||
|
.. Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
|
||||||
|
|
||||||
|
.. index:: barrier
|
||||||
|
|
||||||
|
Barrier Manager
|
||||||
|
***************
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
|
||||||
|
introduction
|
||||||
|
background
|
||||||
|
directives
|
20
c-user/barrier/introduction.rst
Normal file
20
c-user/barrier/introduction.rst
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
.. SPDX-License-Identifier: CC-BY-SA-4.0
|
||||||
|
|
||||||
|
.. Copyright (C) 1988, 2018 On-Line Applications Research Corporation (OAR)
|
||||||
|
|
||||||
|
Introduction
|
||||||
|
============
|
||||||
|
|
||||||
|
The barrier manager provides a unique synchronization capability which can be
|
||||||
|
used to have a set of tasks block and be unblocked as a set. The directives
|
||||||
|
provided by the barrier manager are:
|
||||||
|
|
||||||
|
- :ref:`rtems_barrier_create`
|
||||||
|
|
||||||
|
- :ref:`rtems_barrier_ident`
|
||||||
|
|
||||||
|
- :ref:`rtems_barrier_delete`
|
||||||
|
|
||||||
|
- :ref:`rtems_barrier_wait`
|
||||||
|
|
||||||
|
- :ref:`rtems_barrier_release`
|
60
c-user/barrier/operations.rst
Normal file
60
c-user/barrier/operations.rst
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
.. SPDX-License-Identifier: CC-BY-SA-4.0
|
||||||
|
|
||||||
|
.. Copyright (C) 1988, 2018 On-Line Applications Research Corporation (OAR)
|
||||||
|
|
||||||
|
Operations
|
||||||
|
==========
|
||||||
|
|
||||||
|
Creating a Barrier
|
||||||
|
------------------
|
||||||
|
|
||||||
|
The ``rtems_barrier_create`` directive creates a barrier with a user-specified
|
||||||
|
name and the desired attributes. RTEMS allocates a Barrier Control Block (BCB)
|
||||||
|
from the BCB free list. This data structure is used by RTEMS to manage the
|
||||||
|
newly created barrier. Also, a unique barrier ID is generated and returned to
|
||||||
|
the calling task.
|
||||||
|
|
||||||
|
Obtaining Barrier IDs
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
When a barrier is created, RTEMS generates a unique barrier ID and assigns it
|
||||||
|
to the created barrier until it is deleted. The barrier ID may be obtained by
|
||||||
|
either of two methods. First, as the result of an invocation of the
|
||||||
|
``rtems_barrier_create`` directive, the barrier ID is stored in a user provided
|
||||||
|
location. Second, the barrier ID may be obtained later using the
|
||||||
|
``rtems_barrier_ident`` directive. The barrier ID is used by other barrier
|
||||||
|
manager directives to access this barrier.
|
||||||
|
|
||||||
|
Waiting at a Barrier
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
The ``rtems_barrier_wait`` directive is used to wait at
|
||||||
|
the specified barrier. The task may wait forever for the barrier to be
|
||||||
|
released or it may specify a timeout. Specifying a timeout limits the interval
|
||||||
|
the task will wait before returning with an error status code.
|
||||||
|
|
||||||
|
If the barrier is configured as automatic and there are already one less then
|
||||||
|
the maximum number of waiters, then the call will unblock all tasks waiting at
|
||||||
|
the barrier and the caller will return immediately.
|
||||||
|
|
||||||
|
When the task does wait to acquire the barrier, then it is placed in the
|
||||||
|
barrier's task wait queue in FIFO order. All tasks waiting on a barrier are
|
||||||
|
returned an error code when the barrier is deleted.
|
||||||
|
|
||||||
|
Releasing a Barrier
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
The ``rtems_barrier_release`` directive is used to release the specified
|
||||||
|
barrier. When the ``rtems_barrier_release`` is invoked, all tasks waiting at
|
||||||
|
the barrier are immediately made ready to execute and begin to compete for the
|
||||||
|
processor to execute.
|
||||||
|
|
||||||
|
Deleting a Barrier
|
||||||
|
------------------
|
||||||
|
|
||||||
|
The ``rtems_barrier_delete`` directive removes a barrier from the system and
|
||||||
|
frees its control block. A barrier can be deleted by any local task that knows
|
||||||
|
the barrier's ID. As a result of this directive, all tasks blocked waiting for
|
||||||
|
the barrier to be released, will be readied and returned a status code which
|
||||||
|
indicates that the barrier was deleted. Any subsequent references to the
|
||||||
|
barrier's name and ID are invalid.
|
@ -36,7 +36,7 @@ RTEMS Classic API Guide (|version|).
|
|||||||
timer_manager
|
timer_manager
|
||||||
rate_monotonic_manager
|
rate_monotonic_manager
|
||||||
semaphore/index
|
semaphore/index
|
||||||
barrier_manager
|
barrier/index
|
||||||
message_manager
|
message_manager
|
||||||
event/index
|
event/index
|
||||||
signal_manager
|
signal_manager
|
||||||
|
Loading…
x
Reference in New Issue
Block a user