summaryrefslogtreecommitdiffstats
path: root/c-user/partition/directives.rst
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2020-08-20 10:00:14 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2020-09-02 17:55:31 +0200
commita4119a9f1ce98f753ac6b9cfa0a5555f7c6a7c5e (patch)
treeb61ec6efe73cddce31651450c00f66bf9081274b /c-user/partition/directives.rst
parentc-user: Split up message manager (diff)
downloadrtems-docs-a4119a9f1ce98f753ac6b9cfa0a5555f7c6a7c5e.tar.bz2
c-user: Split up partition manager
This makes it easier to automatically generate parts of the manager documentation in the future. Update #3993.
Diffstat (limited to 'c-user/partition/directives.rst')
-rw-r--r--c-user/partition/directives.rst349
1 files changed, 349 insertions, 0 deletions
diff --git a/c-user/partition/directives.rst b/c-user/partition/directives.rst
new file mode 100644
index 0000000..f81c37f
--- /dev/null
+++ b/c-user/partition/directives.rst
@@ -0,0 +1,349 @@
+.. SPDX-License-Identifier: CC-BY-SA-4.0
+
+.. Copyright (C) 1988, 2008 On-Line Applications Research Corporation (OAR)
+
+Directives
+==========
+
+This section details the partition manager's directives. A subsection is
+dedicated to each of this manager's directives and describes the calling
+sequence, related constants, usage, and status codes.
+
+.. raw:: latex
+
+ \clearpage
+
+.. index:: create a partition
+.. index:: rtems_partition_create
+
+.. _rtems_partition_create:
+
+PARTITION_CREATE - Create a partition
+-------------------------------------
+
+CALLING SEQUENCE:
+ .. code-block:: c
+
+ rtems_status_code rtems_partition_create(
+ rtems_name name,
+ void *starting_address,
+ uintptr_t length,
+ size_t buffer_size,
+ rtems_attribute attribute_set,
+ rtems_id *id
+ );
+
+DIRECTIVE STATUS CODES:
+ .. list-table::
+ :class: rtems-table
+
+ * - ``RTEMS_SUCCESSFUL``
+ - partition created successfully
+ * - ``RTEMS_INVALID_NAME``
+ - invalid partition ``name``
+ * - ``RTEMS_TOO_MANY``
+ - too many partitions created
+ * - ``RTEMS_INVALID_ADDRESS``
+ - ``starting_address`` is not on a pointer size boundary
+ * - ``RTEMS_INVALID_ADDRESS``
+ - ``starting_address`` is NULL
+ * - ``RTEMS_INVALID_ADDRESS``
+ - ``id`` is NULL
+ * - ``RTEMS_INVALID_SIZE``
+ - ``length`` or ``buffer_size`` is 0
+ * - ``RTEMS_INVALID_SIZE``
+ - ``length`` is less than the ``buffer_size``
+ * - ``RTEMS_INVALID_SIZE``
+ - ``buffer_size`` is not an integral multiple of the pointer size
+ * - ``RTEMS_INVALID_SIZE``
+ - ``buffer_size`` is less than two times the pointer size
+ * - ``RTEMS_TOO_MANY``
+ - too many global objects
+
+DESCRIPTION:
+ This directive creates a partition of fixed size buffers from a physically
+ contiguous memory space which starts at starting_address and is length
+ bytes in size. Each allocated buffer is to be of ``buffer_size`` in bytes.
+ The assigned partition id is returned in ``id``. This partition id is used
+ to access the partition with other partition related directives. For
+ control and maintenance of the partition, RTEMS allocates a PTCB from the
+ local PTCB free pool and initializes it.
+
+NOTES:
+ This directive may cause the calling task to be preempted due to an
+ obtain and release of the object allocator mutex.
+
+ The partition buffer area specified by the ``starting_address`` must be
+ properly aligned. It must be possible to directly store target
+ architecture pointers and the also the user data. For example, if the user
+ data contains some long double or vector data types, the partition buffer
+ area and the buffer size must take the alignment of these types into
+ account which is usually larger than the pointer alignment. A cache line
+ alignment may be also a factor.
+
+ The ``buffer_size`` parameter must be an integral multiple of the pointer
+ size on the target architecture. Additionally, ``buffer_size`` must be
+ large enough to hold two pointers on the target architecture. This is
+ required for RTEMS to manage the buffers when they are free.
+
+ Memory from the partition is not used by RTEMS to store the Partition
+ Control Block.
+
+ The following partition attribute constants are defined by RTEMS:
+
+ .. list-table::
+ :class: rtems-table
+
+ * - ``RTEMS_LOCAL``
+ - local partition (default)
+ * - ``RTEMS_GLOBAL``
+ - global partition
+
+ The PTCB for a global partition is allocated on the local node. The memory
+ space used for the partition must reside in shared memory. Partitions
+ should not be made global unless remote tasks must interact with the
+ partition. This is to avoid the overhead incurred by the creation of a
+ global partition. When a global partition is created, the partition's name
+ and id must be transmitted to every node in the system for insertion in the
+ local copy of the global object table.
+
+ The total number of global objects, including partitions, is limited by the
+ maximum_global_objects field in the Configuration Table.
+
+EXAMPLE:
+ .. code-block:: c
+
+ #include <rtems.h>
+ #include <rtems/chain.h>
+
+ #include <assert.h>
+
+ typedef struct {
+ char less;
+ short more;
+ } item;
+
+ union {
+ item data;
+ rtems_chain_node node;
+ } items[ 13 ];
+
+ rtems_id create_partition(void)
+ {
+ rtems_id id;
+ rtems_status_code sc;
+
+ sc = rtems_partition_create(
+ rtems_build_name( 'P', 'A', 'R', 'T' ),
+ items,
+ sizeof( items ),
+ sizeof( items[ 0 ] ),
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &id
+ );
+ assert(sc == RTEMS_SUCCESSFUL);
+
+ return id;
+ }
+
+.. raw:: latex
+
+ \clearpage
+
+.. index:: get ID of a partition
+.. index:: obtain ID of a partition
+.. index:: rtems_partition_ident
+
+.. _rtems_partition_ident:
+
+PARTITION_IDENT - Get ID of a partition
+---------------------------------------
+
+CALLING SEQUENCE:
+ .. code-block:: c
+
+ rtems_status_code rtems_partition_ident(
+ rtems_name name,
+ uint32_t node,
+ rtems_id *id
+ );
+
+DIRECTIVE STATUS CODES:
+ .. list-table::
+ :class: rtems-table
+
+ * - ``RTEMS_SUCCESSFUL``
+ - partition identified successfully
+ * - ``RTEMS_INVALID_ADDRESS``
+ - ``id`` is NULL
+ * - ``RTEMS_INVALID_NAME``
+ - partition name not found
+ * - ``RTEMS_INVALID_NODE``
+ - invalid node id
+
+DESCRIPTION:
+ This directive obtains the partition id associated with the partition name.
+ If the partition name is not unique, then the partition id will match one
+ of the partitions with that name. However, this partition id is not
+ guaranteed to correspond to the desired partition. The partition id is
+ used with other partition related directives to access the partition.
+
+NOTES:
+ This directive will not cause the running task to be preempted.
+
+ If node is ``RTEMS_SEARCH_ALL_NODES``, all nodes are searched with the
+ local node being searched first. All other nodes are searched with the
+ lowest numbered node searched first.
+
+ If node is a valid node number which does not represent the local node,
+ then only the partitions exported by the designated node are searched.
+
+ This directive does not generate activity on remote nodes. It accesses
+ only the local copy of the global object table.
+
+.. raw:: latex
+
+ \clearpage
+
+.. index:: delete a partition
+.. index:: rtems_partition_delete
+
+.. _rtems_partition_delete:
+
+PARTITION_DELETE - Delete a partition
+-------------------------------------
+
+CALLING SEQUENCE:
+ .. code-block:: c
+
+ rtems_status_code rtems_partition_delete(
+ rtems_id id
+ );
+
+DIRECTIVE STATUS CODES:
+ .. list-table::
+ :class: rtems-table
+
+ * - ``RTEMS_SUCCESSFUL``
+ - partition deleted successfully
+ * - ``RTEMS_INVALID_ID``
+ - invalid partition id
+ * - ``RTEMS_RESOURCE_IN_USE``
+ - buffers still in use
+ * - ``RTEMS_ILLEGAL_ON_REMOTE_OBJECT``
+ - cannot delete remote partition
+
+DESCRIPTION:
+ This directive deletes the partition specified by id. The partition cannot
+ be deleted if any of its buffers are still allocated. The PTCB for the
+ deleted partition is reclaimed by RTEMS.
+
+NOTES:
+ This directive may cause the calling task to be preempted due to an
+ obtain and release of the object allocator mutex.
+
+ The calling task does not have to be the task that created the partition.
+ Any local task that knows the partition id can delete the partition.
+
+ When a global partition is deleted, the partition id must be transmitted to
+ every node in the system for deletion from the local copy of the global
+ object table.
+
+ The partition must reside on the local node, even if the partition was
+ created with the ``RTEMS_GLOBAL`` option.
+
+.. raw:: latex
+
+ \clearpage
+
+.. index:: get buffer from partition
+.. index:: obtain buffer from partition
+.. index:: rtems_partition_get_buffer
+
+.. _rtems_partition_get_buffer:
+
+PARTITION_GET_BUFFER - Get buffer from a partition
+--------------------------------------------------
+
+CALLING SEQUENCE:
+ .. code-block:: c
+
+ rtems_status_code rtems_partition_get_buffer(
+ rtems_id id,
+ void **buffer
+ );
+
+DIRECTIVE STATUS CODES:
+ .. list-table::
+ :class: rtems-table
+
+ * - ``RTEMS_SUCCESSFUL``
+ - buffer obtained successfully
+ * - ``RTEMS_INVALID_ADDRESS``
+ - ``buffer`` is NULL
+ * - ``RTEMS_INVALID_ID``
+ - invalid partition id
+ * - ``RTEMS_UNSATISFIED``
+ - all buffers are allocated
+
+DESCRIPTION:
+ This directive allows a buffer to be obtained from the partition specified
+ in id. The address of the allocated buffer is returned in buffer.
+
+NOTES:
+ This directive will not cause the running task to be preempted.
+
+ All buffers begin on a four byte boundary.
+
+ A task cannot wait on a buffer to become available.
+
+ Getting a buffer from a global partition which does not reside on the local
+ node will generate a request telling the remote node to allocate a buffer
+ from the specified partition.
+
+.. raw:: latex
+
+ \clearpage
+
+.. index:: return buffer to partitition
+.. index:: rtems_partition_return_buffer
+
+.. _rtems_partition_return_buffer:
+
+PARTITION_RETURN_BUFFER - Return buffer to a partition
+------------------------------------------------------
+
+CALLING SEQUENCE:
+ .. code-block:: c
+
+ rtems_status_code rtems_partition_return_buffer(
+ rtems_id id,
+ void *buffer
+ );
+
+DIRECTIVE STATUS CODES:
+ .. list-table::
+ :class: rtems-table
+
+ * - ``RTEMS_SUCCESSFUL``
+ - buffer returned successfully
+ * - ``RTEMS_INVALID_ADDRESS``
+ - ``buffer`` is NULL
+ * - ``RTEMS_INVALID_ID``
+ - invalid partition id
+ * - ``RTEMS_INVALID_ADDRESS``
+ - buffer address not in partition
+
+DESCRIPTION:
+ This directive returns the buffer specified by buffer to the partition
+ specified by id.
+
+NOTES:
+ This directive will not cause the running task to be preempted.
+
+ Returning a buffer to a global partition which does not reside on the local
+ node will generate a request telling the remote node to return the buffer
+ to the specified partition.
+
+ Returning a buffer multiple times is an error. It will corrupt the
+ internal state of the partition.