diff options
Diffstat (limited to 'c_user/dual_ports_memory_manager.rst')
-rw-r--r-- | c_user/dual_ports_memory_manager.rst | 273 |
1 files changed, 143 insertions, 130 deletions
diff --git a/c_user/dual_ports_memory_manager.rst b/c_user/dual_ports_memory_manager.rst index 5dd59a5..6088ece 100644 --- a/c_user/dual_ports_memory_manager.rst +++ b/c_user/dual_ports_memory_manager.rst @@ -1,3 +1,7 @@ +.. COMMENT: COPYRIGHT (c) 1988-2008. +.. COMMENT: On-Line Applications Research Corporation (OAR). +.. COMMENT: All rights reserved. + Dual-Ported Memory Manager ########################## @@ -7,20 +11,19 @@ Dual-Ported Memory Manager Introduction ============ -The dual-ported memory manager provides a mechanism -for converting addresses between internal and external -representations for multiple dual-ported memory areas (DPMA). -The directives provided by the dual-ported memory manager are: +The dual-ported memory manager provides a mechanism for converting addresses +between internal and external representations for multiple dual-ported memory +areas (DPMA). The directives provided by the dual-ported memory manager are: -- ``rtems_port_create`` - Create a port +- rtems_port_create_ - Create a port -- ``rtems_port_ident`` - Get ID of a port +- rtems_port_ident_ - Get ID of a port -- ``rtems_port_delete`` - Delete a port +- rtems_port_delete_ - Delete a port -- ``rtems_port_external_to_internal`` - Convert external to internal address +- rtems_port_external_to_internal_ - Convert external to internal address -- ``rtems_port_internal_to_external`` - Convert internal to external address +- rtems_port_internal_to_external_ - Convert internal to external address Background ========== @@ -28,21 +31,18 @@ Background .. index:: external addresses, definition .. index:: internal addresses, definition -A dual-ported memory area (DPMA) is an contiguous -block of RAM owned by a particular processor but which can be -accessed by other processors in the system. The owner accesses -the memory using internal addresses, while other processors must -use external addresses. RTEMS defines a port as a particular +A dual-ported memory area (DPMA) is an contiguous block of RAM owned by a +particular processor but which can be accessed by other processors in the +system. The owner accesses the memory using internal addresses, while other +processors must use external addresses. RTEMS defines a port as a particular mapping of internal and external addresses. -There are two system configurations in which -dual-ported memory is commonly found. The first is -tightly-coupled multiprocessor computer systems where the -dual-ported memory is shared between all nodes and is used for -inter-node communication. The second configuration is computer -systems with intelligent peripheral controllers. These -controllers typically utilize the DPMA for high-performance data -transfers. +There are two system configurations in which dual-ported memory is commonly +found. The first is tightly-coupled multiprocessor computer systems where the +dual-ported memory is shared between all nodes and is used for inter-node +communication. The second configuration is computer systems with intelligent +peripheral controllers. These controllers typically utilize the DPMA for +high-performance data transfers. Operations ========== @@ -50,54 +50,49 @@ Operations Creating a Port --------------- -The ``rtems_port_create`` directive creates a port into a DPMA -with the user-defined name. The user specifies the association -between internal and external representations for the port being -created. RTEMS allocates a Dual-Ported Memory Control Block -(DPCB) from the DPCB free list to maintain the newly created -DPMA. RTEMS also generates a unique dual-ported memory port ID -which is returned to the calling task. RTEMS does not -initialize the dual-ported memory area or access any memory -within it. +The ``rtems_port_create`` directive creates a port into a DPMA with the +user-defined name. The user specifies the association between internal and +external representations for the port being created. RTEMS allocates a +Dual-Ported Memory Control Block (DPCB) from the DPCB free list to maintain the +newly created DPMA. RTEMS also generates a unique dual-ported memory port ID +which is returned to the calling task. RTEMS does not initialize the +dual-ported memory area or access any memory within it. Obtaining Port IDs ------------------ -When a port is created, RTEMS generates a unique port -ID and assigns it to the created port until it is deleted. The -port ID may be obtained by either of two methods. First, as the -result of an invocation of the``rtems_port_create`` directive, the task -ID is stored in a user provided location. Second, the port ID -may be obtained later using the``rtems_port_ident`` directive. The port -ID is used by other dual-ported memory manager directives to -access this port. +When a port is created, RTEMS generates a unique port ID and assigns it to the +created port until it is deleted. The port ID may be obtained by either of two +methods. First, as the result of an invocation of the``rtems_port_create`` +directive, the task ID is stored in a user provided location. Second, the port +ID may be obtained later using the``rtems_port_ident`` directive. The port ID +is used by other dual-ported memory manager directives to access this port. Converting an Address --------------------- -The ``rtems_port_external_to_internal`` directive is used to -convert an address from external to internal representation for -the specified port. -The ``rtems_port_internal_to_external`` directive is -used to convert an address from internal to external -representation for the specified port. If an attempt is made to -convert an address which lies outside the specified DPMA, then -the address to be converted will be returned. +The ``rtems_port_external_to_internal`` directive is used to convert an address +from external to internal representation for the specified port. The +``rtems_port_internal_to_external`` directive is used to convert an address +from internal to external representation for the specified port. If an attempt +is made to convert an address which lies outside the specified DPMA, then the +address to be converted will be returned. Deleting a DPMA Port -------------------- -A port can be removed from the system and returned to -RTEMS with the ``rtems_port_delete`` directive. When a port is deleted, -its control block is returned to the DPCB free list. +A port can be removed from the system and returned to RTEMS with the +``rtems_port_delete`` directive. When a port is deleted, its control block is +returned to the DPCB free list. Directives ========== -This section details the dual-ported memory 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. +This section details the dual-ported memory 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. + +.. _rtems_port_create: PORT_CREATE - Create a port --------------------------- @@ -110,41 +105,48 @@ PORT_CREATE - Create a port .. code:: c rtems_status_code rtems_port_create( - rtems_name name, - void \*internal_start, - void \*external_start, - uint32_t length, - rtems_id \*id + rtems_name name, + void *internal_start, + void *external_start, + uint32_t length, + rtems_id *id ); **DIRECTIVE STATUS CODES:** -``RTEMS_SUCCESSFUL`` - port created successfully -``RTEMS_INVALID_NAME`` - invalid port name -``RTEMS_INVALID_ADDRESS`` - address not on four byte boundary -``RTEMS_INVALID_ADDRESS`` - ``id`` is NULL -``RTEMS_TOO_MANY`` - too many DP memory areas created +.. list-table:: + :class: rtems-table + + * - ``RTEMS_SUCCESSFUL`` + - port created successfully + * - ``RTEMS_INVALID_NAME`` + - invalid port name + * - ``RTEMS_INVALID_ADDRESS`` + - address not on four byte boundary + * - ``RTEMS_INVALID_ADDRESS`` + - ``id`` is NULL + * - ``RTEMS_TOO_MANY`` + - too many DP memory areas created **DESCRIPTION:** -This directive creates a port which resides on the -local node for the specified DPMA. The assigned port id is -returned in id. This port id is used as an argument to other -dual-ported memory manager directives to convert addresses +This directive creates a port which resides on the local node for the specified +DPMA. The assigned port id is returned in id. This port id is used as an +argument to other dual-ported memory manager directives to convert addresses within this DPMA. -For control and maintenance of the port, RTEMS -allocates and initializes an DPCB from the DPCB free pool. Thus -memory from the dual-ported memory area is not used to store the -DPCB. +For control and maintenance of the port, RTEMS allocates and initializes an +DPCB from the DPCB free pool. Thus memory from the dual-ported memory area is +not used to store the DPCB. **NOTES:** -The internal_address and external_address parameters -must be on a four byte boundary. +The internal_address and external_address parameters must be on a four byte +boundary. -This directive will not cause the calling task to be -preempted. +This directive will not cause the calling task to be preempted. + +.. _rtems_port_ident: PORT_IDENT - Get ID of a port ----------------------------- @@ -158,29 +160,35 @@ PORT_IDENT - Get ID of a port .. code:: c rtems_status_code rtems_port_ident( - rtems_name name, - rtems_id \*id + rtems_name name, + rtems_id \*id ); **DIRECTIVE STATUS CODES:** -``RTEMS_SUCCESSFUL`` - port identified successfully -``RTEMS_INVALID_ADDRESS`` - ``id`` is NULL -``RTEMS_INVALID_NAME`` - port name not found +.. list-table:: + :class: rtems-table + + * - ``RTEMS_SUCCESSFUL`` + - port identified successfully + * - ``RTEMS_INVALID_ADDRESS`` + - ``id`` is NULL + * - ``RTEMS_INVALID_NAME`` + - port name not found **DESCRIPTION:** -This directive obtains the port id associated with -the specified name to be acquired. If the port name is not -unique, then the port id will match one of the DPMAs with that -name. However, this port id is not guaranteed to correspond to -the desired DPMA. The port id is used to access this DPMA in +This directive obtains the port id associated with the specified name to be +acquired. If the port name is not unique, then the port id will match one of +the DPMAs with that name. However, this port id is not guaranteed to +correspond to the desired DPMA. The port id is used to access this DPMA in other dual-ported memory area related directives. **NOTES:** -This directive will not cause the running task to be -preempted. +This directive will not cause the running task to be preempted. + +.. _rtems_port_delete: PORT_DELETE - Delete a port --------------------------- @@ -193,28 +201,32 @@ PORT_DELETE - Delete a port .. code:: c rtems_status_code rtems_port_delete( - rtems_id id + rtems_id id ); **DIRECTIVE STATUS CODES:** -``RTEMS_SUCCESSFUL`` - port deleted successfully -``RTEMS_INVALID_ID`` - invalid port id +.. list-table:: + :class: rtems-table + + * - ``RTEMS_SUCCESSFUL`` + - port deleted successfully + * - ``RTEMS_INVALID_ID`` + - invalid port id **DESCRIPTION:** -This directive deletes the dual-ported memory area -specified by id. The DPCB for the deleted dual-ported memory -area is reclaimed by RTEMS. +This directive deletes the dual-ported memory area specified by id. The DPCB +for the deleted dual-ported memory area is reclaimed by RTEMS. **NOTES:** -This directive will not cause the calling task to be -preempted. +This directive will not cause the calling task to be preempted. + +The calling task does not have to be the task that created the port. Any local +task that knows the port id can delete the port. -The calling task does not have to be the task that -created the port. Any local task that knows the port id can -delete the port. +.. _rtems_port_external_to_internal: PORT_EXTERNAL_TO_INTERNAL - Convert external to internal address ---------------------------------------------------------------- @@ -227,30 +239,35 @@ PORT_EXTERNAL_TO_INTERNAL - Convert external to internal address .. code:: c rtems_status_code rtems_port_external_to_internal( - rtems_id id, - void \*external, - void \**internal + rtems_id id, + void *external, + void **internal ); **DIRECTIVE STATUS CODES:** -``RTEMS_INVALID_ADDRESS`` - ``internal`` is NULL -``RTEMS_SUCCESSFUL`` - successful conversion +.. list-table:: + :class: rtems-table + + * - ``RTEMS_INVALID_ADDRESS`` + - ``internal`` is NULL + * - ``RTEMS_SUCCESSFUL`` + - successful conversion **DESCRIPTION:** -This directive converts a dual-ported memory address -from external to internal representation for the specified port. -If the given external address is invalid for the specified -port, then the internal address is set to the given external -address. +This directive converts a dual-ported memory address from external to internal +representation for the specified port. If the given external address is +invalid for the specified port, then the internal address is set to the given +external address. **NOTES:** This directive is callable from an ISR. -This directive will not cause the calling task to be -preempted. +This directive will not cause the calling task to be preempted. + +.. _rtems_port_internal_to_external: PORT_INTERNAL_TO_EXTERNAL - Convert internal to external address ---------------------------------------------------------------- @@ -263,34 +280,30 @@ PORT_INTERNAL_TO_EXTERNAL - Convert internal to external address .. code:: c rtems_status_code rtems_port_internal_to_external( - rtems_id id, - void \*internal, - void \**external + rtems_id id, + void *internal, + void **external ); **DIRECTIVE STATUS CODES:** -``RTEMS_INVALID_ADDRESS`` - ``external`` is NULL -``RTEMS_SUCCESSFUL`` - successful conversion +.. list-table:: + :class: rtems-table + + * - ``RTEMS_INVALID_ADDRESS`` + - ``external`` is NULL + * - ``RTEMS_SUCCESSFUL`` + - successful conversion **DESCRIPTION:** -This directive converts a dual-ported memory address -from internal to external representation so that it can be -passed to owner of the DPMA represented by the specified port. -If the given internal address is an invalid dual-ported address, -then the external address is set to the given internal address. +This directive converts a dual-ported memory address from internal to external +representation so that it can be passed to owner of the DPMA represented by the +specified port. If the given internal address is an invalid dual-ported +address, then the external address is set to the given internal address. **NOTES:** This directive is callable from an ISR. -This directive will not cause the calling task to be -preempted. - -.. COMMENT: COPYRIGHT (c) 1988-2008. - -.. COMMENT: On-Line Applications Research Corporation (OAR). - -.. COMMENT: All rights reserved. - +This directive will not cause the calling task to be preempted. |