summaryrefslogtreecommitdiffstats
path: root/doc/user/conf.t
diff options
context:
space:
mode:
Diffstat (limited to 'doc/user/conf.t')
-rw-r--r--doc/user/conf.t2028
1 files changed, 2028 insertions, 0 deletions
diff --git a/doc/user/conf.t b/doc/user/conf.t
new file mode 100644
index 0000000000..c931c4ea65
--- /dev/null
+++ b/doc/user/conf.t
@@ -0,0 +1,2028 @@
+@c COPYRIGHT (c) 1988-2002.
+@c On-Line Applications Research Corporation (OAR).
+@c All rights reserved.
+@c
+@c $Id$
+@c
+
+@c The following macros from confdefs.h have not been discussed in this
+@c chapter:
+@c
+@c CONFIGURE_NEWLIB_EXTENSION - probably not needed
+@c CONFIGURE_MALLOC_REGION - probably not needed
+@c CONFIGURE_LIBIO_SEMAPHORES - implicitly discussed.
+@c CONFIGURE_INTERRUPT_STACK_MEMORY
+@c CONFIGURE_GNAT_RTEMS
+@c CONFIGURE_GNAT_MUTEXES
+@c CONFIGURE_GNAT_KEYS
+@c CONFIGURE_MAXIMUM_ADA_TASKS
+@c CONFIGURE_MAXIMUM_FAKE_ADA_TASKS
+@c CONFIGURE_ADA_TASKS_STACK
+@c
+@c In addition, there should be examples of defining your own
+@c Device Driver Table, Init task table, etc.
+@c
+@c Regardless, this is a big step up. :)
+@c
+
+@chapter Configuring a System
+
+@section Introduction
+
+RTEMS must be configured for an application. This configuration
+information encompasses a variety of information including
+the length of each clock tick, the maximum number of each RTEMS
+object that can be created, the application initialization tasks,
+and the device drivers in the application. This information
+is placed in data structures that are given to RTEMS at
+system initialization time. This chapter details the
+format of these data structures as well as a simpler
+mechanism to automate the generation of these structures.
+
+
+@section Automatic Generation of System Configuration
+
+@cindex confdefs.h
+@findex confdefs.h
+
+RTEMS provides the @code{confdefs.h} C language header file that
+based on the setting of a variety of macros can automatically
+produce nearly all of the configuration tables required
+by an RTEMS application. Rather than building the individual
+tables by hand, the application simply specifies the values
+for the configuration parameters it wishes to set. In the following
+example, the configuration information for a simple system with
+a message queue and a time slice of 50 milliseconds is configured:
+
+@example
+@group
+#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_MICROSECONDS_PER_TICK 1000 /* 1 millisecond */
+#define CONFIGURE_TICKS_PER_TIMESLICE 50 /* 50 milliseconds */
+
+#define CONFIGURE_MAXIMUM_TASKS 4
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+@end group
+@end example
+
+This system will begin execution with the single initialization task
+named @code{Init}. It will be configured to have both a console
+device driver (for standard I/O) and a clock tick device driver.
+
+For each configuration parameter in the configuration tables, the
+macro corresponding to that field is discussed. Most systems
+can be easily configured using the @code{confdefs.h} mechanism.
+
+The @code{CONFIGURE_INIT} constant must be defined in order to
+make @code{confdefs.h} instantiate the configuration data
+structures. This can only be defined in one source file per
+application that includes @code{confdefs.h} or the symbol
+table will be instantiated multiple times and linking errors
+produced.
+
+The user should be aware that the defaults are intentionally
+set as low as possible. By default, no application resources
+are configured. The @code{confdefs.h} file ensures that
+at least one application tasks or thread is configured
+and that at least one of the initialization task/thread
+tables is configured.
+
+The @code{confdefs.h} file estimates the amount of
+memory required for the RTEMS Executive Workspace. This
+estimate is only as accurate as the information given
+to @code{confdefs.h} and may be either too high or too
+low for a variety of reasons. Some of the reasons that
+@code{confdefs.h} may reserve too much memory for RTEMS
+are:
+
+@itemize @bullet
+@item All tasks/threads are assumed to be floating point.
+@end itemize
+
+Conversely, there are many more reasons, the resource
+estimate could be too low:
+
+@itemize @bullet
+@item Task/thread stacks greater than minimum size must be
+accounted for explicitly by developer.
+
+@item Memory for messages is not included.
+
+@item Device driver requirements are not included.
+
+
+@item Network stack requirements are not included.
+
+@item Requirements for add-on libraries are not included.
+@end itemize
+
+In general, @code{confdefs.h} is very accurate when given
+enough information. However, it is quite easy to use
+a library and not account for its resources.
+
+The following subsection list all of the constants which can be
+set by the user.
+
+@subsection Library Support Definitions
+
+This section defines the file system and IO library
+related configuration parameters supported by
+@code{confdefs.h}.
+
+@itemize @bullet
+@findex CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS
+@item @code{CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS} is set to the
+maximum number of files that can be concurrently open. Libio requires
+a Classic RTEMS semaphore for each file descriptor as well as one
+global one. The default value is 3 file descriptors which is
+enough to support standard input, output, and error output.
+
+@findex CONFIGURE_TERMIOS_DISABLED
+@item @code{CONFIGURE_TERMIOS_DISABLED} is defined if the
+software implementing POSIX termios functionality is
+not going to be used by this application. By default, this
+is not defined and resources are reserved for the
+termios functionality.
+
+@findex CONFIGURE_NUMBER_OF_TERMIOS_PORTS
+@item @code{CONFIGURE_NUMBER_OF_TERMIOS_PORTS} is set to the
+number of ports using the termios functionality. Each
+concurrently active termios port requires resources.
+By default, this is set to 1 so a console port can be
+used.
+
+@findex CONFIGURE_HAS_OWN_MOUNT_TABLE
+@item @code{CONFIGURE_HAS_OWN_MOUNT_TABLE} is defined when the
+application provides their own filesystem mount table. The
+mount table is an array of @code{rtems_filesystem_mount_table_t}
+entries pointed to by the global variable
+@code{rtems_filesystem_mount_table}. The number of
+entries in this table is in an integer variable named
+@code{rtems_filesystem_mount_table_t}.
+
+@findex CONFIGURE_USE_IMFS_AS_BASE_FILESYSTEM
+@item @code{CONFIGURE_USE_IMFS_AS_BASE_FILESYSTEM} is defined
+if the application wishes to use the full functionality
+IMFS. By default, the miniIMFS is used. The miniIMFS
+is a minimal functionality subset of the In-Memory
+FileSystem (IMFS). The miniIMFS is comparable
+in functionality to the pseudo-filesystem name space provided
+before RTEMS release 4.5.0. The miniIMFS supports
+only directories and device nodes and is smaller in executable
+code size than the full IMFS.
+
+@findex STACK_CHECKER_ON
+@item @code{STACK_CHECKER_ON} is defined when the application
+wishes to enable run-time stack bounds checking. This increases
+the time required to create tasks as well as adding overhead
+to each context switch. By default, this is not defined and
+thus stack checking is disabled.
+
+@end itemize
+
+@subsection Basic System Information
+
+This section defines the general system configuration parameters supported by
+@code{confdefs.h}.
+
+@itemize @bullet
+@findex CONFIGURE_HAS_OWN_CONFIGURATION_TABLE
+@item @code{CONFIGURE_HAS_OWN_CONFIGURATION_TABLE} should only be defined
+if the application is providing their own complete set of configuration
+tables.
+
+@findex CONFIGURE_INTERRUPT_STACK_MEMORY
+@item @code{CONFIGURE_INTERRUPT_STACK_MEMORY} is set to the
+size of the interrupt stack. The interrupt stack size is
+usually set by the BSP but since this memory is allocated
+from the RTEMS Ram Workspace, it must be accounted for. The
+default for this field is RTEMS_MINIMUM_STACK_SIZE. [NOTE:
+At this time, changing this constant does NOT change the
+size of the interrupt stack, only the amount of memory
+reserved for it.]
+
+@findex CONFIGURE_EXECUTIVE_RAM_WORK_AREA
+@item @code{CONFIGURE_EXECUTIVE_RAM_WORK_AREA} is the base
+address of the RTEMS RAM Workspace. By default, this value
+is NULL indicating that the BSP is to determine the location
+of the RTEMS RAM Workspace.
+
+@findex CONFIGURE_MICROSECONDS_PER_TICK
+@item @code{CONFIGURE_MICROSECONDS_PER_TICK} is the length
+of time between clock ticks. By default, this is set to
+10000 microseconds.
+
+@findex CONFIGURE_TICKS_PER_TIMESLICE
+@item @code{CONFIGURE_TICKS_PER_TIMESLICE} is the number
+of ticks per each task's timeslice. By default, this is
+50.
+
+@findex CONFIGURE_MEMORY_OVERHEAD
+@item @code{CONFIGURE_MEMORY_OVERHEAD} is set to the number of
+bytes the applications wishes to add to the requirements calculated
+by @code{confdefs.h}. The default value is 0.
+
+@findex CONFIGURE_EXTRA_TASK_STACKS
+@item @code{CONFIGURE_EXTRA_TASK_STACKS} is set to the number of
+bytes the applications wishes to add to the task stack requirements
+calculated by @code{confdefs.h}. This parameter is very important.
+If the application creates tasks with stacks larger then the
+minimum, then that memory is NOT accounted for by @code{confdefs.h}.
+The default value is 0.
+
+@end itemize
+
+NOTE: The required size of the Executive RAM Work Area is calculated
+automatically when using the @code{confdefs.h} mechanism.
+
+@subsection Device Driver Table
+
+This section defines the configuration parameters related
+to the automatic generation of a Device Driver Table. As
+@code{confdefs.h} only is aware of a small set of
+standard device drivers, the generated Device Driver
+Table is suitable for simple applications with no
+custom device drivers.
+
+@itemize @bullet
+@findex CONFIGURE_HAS_OWN_DEVICE_DRIVER_TABLE
+@item @code{CONFIGURE_HAS_OWN_DEVICE_DRIVER_TABLE} is defined if
+the application wishes to provide their own Device Driver Table.
+The table generated is an array of @code{rtems_driver_address_table}
+entries named @code{Device_drivers}. By default, this is not
+defined indicating the @code{confdefs.h} is providing the
+device driver table.
+
+@findex CONFIGURE_MAXIMUM_DRIVERS
+@item @code{CONFIGURE_MAXIMUM_DRIVERS} is defined
+as the number of device drivers per node. By default, this is
+set to 10.
+
+@findex CONFIGURE_MAXIMUM_DEVICES
+@item @code{CONFIGURE_MAXIMUM_DEVICES} is defined
+to the number of individual devices that may be registered
+in the system. By default, this is set to 20.
+
+@findex CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
+@item @code{CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER}
+is defined
+if the application wishes to include the Console Device Driver.
+This device driver is responsible for providing standard input
+and output using "/dev/console". By default, this is not
+defined.
+
+@findex CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
+@item @code{CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER}
+is defined
+if the application wishes to include the Console Device Driver.
+This device driver is responsible for providing standard input
+and output using "/dev/console". By default, this is not
+defined.
+
+@findex CONFIGURE_APPLICATION_NEEDS_TIMER_DRIVER
+@item @code{CONFIGURE_APPLICATION_NEEDS_TIMER_DRIVER}
+is defined if the application wishes to include the Timer Driver.
+This device driver is used to benchmark execution times
+by the RTEMS Timing Test Suites. By default, this is not
+defined.
+
+@c @item @code{CONFIGURE_APPLICATION_NEEDS_RTC_DRIVER}
+@c is defined
+@c if the application wishes to include the Real-Time Clock Driver.
+@c By default, this is not defined.
+
+@findex CONFIGURE_APPLICATION_NEEDS_STUB_DRIVER
+@item @code{CONFIGURE_APPLICATION_NEEDS_STUB_DRIVER}
+is defined if the application wishes to include the Stub Device Driver.
+This device driver simply provides entry points that return
+successful and is primarily a test fixture.
+By default, this is not defined.
+
+@end itemize
+
+@subsection Multiprocessing Configuration
+
+This section defines the multiprocessing related
+system configuration parameters supported by @code{confdefs.h}.
+This class of Configuration Constants are only applicable if
+@code{CONFIGURE_MP_APPLICATION} is defined.
+
+@itemize @bullet
+@findex CONFIGURE_HAS_OWN_MULTIPROCESING_TABLE
+@item @code{CONFIGURE_HAS_OWN_MULTIPROCESING_TABLE} is defined
+if the application wishes to provide their own Multiprocessing
+Configuration Table. The generated table is named
+@code{Multiprocessing_configuration}. By default, this
+is not defined.
+
+@findex CONFIGURE_MP_NODE_NUMBER
+@item @code{CONFIGURE_MP_NODE_NUMBER} is the node number of
+this node in a multiprocessor system. The default node number
+is @code{NODE_NUMBER} which is set directly in RTEMS test Makefiles.
+
+@findex CONFIGURE_MP_MAXIMUM_NODES
+@item @code{CONFIGURE_MP_MAXIMUM_NODES} is the maximum number
+of nodes in a multiprocessor system. The default is 2.
+
+@findex CONFIGURE_MP_MAXIMUM_GLOBAL_OBJECTS
+@item @code{CONFIGURE_MP_MAXIMUM_GLOBAL_OBJECTS}
+is the maximum number
+of concurrently active global objects in a multiprocessor
+system. The default is 32.
+
+@findex CONFIGURE_MP_MAXIMUM_PROXIES
+@item @code{CONFIGURE_MP_MAXIMUM_PROXIES} is the maximum number
+of concurrently active thread/task proxies in a multiprocessor
+system. The default is 32.
+
+@findex CONFIGURE_MP_MPCI_TABLE_POINTER
+@item @code{CONFIGURE_MP_MPCI_TABLE_POINTER} is the pointer
+to the MPCI Configuration Table. The default value of
+this field is @code{&MPCI_table}.
+@end itemize
+
+@subsection Classic API Configuration
+
+This section defines the Classic API related
+system configuration parameters supported by @code{confdefs.h}.
+
+@itemize @bullet
+@findex CONFIGURE_MAXIMUM_TASKS
+@item @code{CONFIGURE_MAXIMUM_TASKS} is the maximum number of
+Classic API tasks that can be concurrently active.
+The default for this field is 0.
+
+@findex CONFIGURE_MAXIMUM_TIMERS
+@item @code{CONFIGURE_MAXIMUM_TIMERS} is the maximum number of
+Classic API timers that can be concurrently active.
+The default for this field is 0.
+
+@findex CONFIGURE_MAXIMUM_SEMAPHORES
+@item @code{CONFIGURE_MAXIMUM_SEMAPHORES} is the maximum number of
+Classic API semaphores that can be concurrently active.
+The default for this field is 0.
+
+@findex CONFIGURE_MAXIMUM_MESSAGE_QUEUES
+@item @code{CONFIGURE_MAXIMUM_MESSAGE_QUEUES} is the maximum number of
+Classic API message queues that can be concurrently active.
+The default for this field is 0.
+
+@findex CONFIGURE_MAXIMUM_PARTITIONS
+@item @code{CONFIGURE_MAXIMUM_PARTITIONS} is the maximum number of
+Classic API partitions that can be concurrently active.
+The default for this field is 0.
+
+@findex CONFIGURE_MAXIMUM_REGIONS
+@item @code{CONFIGURE_MAXIMUM_REGIONS} is the maximum number of
+Classic API regions that can be concurrently active.
+The default for this field is 0.
+
+@findex CONFIGURE_MAXIMUM_PORTS
+@item @code{CONFIGURE_MAXIMUM_PORTS} is the maximum number of
+Classic API ports that can be concurrently active.
+The default for this field is 0.
+
+@findex CONFIGURE_MAXIMUM_PERIODS
+@item @code{CONFIGURE_MAXIMUM_PERIODS} is the maximum number of
+Classic API rate monotonic periods that can be concurrently active.
+The default for this field is 0.
+
+@findex CONFIGURE_MAXIMUM_USER_EXTENSIONS
+@item @code{CONFIGURE_MAXIMUM_USER_EXTENSIONS} is the maximum number of
+Classic API user extensions that can be concurrently active.
+The default for this field is 0.
+
+@end itemize
+
+@subsection Classic API Initialization Tasks Table Configuration
+
+The @code{confdefs.h} configuration system can automatically
+generate an Initialization Tasks Table named
+@code{Initialization_tasks} with a single entry. The following
+parameters control the generation of that table.
+
+@itemize @bullet
+@findex CONFIGURE_RTEMS_INIT_TASKS_TABLE
+@item @code{CONFIGURE_RTEMS_INIT_TASKS_TABLE} is defined
+if the user wishes to use a Classic RTEMS API Initialization
+Task Table. The application may choose to use the initialization
+tasks or threads table from another API. By default, this
+field is not defined as the user MUST select their own
+API for initialization tasks.
+
+@findex CONFIGURE_HAS_OWN_INIT_TASK_TABLE
+@item @code{CONFIGURE_HAS_OWN_INIT_TASK_TABLE} is defined
+if the user wishes to define their own Classic API Initialization
+Tasks Table. This table should be named @code{Initialization_tasks}.
+By default, this is not defined.
+
+@findex CONFIGURE_INIT_TASK_NAME
+@item @code{CONFIGURE_INIT_TASK_NAME} is the name
+of the single initialization task defined by the
+Classic API Initialization Tasks Table. By default
+the value is @code{rtems_build_name( 'U', 'I', '1', ' ' )}.
+
+@findex CONFIGURE_INIT_TASK_STACK_SIZE
+@item @code{CONFIGURE_INIT_TASK_STACK_SIZE}
+is the stack size
+of the single initialization task defined by the
+Classic API Initialization Tasks Table. By default
+the value is @code{RTEMS_MINIMUM_STACK_SIZE}.
+
+@findex CONFIGURE_INIT_TASK_PRIORITY
+@item @code{CONFIGURE_INIT_TASK_PRIORITY}
+is the initial priority
+of the single initialization task defined by the
+Classic API Initialization Tasks Table. By default
+the value is 1 which is the highest priority
+in the Classic API.
+
+@findex CONFIGURE_INIT_TASK_ATTRIBUTES
+@item @code{CONFIGURE_INIT_TASK_ATTRIBUTES}
+is the task attributes
+of the single initialization task defined by the
+Classic API Initialization Tasks Table. By default
+the value is @code{RTEMS_DEFAULT_ATTRIBUTES}.
+
+@findex CONFIGURE_INIT_TASK_ENTRY_POINT
+@item @code{CONFIGURE_INIT_TASK_ENTRY_POINT}
+is the entry point (a.k.a. function name)
+of the single initialization task defined by the
+Classic API Initialization Tasks Table. By default
+the value is @code{Init}.
+
+@findex CONFIGURE_INIT_TASK_INITIAL_MODES
+@item @code{CONFIGURE_INIT_TASK_INITIAL_MODES}
+is the initial execution mode
+of the single initialization task defined by the
+Classic API Initialization Tasks Table. By default
+the value is @code{RTEMS_NO_PREEMPT}.
+
+@findex CONFIGURE_INIT_TASK_ARGUMENTS
+@item @code{CONFIGURE_INIT_TASK_ARGUMENTS}
+is the task argument
+of the single initialization task defined by the
+Classic API Initialization Tasks Table. By default
+the value is 0.
+
+@end itemize
+
+
+@subsection POSIX API Configuration
+
+The parameters in this section are used to configure resources
+for the RTEMS POSIX API. They are only relevant if the POSIX API
+is enabled at configure time using the @code{--enable-posix} option.
+
+@itemize @bullet
+@findex CONFIGURE_MAXIMUM_POSIX_THREADS
+@item @code{CONFIGURE_MAXIMUM_POSIX_THREADS} is the maximum number of
+POSIX API threads that can be concurrently active.
+The default is 0.
+
+@findex CONFIGURE_MAXIMUM_POSIX_MUTEXES
+@item @code{CONFIGURE_MAXIMUM_POSIX_MUTEXES} is the maximum number of
+POSIX API mutexes that can be concurrently active.
+The default is 0.
+
+@findex CONFIGURE_MAXIMUM_POSIX_CONDITION_VARIABLES
+@item @code{CONFIGURE_MAXIMUM_POSIX_CONDITION_VARIABLES} is the maximum number of
+POSIX API condition variables that can be concurrently active.
+The default is 0.
+
+@findex CONFIGURE_MAXIMUM_POSIX_KEYS
+@item @code{CONFIGURE_MAXIMUM_POSIX_KEYS} is the maximum number of
+POSIX API keys that can be concurrently active.
+The default is 0.
+
+@findex CONFIGURE_MAXIMUM_POSIX_TIMERS
+@item @code{CONFIGURE_MAXIMUM_POSIX_TIMERS} is the maximum number of
+POSIX API timers that can be concurrently active.
+The default is 0.
+
+@findex CONFIGURE_MAXIMUM_POSIX_QUEUED_SIGNALS
+@item @code{CONFIGURE_MAXIMUM_POSIX_QUEUED_SIGNALS} is the maximum number of
+POSIX API queued signals that can be concurrently active.
+The default is 0.
+
+@findex CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUES
+@item @code{CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUES} is the maximum number of
+POSIX API message queues that can be concurrently active.
+The default is 0.
+
+@findex CONFIGURE_MAXIMUM_POSIX_SEMAPHORES
+@item @code{CONFIGURE_MAXIMUM_POSIX_SEMAPHORES} is the maximum number of
+POSIX API semaphores that can be concurrently active.
+The default is 0.
+
+@end itemize
+
+@subsection POSIX Initialization Threads Table Configuration
+
+The @code{confdefs.h} configuration system can automatically
+generate a POSIX Initialization Threads Table named
+@code{POSIX_Initialization_threads} with a single entry. The following
+parameters control the generation of that table.
+
+@itemize @bullet
+@findex CONFIGURE_POSIX_INIT_THREAD_TABLE
+@item @code{CONFIGURE_POSIX_INIT_THREAD_TABLE}
+is defined
+if the user wishes to use a POSIX API Initialization
+Threads Table. The application may choose to use the initialization
+tasks or threads table from another API. By default, this
+field is not defined as the user MUST select their own
+API for initialization tasks.
+
+@findex CONFIGURE_POSIX_HAS_OWN_INIT_THREAD_TABLE
+@item @code{CONFIGURE_POSIX_HAS_OWN_INIT_THREAD_TABLE}
+is defined if the user wishes to define their own POSIX API Initialization
+Threads Table. This table should be named @code{POSIX_Initialization_threads}.
+By default, this is not defined.
+
+@findex CONFIGURE_POSIX_INIT_THREAD_ENTRY_POINT
+@item @code{CONFIGURE_POSIX_INIT_THREAD_ENTRY_POINT}
+is the entry point (a.k.a. function name)
+of the single initialization thread defined by the
+POSIX API Initialization Threads Table. By default
+the value is @code{POSIX_Init}.
+
+@findex CONFIGURE_POSIX_INIT_THREAD_STACK_SIZE
+@item @code{CONFIGURE_POSIX_INIT_THREAD_STACK_SIZE}
+is the stack size of the single initialization thread defined by the
+POSIX API Initialization Threads Table. By default
+the value is @code{RTEMS_MINIMUM_STACK_SIZE * 2}.
+
+@end itemize
+
+@subsection ITRON API Configuration
+
+The parameters in this section are used to configure resources
+for the RTEMS ITRON API. They are only relevant if the POSIX API
+is enabled at configure time using the @code{--enable-itron} option.
+
+@itemize @bullet
+@findex CONFIGURE_MAXIMUM_ITRON_TASKS
+@item @code{CONFIGURE_MAXIMUM_ITRON_TASKS}
+is the maximum number of
+ITRON API tasks that can be concurrently active.
+The default is 0.
+
+@findex CONFIGURE_MAXIMUM_ITRON_SEMAPHORES
+@item @code{CONFIGURE_MAXIMUM_ITRON_SEMAPHORES}
+is the maximum number of
+ITRON API semaphores that can be concurrently active.
+The default is 0.
+
+@findex CONFIGURE_MAXIMUM_ITRON_EVENTFLAGS
+@item @code{CONFIGURE_MAXIMUM_ITRON_EVENTFLAGS}
+is the maximum number of
+ITRON API eventflags that can be concurrently active.
+The default is 0.
+
+@findex CONFIGURE_MAXIMUM_ITRON_MAILBOXES
+@item @code{CONFIGURE_MAXIMUM_ITRON_MAILBOXES}
+is the maximum number of
+ITRON API mailboxes that can be concurrently active.
+The default is 0.
+
+@findex CONFIGURE_MAXIMUM_ITRON_MESSAGE_BUFFERS
+@item @code{CONFIGURE_MAXIMUM_ITRON_MESSAGE_BUFFERS}
+is the maximum number of
+ITRON API message buffers that can be concurrently active.
+The default is 0.
+
+@findex CONFIGURE_MAXIMUM_ITRON_PORTS
+@item @code{CONFIGURE_MAXIMUM_ITRON_PORTS}
+is the maximum number of
+ITRON API ports that can be concurrently active.
+The default is 0.
+
+@findex CONFIGURE_MAXIMUM_ITRON_MEMORY_POOLS
+@item @code{CONFIGURE_MAXIMUM_ITRON_MEMORY_POOLS}
+is the maximum number of
+ITRON API memory pools that can be concurrently active.
+The default is 0.
+
+@findex CONFIGURE_MAXIMUM_ITRON_FIXED_MEMORY_POOLS
+@item @code{CONFIGURE_MAXIMUM_ITRON_FIXED_MEMORY_POOLS}
+is the maximum number of
+ITRON API fixed memory pools that can be concurrently active.
+The default is 0.
+
+@end itemize
+
+@subsection ITRON Initialization Task Table Configuration
+
+The @code{confdefs.h} configuration system can automatically
+generate an ITRON Initialization Tasks Table named
+@code{ITRON_Initialization_tasks} with a single entry. The following
+parameters control the generation of that table.
+
+@itemize @bullet
+@findex CONFIGURE_ITRON_INIT_TASK_TABLE
+@item @code{CONFIGURE_ITRON_INIT_TASK_TABLE} is defined
+if the user wishes to use a ITRON API Initialization
+Tasks Table. The application may choose to use the initialization
+tasks or threads table from another API. By default, this
+field is not defined as the user MUST select their own
+API for initialization tasks.
+
+@findex CONFIGURE_ITRON_HAS_OWN_INIT_TASK_TABLE
+@item @code{CONFIGURE_ITRON_HAS_OWN_INIT_TASK_TABLE}
+is defined if the user wishes to define their own ITRON API Initialization
+Tasks Table. This table should be named @code{ITRON_Initialization_tasks}.
+By default, this is not defined.
+
+@findex CONFIGURE_ITRON_INIT_TASK_ENTRY_POINT
+@item @code{CONFIGURE_ITRON_INIT_TASK_ENTRY_POINT}
+is the entry point (a.k.a. function name)
+of the single initialization task defined by the
+ITRON API Initialization Tasks Table. By default
+the value is @code{ITRON_Init}.
+
+@findex CONFIGURE_ITRON_INIT_TASK_ATTRIBUTES
+@item @code{CONFIGURE_ITRON_INIT_TASK_ATTRIBUTES}
+is the attribute set
+of the single initialization task defined by the
+ITRON API Initialization Tasks Table. By default
+the value is @code{TA_HLNG}.
+
+@findex CONFIGURE_ITRON_INIT_TASK_PRIORITY
+@item @code{CONFIGURE_ITRON_INIT_TASK_PRIORITY}
+is the initial priority
+of the single initialization task defined by the
+ITRON API Initialization Tasks Table. By default
+the value is @code{1} which is the highest priority
+in the ITRON API.
+
+@findex CONFIGURE_ITRON_INIT_TASK_STACK_SIZE
+@item @code{CONFIGURE_ITRON_INIT_TASK_STACK_SIZE}
+is the stack size of the single initialization task defined by the
+ITRON API Initialization Tasks Table. By default
+the value is @code{RTEMS_MINIMUM_STACK_SIZE}.
+
+@end itemize
+
+@subsection Ada Tasks
+
+This section defines the system configuration parameters supported
+by @code{confdefs.h} related to configuring RTEMS to support
+a task using Ada tasking with GNAT.
+
+@itemize @bullet
+@findex CONFIGURE_GNAT_RTEMS
+@item @code{CONFIGURE_GNAT_RTEMS} is defined to inform
+RTEMS that the GNAT Ada run-time is to be used by the
+application. This configuration parameter is critical
+as it makes @code{confdefs.h} configure the resources
+(mutexes and keys) used implicitly by the GNAT run-time.
+By default, this parameter is not defined.
+
+@findex CONFIGURE_MAXIMUM_ADA_TASKS
+@item @code{CONFIGURE_MAXIMUM_ADA_TASKS} is the
+number of Ada tasks that can be concurrently active
+in the system. By default, when @code{CONFIGURE_GNAT_RTEMS}
+is defined, this is set to 20.
+
+@findex CONFIGURE_MAXIMUM_FAKE_ADA_TASKS
+@item @code{CONFIGURE_MAXIMUM_FAKE_ADA_TASKS} is
+the number of "fake" Ada tasks that can be concurrently
+active in the system. A "fake" Ada task is a non-Ada
+task that makes calls back into Ada code and thus
+implicitly uses the Ada run-time.
+
+@end itemize
+
+@section Configuration Table
+
+@cindex Configuration Table
+@cindex RTEMS Configuration Table
+
+The RTEMS Configuration Table is used to tailor an
+application for its specific needs. For example, the user can
+configure the number of device drivers or which APIs may be used.
+THe address of the user-defined Configuration Table is passed as an
+argument to the @code{@value{DIRPREFIX}initialize_executive}
+directive, which MUST be the first RTEMS directive called.
+The RTEMS Configuration Table
+is defined in the following @value{LANGUAGE} @value{STRUCTURE}:
+
+@ifset is-C
+@findex rtems_configuration_table
+@example
+@group
+typedef struct @{
+ void *work_space_start;
+ rtems_unsigned32 work_space_size;
+ rtems_unsigned32 maximum_extensions;
+ rtems_unsigned32 microseconds_per_tick;
+ rtems_unsigned32 ticks_per_timeslice;
+ rtems_unsigned32 maximum_devices;
+ rtems_unsigned32 maximum_drivers;
+ rtems_unsigned32 number_of_device_drivers;
+ rtems_driver_address_table *Device_driver_table;
+ rtems_unsigned32 number_of_initial_extensions;
+ rtems_extensions_table *User_extension_table;
+ rtems_multiprocessing_table *User_multiprocessing_table;
+ rtems_api_configuration_table *RTEMS_api_configuration;
+ posix_api_configuration_table *POSIX_api_configuration;
+@} rtems_configuration_table;
+@end group
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+type Configuration_Table is
+ record
+ Work_Space_Start : RTEMS.Address;
+ Work_Space_Size : RTEMS.Unsigned32;
+ Maximum_Extensions : RTEMS.Unsigned32;
+ Microseconds_Per_Tick : RTEMS.Unsigned32;
+ Ticks_Per_Timeslice : RTEMS.Unsigned32;
+ Maximum_Devices : RTEMS.Unsigned32;
+ Number_Of_Device_Drivers : RTEMS.Unsigned32;
+ Device_Driver_Table :
+ RTEMS.Driver_Address_Table_Pointer;
+ Number_Of_Initial_Extensions : RTEMS.Unsigned32;
+ User_Extension_Table : RTEMS.Extensions_Table_Pointer;
+ User_Multiprocessing_Table :
+ RTEMS.Multiprocessing_Table_Pointer;
+ RTEMS_API_Configuration :
+ RTEMS.API_Configuration_Table_Pointer;
+ POSIX_API_Configuration :
+ RTEMS.POSIX_API_Configuration_Table_Pointer;
+ end record;
+
+type Configuration_Table_Pointer is access all Configuration_Table;
+@end example
+@end ifset
+
+@table @b
+@item work_space_start
+is the address of the RTEMS RAM Workspace.
+This area contains items such as the
+various object control blocks (TCBs, QCBs, ...) and task stacks.
+If the address is not aligned on a four-word boundary, then
+RTEMS will invoke the fatal error handler during
+@code{@value{DIRPREFIX}initialize_executive}.
+When using the @code{confdefs.h} mechanism for configuring
+an RTEMS application, the value for this field corresponds
+to the setting of the macro @code{CONFIGURE_EXECUTIVE_RAM_WORK_AREA}
+which defaults to @code{NULL}. Normally, this field should be
+configured as @code{NULL} as BSPs will assign memory for the
+RTEMS RAM Workspace as part of system initialization.
+
+@item work_space_size
+is the calculated size of the
+RTEMS RAM Workspace. The section Sizing the RTEMS RAM Workspace
+details how to arrive at this number.
+When using the @code{confdefs.h} mechanism for configuring
+an RTEMS application, the value for this field corresponds
+to the setting of the macro @code{CONFIGURE_EXECUTIVE_RAM_SIZE}
+and is calculated based on the other system configuration settings.
+
+@item microseconds_per_tick
+is number of microseconds per clock tick.
+When using the @code{confdefs.h} mechanism for configuring
+an RTEMS application, the value for this field corresponds
+to the setting of the macro @code{CONFIGURE_MICROSECONDS_PER_TICK}.
+If not defined by the application, then the
+@code{CONFIGURE_MICROSECONDS_PER_TICK} macro defaults to 10000
+(10 milliseconds).
+
+@item ticks_per_timeslice
+is the number of clock ticks for a timeslice.
+When using the @code{confdefs.h} mechanism for configuring
+an RTEMS application, the value for this field corresponds
+to the setting of the macro @code{CONFIGURE_TICKS_PER_TIMESLICE}.
+
+@item maximum_devices
+is the maximum number of devices that can be registered.
+When using the @code{confdefs.h} mechanism for configuring
+an RTEMS application, the value for this field corresponds
+to the setting of the macro @code{CONFIGURE_MAXIMUM_DEVICES}.
+
+@item maximum_drivers
+is the maximum number of device drivers that can be registered.
+When using the @code{confdefs.h} mechanism for configuring
+an RTEMS application, the value for this field corresponds
+to the setting of the macro @code{CONFIGURE_MAXIMUM_DRIVERS}.
+This value is set to @code{maximum_devices} if it is greater
+than @code{maximum_drivers}.
+
+@item number_of_device_drivers
+is the number of device drivers for the system. There should be
+the same number of entries in the Device Driver Table. If this field
+is zero, then the @code{User_driver_address_table} entry should be NULL.
+When using the @code{confdefs.h} mechanism for configuring
+an RTEMS application, the value for this field is calculated
+automatically based on the number of entries in the
+Device Driver Table. This calculation is based on the assumption
+that the Device Driver Table is named @code{Device_drivers}
+and defined in C. This table may be generated automatically
+for simple applications using only the device drivers that correspond
+to the following macros:
+
+@itemize @bullet
+
+@item @code{CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER}
+@item @code{CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER}
+@item @code{CONFIGURE_APPLICATION_NEEDS_TIMER_DRIVER}
+@item @code{CONFIGURE_APPLICATION_NEEDS_RTC_DRIVER}
+@item @code{CONFIGURE_APPLICATION_NEEDS_STUB_DRIVER}
+
+@end itemize
+
+Note that network device drivers are not configured in the
+Device Driver Table.
+
+@item Device_driver_table
+is the address of the Device Driver Table. This table contains the entry
+points for each device driver. If the number_of_device_drivers field is zero,
+then this entry should be NULL. The format of this table will be
+discussed below.
+When using the @code{confdefs.h} mechanism for configuring
+an RTEMS application, the Device Driver Table is assumed to be
+named @code{Device_drivers} and defined in C. If the application is providing
+its own Device Driver Table, then the macro
+@code{CONFIGURE_HAS_OWN_DEVICE_DRIVER_TABLE} must be defined to indicate
+this and prevent @code{confdefs.h} from generating the table.
+
+@item number_of_initial_extensions
+is the number of initial user extensions. There should be
+the same number of entries as in the User_extension_table. If this field
+is zero, then the User_driver_address_table entry should be NULL.
+When using the @code{confdefs.h} mechanism for configuring
+an RTEMS application, the value for this field corresponds
+to the setting of the macro @code{CONFIGURE_NUMBER_OF_INITIAL_EXTENSIONS}
+which is set automatically by @code{confdefs.h} based on the size
+of the User Extensions Table.
+
+@item User_extension_table
+is the address of the User
+Extension Table. This table contains the entry points for the
+static set of optional user extensions. If no user extensions
+are configured, then this entry should be NULL. The format of
+this table will be discussed below.
+When using the @code{confdefs.h} mechanism for configuring
+an RTEMS application, the User Extensions Table is named
+@code{Configuration_Initial_Extensions} and defined in
+confdefs.h. It is initialized based on the following
+macros:
+
+@itemize @bullet
+
+@item @code{CONFIGURE_INITIAL_EXTENSIONS}
+@item @code{STACK_CHECKER_EXTENSION}
+
+@end itemize
+
+The application may configure one or more initial user extension
+sets by setting the @code{CONFIGURE_INITIAL_EXTENSIONS} macro. By
+defining the @code{STACK_CHECKER_EXTENSION} macro, the task stack bounds
+checking user extension set is automatically included in the
+application.
+
+@item User_multiprocessing_table
+is the address of the Multiprocessor Configuration Table. This
+table contains information needed by RTEMS only when used in a multiprocessor
+configuration. This field must be NULL when RTEMS is used in a
+single processor configuration.
+When using the @code{confdefs.h} mechanism for configuring
+an RTEMS application, the Multiprocessor Configuration Table
+is automatically generated when the @code{CONFIGURE_MP_APPLICATION}
+is defined. If @code{CONFIGURE_MP_APPLICATION} is not defined, the this
+entry is set to NULL. The generated table has the name
+@code{Multiprocessing_configuration}.
+
+@item RTEMS_api_configuration
+is the address of the RTEMS API Configuration Table. This table
+contains information needed by the RTEMS API. This field should be
+NULL if the RTEMS API is not used. [NOTE: Currently the RTEMS API
+is required to support support components such as BSPs and libraries
+which use this API.] This table is built automatically and this
+entry filled in, if using the @code{confdefs.h} application
+configuration mechanism. The generated table has the name
+@code{Configuration_RTEMS_API}.
+
+@item POSIX_api_configuration
+is the address of the POSIX API Configuration Table. This table
+contains information needed by the POSIX API. This field should be
+NULL if the POSIX API is not used. This table is built automatically
+and this entry filled in, if using the @code{confdefs.h} application
+configuration mechanism. The @code{confdefs.h} application
+mechanism will fill this field in with the address of the
+@code{Configuration_POSIX_API} table of POSIX API is configured
+and NULL if the POSIX API is not configured.
+
+@end table
+
+@section RTEMS API Configuration Table
+
+@cindex RTEMS API Configuration Table
+
+The RTEMS API Configuration Table is used to configure the
+managers which constitute the RTEMS API for a particular application.
+For example, the user can configure the maximum number of tasks for
+this application. The RTEMS API Configuration Table is defined in
+the following @value{LANGUAGE} @value{STRUCTURE}:
+
+@ifset is-C
+@findex rtems_api_configuration_table
+@example
+@group
+typedef struct @{
+ rtems_unsigned32 maximum_tasks;
+ rtems_unsigned32 maximum_timers;
+ rtems_unsigned32 maximum_semaphores;
+ rtems_unsigned32 maximum_message_queues;
+ rtems_unsigned32 maximum_partitions;
+ rtems_unsigned32 maximum_regions;
+ rtems_unsigned32 maximum_ports;
+ rtems_unsigned32 maximum_periods;
+ rtems_unsigned32 number_of_initialization_tasks;
+ rtems_initialization_tasks_table *User_initialization_tasks_table;
+@} rtems_api_configuration_table;
+@end group
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+type API_Configuration_Table is
+ record
+ Maximum_Tasks : RTEMS.Unsigned32;
+ Maximum_Timers : RTEMS.Unsigned32;
+ Maximum_Semaphores : RTEMS.Unsigned32;
+ Maximum_Message_queues : RTEMS.Unsigned32;
+ Maximum_Partitions : RTEMS.Unsigned32;
+ Maximum_Regions : RTEMS.Unsigned32;
+ Maximum_Ports : RTEMS.Unsigned32;
+ Maximum_Periods : RTEMS.Unsigned32;
+ Number_Of_Initialization_Tasks : RTEMS.Unsigned32;
+ User_Initialization_Tasks_Table :
+ RTEMS.Initialization_Tasks_Table_Pointer;
+ end record;
+
+type API_Configuration_Table_Pointer is
+ access all API_Configuration_Table;
+@end example
+@end ifset
+
+@table @b
+@item maximum_tasks
+is the maximum number of tasks that
+can be concurrently active (created) in the system including
+initialization tasks.
+When using the @code{confdefs.h} mechanism for configuring
+an RTEMS application, the value for this field corresponds
+to the setting of the macro @code{CONFIGURE_MAXIMUM_TASKS}.
+If not defined by the application, then the @code{CONFIGURE_MAXIMUM_TASKS}
+macro defaults to 10.
+
+@item maximum_timers
+is the maximum number of timers
+that can be concurrently active in the system.
+When using the @code{confdefs.h} mechanism for configuring
+an RTEMS application, the value for this field corresponds
+to the setting of the macro @code{CONFIGURE_MAXIMUM_TIMERS}.
+If not defined by the application, then the @code{CONFIGURE_MAXIMUM_TIMERS}
+macro defaults to 0.
+
+@item maximum_semaphores
+is the maximum number of
+semaphores that can be concurrently active in the system.
+When using the @code{confdefs.h} mechanism for configuring
+an RTEMS application, the value for this field corresponds
+to the setting of the macro @code{CONFIGURE_MAXIMUM_SEMAPHORES}.
+If not defined by the application, then the @code{CONFIGURE_MAXIMUM_SEMAPHORES}
+macro defaults to 0.
+
+@item maximum_message_queues
+is the maximum number of
+message queues that can be concurrently active in the system.
+When using the @code{confdefs.h} mechanism for configuring
+an RTEMS application, the value for this field corresponds
+to the setting of the macro @code{CONFIGURE_MAXIMUM_MESSAGE_QUEUES}.
+If not defined by the application, then the
+@code{CONFIGURE_MAXIMUM_MESSAGE_QUEUES} macro defaults to 0.
+
+@item maximum_partitions
+is the maximum number of
+partitions that can be concurrently active in the system.
+When using the @code{confdefs.h} mechanism for configuring
+an RTEMS application, the value for this field corresponds
+to the setting of the macro @code{CONFIGURE_MAXIMUM_PARTITIONS}.
+If not defined by the application, then the @code{CONFIGURE_MAXIMUM_PARTITIONS}
+macro defaults to 0.
+
+@item maximum_regions
+is the maximum number of regions
+that can be concurrently active in the system.
+When using the @code{confdefs.h} mechanism for configuring
+an RTEMS application, the value for this field corresponds
+to the setting of the macro @code{CONFIGURE_MAXIMUM_REGIONS}.
+If not defined by the application, then the @code{CONFIGURE_MAXIMUM_REGIONS}
+macro defaults to 0.
+
+@item maximum_ports
+is the maximum number of ports into
+dual-port memory areas that can be concurrently active in the
+system.
+When using the @code{confdefs.h} mechanism for configuring
+an RTEMS application, the value for this field corresponds
+to the setting of the macro @code{CONFIGURE_MAXIMUM_PORTS}.
+If not defined by the application, then the @code{CONFIGURE_MAXIMUM_PORTS}
+macro defaults to 0.
+
+@item number_of_initialization_tasks
+is the number of initialization tasks configured. At least one
+RTEMS initialization task or POSIX initializatin must be configured
+in order for the user's application to begin executing.
+When using the @code{confdefs.h} mechanism for configuring
+an RTEMS application, the user must define the
+@code{CONFIGURE_RTEMS_INIT_TASKS_TABLE} to indicate that there
+is one or more RTEMS initialization task. If the application
+only has one RTEMS initialization task, then the automatically
+generated Initialization Task Table will be sufficient. The following
+macros correspond to the single initialization task:
+
+@itemize @bullet
+
+@item @code{CONFIGURE_INIT_TASK_NAME} - is the name of the task.
+If this macro is not defined by the application, then this defaults
+to the task name of @code{"UI1 "} for User Initialization Task 1.
+
+@item @code{CONFIGURE_INIT_TASK_STACK_SIZE} - is the stack size
+of the single initialization task. If this macro is not defined
+by the application, then this defaults to @code{RTEMS_MINIMUM_STACK_SIZE}.
+
+@item @code{CONFIGURE_INIT_TASK_PRIORITY} - is the initial priority
+of the single initialization task. If this macro is not defined
+by the application, then this defaults to 1.
+
+@item @code{CONFIGURE_INIT_TASK_ATTRIBUTES} - is the attributes
+of the single initialization task. If this macro is not defined
+by the application, then this defaults to @code{RTEMS_DEFAULT_ATTRIBUTES}.
+
+@item @code{CONFIGURE_INIT_TASK_ENTRY_POINT} - is the entry point
+of the single initialization task. If this macro is not defined
+by the application, then this defaults to the C language routine
+@code{Init}.
+
+@item @code{CONFIGURE_INIT_TASK_INITIAL_MODES} - is the initial execution
+modes of the single initialization task. If this macro is not defined
+by the application, then this defaults to @code{RTEMS_NO_PREEMPT}.
+
+@item @code{CONFIGURE_INIT_TASK_ARGUMENTS} - is the argument passed to the
+of the single initialization task. If this macro is not defined
+by the application, then this defaults to 0.
+
+
+@end itemize
+
+
+has the option to have
+ value for this field corresponds
+to the setting of the macro @code{}.
+
+@item User_initialization_tasks_table
+is the address of the Initialization Task Table. This table contains the
+information needed to create and start each of the
+initialization tasks. The format of this table will be discussed below.
+When using the @code{confdefs.h} mechanism for configuring
+an RTEMS application, the value for this field corresponds
+to the setting of the macro @code{CONFIGURE_EXECUTIVE_RAM_WORK_AREA}.
+
+@end table
+
+@section POSIX API Configuration Table
+
+@cindex POSIX API Configuration Table
+
+The POSIX API Configuration Table is used to configure the
+managers which constitute the POSIX API for a particular application.
+For example, the user can configure the maximum number of threads for
+this application. The POSIX API Configuration Table is defined in
+the following @value{LANGUAGE} @value{STRUCTURE}:
+
+@ifset is-C
+@findex posix_initialization_threads_table
+@findex posix_api_configuration_table
+@example
+@group
+typedef struct @{
+ void *(*thread_entry)(void *);
+@} posix_initialization_threads_table;
+
+typedef struct @{
+ int maximum_threads;
+ int maximum_mutexes;
+ int maximum_condition_variables;
+ int maximum_keys;
+ int maximum_timers;
+ int maximum_queued_signals;
+ int number_of_initialization_tasks;
+ posix_initialization_threads_table *User_initialization_tasks_table;
+@} posix_api_configuration_table;
+@end group
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+ type POSIX_Thread_Entry is access procedure (
+ Argument : in RTEMS.Address
+ );
+
+ type POSIX_Initialization_Threads_Table_Entry is
+ record
+ Thread_Entry : RTEMS.POSIX_Thread_Entry;
+ end record;
+
+ type POSIX_Initialization_Threads_Table is array
+ ( RTEMS.Unsigned32 range <> ) of
+ RTEMS.POSIX_Initialization_Threads_Table_Entry;
+
+ type POSIX_Initialization_Threads_Table_Pointer is access all
+ POSIX_Initialization_Threads_Table;
+
+ type POSIX_API_Configuration_Table_Entry is
+ record
+ Maximum_Threads : Interfaces.C.Int;
+ Maximum_Mutexes : Interfaces.C.Int;
+ Maximum_Condition_Variables : Interfaces.C.Int;
+ Maximum_Keys : Interfaces.C.Int;
+ Maximum_Timers : Interfaces.C.Int;
+ Maximum_Queued_Signals : Interfaces.C.Int;
+ Number_Of_Initialization_Tasks : Interfaces.C.Int;
+ User_Initialization_Tasks_Table :
+ RTEMS.POSIX_Initialization_Threads_Table_Pointer;
+ end record;
+
+ type POSIX_API_Configuration_Table is array
+ ( RTEMS.Unsigned32 range <> ) of
+ RTEMS.POSIX_API_Configuration_Table_Entry;
+
+ type POSIX_API_Configuration_Table_Pointer is access all
+ RTEMS.POSIX_API_Configuration_Table;
+@end example
+@end ifset
+
+@table @b
+@item maximum_threads
+is the maximum number of threads that
+can be concurrently active (created) in the system including
+initialization threads.
+When using the @code{confdefs.h} mechanism for configuring
+an RTEMS application, the value for this field corresponds
+to the setting of the macro @code{CONFIGURE_MAXIMUM_POSIX_THREADS}.
+If not defined by the application, then the
+@code{CONFIGURE_MAXIMUM_POSIX_THREADS} macro defaults to 10.
+
+@item maximum_mutexes
+is the maximum number of mutexes that can be concurrently
+active in the system.
+When using the @code{confdefs.h} mechanism for configuring
+an RTEMS application, the value for this field corresponds
+to the setting of the macro @code{CONFIGURE_MAXIMUM_POSIX_MUTEXES}.
+If not defined by the application, then the
+@code{CONFIGURE_MAXIMUM_POSIX_MUTEXES} macro defaults to 0.
+
+@item maximum_condition_variables
+is the maximum number of condition variables that can be
+concurrently active in the system.
+When using the @code{confdefs.h} mechanism for configuring
+an RTEMS application, the value for this field corresponds
+to the setting of the macro @code{CONFIGURE_MAXIMUM_POSIX_CONDITION_VARIABLES}.
+If not defined by the application, then the
+@code{CONFIGURE_MAXIMUM_POSIX_CONDITION_VARIABLES} macro defaults to 0.
+
+@item maximum_keys
+is the maximum number of keys that can be concurrently active in the system.
+When using the @code{confdefs.h} mechanism for configuring
+an RTEMS application, the value for this field corresponds
+to the setting of the macro @code{CONFIGURE_MAXIMUM_POSIX_KEYS}.
+If not defined by the application, then the
+@code{CONFIGURE_MAXIMUM_POSIX_KEYS} macro defaults to 0.
+
+@item maximum_timers
+is the maximum number of POSIX timers that can be concurrently active
+in the system.
+When using the @code{confdefs.h} mechanism for configuring
+an RTEMS application, the value for this field corresponds
+to the setting of the macro @code{CONFIGURE_MAXIMUM_POSIX_TIMERS}.
+If not defined by the application, then the
+@code{CONFIGURE_MAXIMUM_POSIX_TIMERS} macro defaults to 0.
+
+@item maximum_queued_signals
+is the maximum number of queued signals that can be concurrently
+pending in the system.
+When using the @code{confdefs.h} mechanism for configuring
+an RTEMS application, the value for this field corresponds
+to the setting of the macro @code{CONFIGURE_MAXIMUM_POSIX_QUEUED_SIGNALS}.
+If not defined by the application, then the
+@code{CONFIGURE_MAXIMUM_POSIX_QUEUED_SIGNALS} macro defaults to 0.
+
+@item number_of_initialization_threads
+is the number of initialization threads configured. At least one
+initialization threads must be configured.
+When using the @code{confdefs.h} mechanism for configuring
+an RTEMS application, the user must define the
+@code{CONFIGURE_POSIX_INIT_THREAD_TABLE} to indicate that there
+is one or more POSIX initialization thread. If the application
+only has one POSIX initialization thread, then the automatically
+generated POSIX Initialization Thread Table will be sufficient. The following
+macros correspond to the single initialization task:
+
+@itemize @bullet
+
+@item @code{CONFIGURE_POSIX_INIT_THREAD_ENTRY_POINT} - is the entry
+point of the thread. If this macro is not defined by the application,
+then this defaults to the C routine @code{POSIX_Init}.
+
+@item @code{CONFIGURE_POSIX_INIT_TASK_STACK_SIZE} - is the stack size
+of the single initialization thread. If this macro is not defined
+by the application, then this defaults to
+@code{(RTEMS_MINIMUM_STACK_SIZE * 2)}.
+
+@end itemize
+
+@item User_initialization_threads_table
+is the address of the Initialization Threads Table. This table contains the
+information needed to create and start each of the initialization threads.
+The format of each entry in this table is defined in the
+@code{posix_initialization_threads_table} @value{STRUCTURE}.
+When using the @code{confdefs.h} mechanism for configuring
+an RTEMS application, the value for this field corresponds
+to the address of the @code{POSIX_Initialization_threads} structure.
+
+@end table
+
+@section CPU Dependent Information Table
+
+@cindex CPU Dependent Information Table
+
+The CPU Dependent Information Table is used to
+describe processor dependent information required by RTEMS.
+This table is generally used to supply RTEMS with information
+only known by the Board Support Package. The contents of this
+table are discussed in the CPU Dependent Information Table
+chapter of the Applications Supplement document for a specific
+target processor.
+
+The @code{confdefs.h} mechanism does not support generating this
+table. It is normally filled in by the Board Support Package.
+
+@section Initialization Task Table
+
+@cindex Initialization Tasks Table
+
+The Initialization Task Table is used to describe
+each of the user initialization tasks to the Initialization
+Manager. The table contains one entry for each initialization
+task the user wishes to create and start. The fields of this
+data structure directly correspond to arguments to the
+@code{@value{DIRPREFIX}task_create} and
+@code{@value{DIRPREFIX}task_start} directives. The number of entries is
+found in the @code{number_of_initialization_tasks} entry in the
+Configuration Table.
+
+The format of each entry in the
+Initialization Task Table is defined in the following @value{LANGUAGE}
+@value{STRUCTURE}:
+
+@ifset is-C
+@findex rtems_initialization_tasks_table
+@example
+typedef struct @{
+ rtems_name name;
+ rtems_unsigned32 stack_size;
+ rtems_task_priority initial_priority;
+ rtems_attribute attribute_set;
+ rtems_task_entry entry_point;
+ rtems_mode mode_set;
+ rtems_task_argument argument;
+@} rtems_initialization_tasks_table;
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+type Initialization_Tasks_Table_Entry is
+ record
+ Name : RTEMS.Name; -- task name
+ Stack_Size : RTEMS.Unsigned32; -- task stack size
+ Initial_Priority : RTEMS.Task_priority; -- task priority
+ Attribute_Set : RTEMS.Attribute; -- task attributes
+ Entry_Point : RTEMS.Task_Entry; -- task entry point
+ Mode_Set : RTEMS.Mode; -- task initial mode
+ Argument : RTEMS.Unsigned32; -- task argument
+ end record;
+
+type Initialization_Tasks_Table is array
+ ( RTEMS.Unsigned32 range <> ) of
+ RTEMS.Initialization_Tasks_Table_Entry;
+
+type Initialization_Tasks_Table_Pointer is access all
+ Initialization_Tasks_Table;
+@end example
+@end ifset
+
+@table @b
+@item name
+is the name of this initialization task.
+
+@item stack_size
+is the size of the stack for this initialization task.
+
+@item initial_priority
+is the priority of this initialization task.
+
+@item attribute_set
+is the attribute set used during creation of this initialization task.
+
+@item entry_point
+is the address of the entry point of this initialization task.
+
+@item mode_set
+is the initial execution mode of this initialization task.
+
+@item argument
+is the initial argument for this initialization task.
+
+@end table
+
+A typical declaration for an Initialization Task Table might appear as follows:
+
+@ifset is-C
+@example
+rtems_initialization_tasks_table
+Initialization_tasks[2] = @{
+ @{ INIT_1_NAME,
+ 1024,
+ 1,
+ DEFAULT_ATTRIBUTES,
+ Init_1,
+ DEFAULT_MODES,
+ 1
+
+ @},
+ @{ INIT_2_NAME,
+ 1024,
+ 250,
+ FLOATING_POINT,
+ Init_2,
+ NO_PREEMPT,
+ 2
+
+ @}
+@};
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+Initialization_Tasks : aliased
+ RTEMS.Initialization_Tasks_Table( 1 .. 2 ) := (
+ (INIT_1_NAME,
+ 1024,
+ 1,
+ RTEMS.Default_Attributes,
+ Init_1'Access,
+ RTEMS.Default_Modes,
+ 1),
+ (INIT_2_NAME,
+ 1024,
+ 250,
+ RTEMS.Floating_Point,
+ Init_2'Access,
+ RTEMS.No_Preempt,
+ 2)
+);
+@end example
+@end ifset
+
+@section Driver Address Table
+
+@cindex Device Driver Table
+
+The Device Driver Table is used to inform the I/O Manager of the set of
+entry points for each device driver configured in the system. The table
+contains one entry for each device driver required by the application.
+The number of entries is defined in the number_of_device_drivers entry
+in the Configuration Table. This table is copied to the Device Drive
+Table during the IO Manager's initialization giving the entries in this
+table the lower major numbers. The format of each entry in the Device
+Driver Table is defined in the following @value{LANGUAGE}
+@value{STRUCTURE}:
+
+@ifset is-C
+@findex rtems_driver_address_table
+@example
+typedef struct @{
+ rtems_device_driver_entry initialization;
+ rtems_device_driver_entry open;
+ rtems_device_driver_entry close;
+ rtems_device_driver_entry read;
+ rtems_device_driver_entry write;
+ rtems_device_driver_entry control;
+@} rtems_driver_address_table;
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+type Driver_Address_Table_Entry is
+ record
+ Initialization : RTEMS.Device_Driver_Entry;
+ Open : RTEMS.Device_Driver_Entry;
+ Close : RTEMS.Device_Driver_Entry;
+ Read : RTEMS.Device_Driver_Entry;
+ Write : RTEMS.Device_Driver_Entry;
+ Control : RTEMS.Device_Driver_Entry;
+ end record;
+
+type Driver_Address_Table is array ( RTEMS.Unsigned32 range <> ) of
+ RTEMS.Driver_Address_Table_Entry;
+
+type Driver_Address_Table_Pointer is access all Driver_Address_Table;
+@end example
+@end ifset
+
+@table @b
+@item initialization
+is the address of the entry point called by
+@code{@value{DIRPREFIX}io_initialize}
+to initialize a device driver and its associated devices.
+
+@item open
+is the address of the entry point called by @code{@value{DIRPREFIX}io_open}.
+
+@item close
+is the address of the entry point called by @code{@value{DIRPREFIX}io_close}.
+
+@item read
+is the address of the entry point called by @code{@value{DIRPREFIX}io_read}.
+
+@item write
+is the address of the entry point called by @code{@value{DIRPREFIX}io_write}.
+
+@item control
+is the address of the entry point called by @code{@value{DIRPREFIX}io_control}.
+
+@end table
+
+Driver entry points configured as NULL will always
+return a status code of @code{@value{RPREFIX}SUCCESSFUL}. No user code will be
+executed in this situation.
+
+A typical declaration for a Device Driver Table might appear as follows:
+
+@ifset is-C
+@example
+rtems_driver_address_table Driver_table[2] = @{
+ @{ tty_initialize, tty_open, tty_close, /* major = 0 */
+ tty_read, tty_write, tty_control
+ @},
+ @{ lp_initialize, lp_open, lp_close, /* major = 1 */
+ NULL, lp_write, lp_control
+ @}
+@};
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+@end example
+@end ifset
+
+More information regarding the construction and
+operation of device drivers is provided in the I/O Manager
+chapter.
+
+@section User Extensions Table
+
+@cindex User Extensions Table
+
+The User Extensions Table is used to inform RTEMS of
+the optional user-supplied static extension set. This table
+contains one entry for each possible extension. The entries are
+called at critical times in the life of the system and
+individual tasks. The application may create dynamic extensions
+in addition to this single static set. The format of each entry
+in the User Extensions Table is defined in the following @value{LANGUAGE}
+@value{STRUCTURE}:
+
+@ifset is-C
+@example
+typedef User_extensions_routine rtems_extension;
+typedef User_extensions_thread_create_extension
+ rtems_task_create_extension;
+typedef User_extensions_thread_delete_extension
+ rtems_task_delete_extension;
+typedef User_extensions_thread_start_extension
+ rtems_task_start_extension;
+typedef User_extensions_thread_restart_extension
+ rtems_task_restart_extension;
+typedef User_extensions_thread_switch_extension
+ rtems_task_switch_extension;
+typedef User_extensions_thread_begin_extension
+ rtems_task_begin_extension;
+typedef User_extensions_thread_exitted_extension
+ rtems_task_exitted_extension;
+typedef User_extensions_fatal_extension rtems_fatal_extension;
+
+typedef User_extensions_Table rtems_extensions_table;
+
+typedef struct @{
+ rtems_task_create_extension thread_create;
+ rtems_task_start_extension thread_start;
+ rtems_task_restart_extension thread_restart;
+ rtems_task_delete_extension thread_delete;
+ rtems_task_switch_extension thread_switch;
+ rtems_task_begin_extension thread_begin;
+ rtems_task_exitted_extension thread_exitted;
+ rtems_fatal_extension fatal;
+@} User_extensions_Table;
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+type Extensions_Table_Entry is
+ record
+ Thread_Create : RTEMS.Thread_Create_Extension;
+ Thread_Start : RTEMS.Thread_Start_Extension;
+ Thread_Restart : RTEMS.Thread_Restart_Extension;
+ Thread_Delete : RTEMS.Thread_Delete_Extension;
+ Thread_Switch : RTEMS.Thread_Switch_Extension;
+ Thread_Post_Switch : RTEMS.Thread_Post_Switch_Extension;
+ Thread_Begin : RTEMS.Thread_Begin_Extension;
+ Thread_Exitted : RTEMS.Thread_Exitted_Extension;
+ Fatal : RTEMS.Fatal_Error_Extension;
+ end record;
+@end example
+@end ifset
+
+@table @b
+
+@item thread_create
+is the address of the
+user-supplied subroutine for the TASK_CREATE extension. If this
+extension for task creation is defined, it is called from the
+task_create directive. A value of NULL indicates that no
+extension is provided.
+
+@item thread_start
+is the address of the user-supplied
+subroutine for the TASK_START extension. If this extension for
+task initiation is defined, it is called from the task_start
+directive. A value of NULL indicates that no extension is
+provided.
+
+@item thread_restart
+is the address of the user-supplied
+subroutine for the TASK_RESTART extension. If this extension
+for task re-initiation is defined, it is called from the
+task_restart directive. A value of NULL indicates that no
+extension is provided.
+
+@item thread_delete
+is the address of the user-supplied
+subroutine for the TASK_DELETE extension. If this RTEMS
+extension for task deletion is defined, it is called from the
+task_delete directive. A value of NULL indicates that no
+extension is provided.
+
+@item thread_switch
+is the address of the user-supplied
+subroutine for the task context switch extension. This
+subroutine is called from RTEMS dispatcher after the current
+task has been swapped out but before the new task has been
+swapped in. A value of NULL indicates that no extension is
+provided. As this routine is invoked after saving the current
+task's context and before restoring the heir task's context, it
+is not necessary for this routine to save and restore any
+registers.
+
+@item thread_begin
+is the address of the user-supplied
+subroutine which is invoked immediately before a task begins
+execution. It is invoked in the context of the beginning task.
+A value of NULL indicates that no extension is provided.
+
+@item thread_exitted
+is the address of the user-supplied
+subroutine which is invoked when a task exits. This procedure
+is responsible for some action which will allow the system to
+continue execution (i.e. delete or restart the task) or to
+terminate with a fatal error. If this field is set to NULL, the
+default RTEMS TASK_EXITTED handler will be invoked.
+
+@item fatal
+is the address of the user-supplied
+subroutine for the FATAL extension. This RTEMS extension of
+fatal error handling is called from the
+@code{@value{DIRPREFIX}fatal_error_occurred}
+directive. If the user's fatal error handler returns or if this
+entry is NULL then the default RTEMS fatal error handler will be
+executed.
+
+@end table
+
+A typical declaration for a User Extension Table
+which defines the TASK_CREATE, TASK_DELETE, TASK_SWITCH, and
+FATAL extension might appear as follows:
+
+@ifset is-C
+@example
+rtems_extensions_table User_extensions = @{
+ task_create_extension,
+ NULL,
+ NULL,
+ task_delete_extension,
+ task_switch_extension,
+ NULL,
+ NULL,
+ fatal_extension
+@};
+@end example
+@end ifset
+
+@ifset is-Ada
+User_Extensions : RTEMS.Extensions_Table := (
+ Task_Create_Extension'Access,
+ null,
+ null,
+ Task_Delete_Extension'Access,
+ Task_Switch_Extension'Access,
+ null,
+ null,
+ Fatal_Extension'Access
+);
+@example
+
+@end example
+@end ifset
+
+More information regarding the user extensions is
+provided in the User Extensions chapter.
+
+@section Multiprocessor Configuration Table
+
+@cindex Multiprocessor Configuration Table
+
+The Multiprocessor Configuration Table contains
+information needed when using RTEMS in a multiprocessor
+configuration. Many of the details associated with configuring
+a multiprocessor system are dependent on the multiprocessor
+communications layer provided by the user. The address of the
+Multiprocessor Configuration Table should be placed in the
+@code{User_multiprocessing_table} entry in the primary Configuration
+Table. Further details regarding many of the entries in the
+Multiprocessor Configuration Table will be provided in the
+Multiprocessing chapter.
+
+
+When using the @code{confdefs.h} mechanism for configuring
+an RTEMS application, the macro @code{CONFIGURE_MP_APPLICATION} must
+be defined to automatically generate the Multiprocessor Configuration Table.
+If @code{CONFIGURE_MP_APPLICATION}, is not defined, then a NULL pointer
+is configured as the address of this table.
+
+The format of the Multiprocessor Configuration Table is defined in
+the following @value{LANGUAGE} @value{STRUCTURE}:
+
+@ifset is-C
+@example
+typedef struct @{
+ rtems_unsigned32 node;
+ rtems_unsigned32 maximum_nodes;
+ rtems_unsigned32 maximum_global_objects;
+ rtems_unsigned32 maximum_proxies;
+ rtems_mpci_table *User_mpci_table;
+@} rtems_multiprocessing_table;
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+type Multiprocessing_Table is
+ record
+ Node : RTEMS.Unsigned32;
+ Maximum_Nodes : RTEMS.Unsigned32;
+ Maximum_Global_Objects : RTEMS.Unsigned32;
+ Maximum_Proxies : RTEMS.Unsigned32;
+ User_MPCI_Table : RTEMS.MPCI_Table_Pointer;
+ end record;
+
+type Multiprocessing_Table_Pointer is access all Multiprocessing_Table;
+@end example
+@end ifset
+
+@table @b
+@item node
+is a unique processor identifier
+and is used in routing messages between nodes in a
+multiprocessor configuration. Each processor must have a unique
+node number. RTEMS assumes that node numbers start at one and
+increase sequentially. This assumption can be used to advantage
+by the user-supplied MPCI layer. Typically, this requirement is
+made when the node numbers are used to calculate the address of
+inter-processor communication links. Zero should be avoided as
+a node number because some MPCI layers use node zero to
+represent broadcasted packets. Thus, it is recommended that
+node numbers start at one and increase sequentially.
+When using the @code{confdefs.h} mechanism for configuring
+an RTEMS application, the value for this field corresponds
+to the setting of the macro @code{CONFIGURE_MP_NODE_NUMBER}.
+If not defined by the application, then the @code{CONFIGURE_MP_NODE_NUMBER}
+macro defaults to the value of the @code{NODE_NUMBER} macro which is
+set on the compiler command line by the RTEMS Multiprocessing Test Suites.
+
+
+@item maximum_nodes
+is the number of processor nodes in the system.
+When using the @code{confdefs.h} mechanism for configuring
+an RTEMS application, the value for this field corresponds
+to the setting of the macro @code{CONFIGURE_MP_MAXIMUM_NODES}.
+If not defined by the application, then the @code{CONFIGURE_MP_MAXIMUM_NODES}
+macro defaults to the value 2.
+
+@item maximum_global_objects
+is the maximum number of global objects which can exist at any
+given moment in the entire system. If this parameter is not the
+same on all nodes in the system, then a fatal error is generated
+to inform the user that the system is inconsistent.
+When using the @code{confdefs.h} mechanism for configuring
+an RTEMS application, the value for this field corresponds
+to the setting of the macro @code{CONFIGURE_MP_MAXIMUM_GLOBAL_OBJECTS}.
+If not defined by the application, then the
+@code{CONFIGURE_MP_MAXIMUM_GLOBAL_OBJECTS} macro defaults to the value 32.
+
+
+@item maximum_proxies
+is the maximum number of proxies which can exist at any given moment
+on this particular node. A proxy is a substitute task control block
+which represent a task residing on a remote node when that task blocks
+on a remote object. Proxies are used in situations in which delayed
+interaction is required with a remote node.
+When using the @code{confdefs.h} mechanism for configuring
+an RTEMS application, the value for this field corresponds
+to the setting of the macro @code{CONFIGURE_MP_MAXIMUM_PROXIES}.
+If not defined by the application, then the @code{CONFIGURE_MP_MAXIMUM_PROXIES}
+macro defaults to the value 32.
+
+
+@item User_mpci_table
+is the address of the Multiprocessor Communications Interface
+Table. This table contains the entry points of user-provided functions
+which constitute the multiprocessor communications layer. This table
+must be provided in multiprocessor configurations with all
+entries configured. The format of this table and details
+regarding its entries can be found in the next section.
+When using the @code{confdefs.h} mechanism for configuring
+an RTEMS application, the value for this field corresponds
+to the setting of the macro @code{CONFIGURE_MP_MPCI_TABLE_POINTER}.
+If not defined by the application, then the
+@code{CONFIGURE_MP_MPCI_TABLE_POINTER} macro defaults to the
+address of the table named @code{MPCI_table}.
+
+
+@end table
+
+@section Multiprocessor Communications Interface Table
+
+@cindex Multiprocessor Communications Interface Table
+
+This table defines the set of callouts that must be provided by
+an Multiprocessor Communications Interface implementation.
+
+When using the @code{confdefs.h} mechanism for configuring
+an RTEMS application, the name of this table is assumed
+to be @code{MPCI_table} unless the application sets
+the @code{CONFIGURE_MP_MPCI_TABLE_POINTER} when configuring a
+multiprocessing system.
+
+The format of this table is defined in
+the following @value{LANGUAGE} @value{STRUCTURE}:
+
+@ifset is-C
+@example
+typedef struct @{
+ rtems_unsigned32 default_timeout; /* in ticks */
+ rtems_unsigned32 maximum_packet_size;
+ rtems_mpci_initialization_entry initialization;
+ rtems_mpci_get_packet_entry get_packet;
+ rtems_mpci_return_packet_entry return_packet;
+ rtems_mpci_send_entry send;
+ rtems_mpci_receive_entry receive;
+@} rtems_mpci_table;
+@end example
+@end ifset
+
+@ifset is-Ada
+@example
+type MPCI_Table is
+ record
+ Default_Timeout : RTEMS.Unsigned32; -- in ticks
+ Maximum_Packet_Size : RTEMS.Unsigned32;
+ Initialization : RTEMS.MPCI_Initialization_Entry;
+ Get_Packet : RTEMS.MPCI_Get_Packet_Entry;
+ Return_Packet : RTEMS.MPCI_Return_Packet_Entry;
+ Send : RTEMS.MPCI_Send_Entry;
+ Receive : RTEMS.MPCI_Receive_Entry;
+ end record;
+
+type MPCI_Table_Pointer is access all MPCI_Table;
+@end example
+@end ifset
+
+@table @b
+@item default_timeout
+is the default maximum length of time a task should block waiting for
+a response to a directive which results in communication with a remote node.
+The maximum length of time is a function the user supplied
+multiprocessor communications layer and the media used. This
+timeout only applies to directives which would not block if the
+operation were performed locally.
+
+@item maximum_packet_size
+is the size in bytes of the longest packet which the MPCI layer is capable
+of sending. This value should represent the total number of bytes available
+for a RTEMS interprocessor messages.
+
+@item initialization
+is the address of the entry point for the initialization procedure of the
+user supplied multiprocessor communications layer.
+
+@item get_packet
+is the address of the entry point for the procedure called by RTEMS to
+obtain a packet from the user supplied multiprocessor communications layer.
+
+@item return_packet
+is the address of the entry point for the procedure called by RTEMS to
+return a packet to the user supplied multiprocessor communications layer.
+
+@item send
+is the address of the entry point for the procedure called by RTEMS to
+send an envelope to another node. This procedure is part of the user
+supplied multiprocessor communications layer.
+
+@item receive
+is the address of the entry point for the
+procedure called by RTEMS to retrieve an envelope containing a
+message from another node. This procedure is part of the user
+supplied multiprocessor communications layer.
+
+@end table
+
+More information regarding the required functionality of these
+entry points is provided in the Multiprocessor chapter.
+
+@section Determining Memory Requirements
+
+Since memory is a critical resource in many real-time
+embedded systems, the RTEMS Classic API was specifically designed to allow
+unused managers to be forcibly excluded from the run-time environment.
+This allows the application designer the flexibility to tailor
+RTEMS to most efficiently meet system requirements while still
+satisfying even the most stringent memory constraints. As
+result, the size of the RTEMS executive is application
+dependent. A Memory Requirements worksheet is provided in the
+Applications Supplement document for a specific target
+processor. This worksheet can be used to calculate the memory
+requirements of a custom RTEMS run-time environment. To insure
+that enough memory is allocated for future versions of RTEMS,
+the application designer should round these memory requirements
+up. The following Classic API managers may be optionally excluded:
+
+@itemize @bullet
+@item signal
+@item region
+@item dual ported memory
+@item event
+@item multiprocessing
+@item partition
+@item timer
+@item semaphore
+@item message
+@item rate monotonic
+@end itemize
+
+RTEMS is designed to be built and installed as a library
+that is linked into the application. As such, much of
+RTEMS is implemented in such a way that there is a single
+entry point per source file. This avoids having the
+linker being forced to pull large object files in their
+entirety into an application when the application references
+a single symbol.
+
+RTEMS based applications must somehow provide memory
+for RTEMS' code and data space. Although RTEMS' data space must
+be in RAM, its code space can be located in either ROM or RAM.
+In addition, the user must allocate RAM for the RTEMS RAM
+Workspace. The size of this area is application dependent and
+can be calculated using the formula provided in the Memory
+Requirements chapter of the Applications Supplement document
+for a specific target processor.
+
+All private RTEMS data variables and routine names used by
+RTEMS begin with the underscore ( _ ) character followed by an
+upper-case letter. If RTEMS is linked with an application, then
+the application code should NOT contain any symbols which begin
+with the underscore character and followed by an upper-case
+letter to avoid any naming conflicts. All RTEMS directive names
+should be treated as reserved words.
+
+@section Sizing the RTEMS RAM Workspace
+
+The RTEMS RAM Workspace is a user-specified block of
+memory reserved for use by RTEMS. The application should NOT
+modify this memory. This area consists primarily of the RTEMS
+data structures whose exact size depends upon the values
+specified in the Configuration Table. In addition, task stacks
+and floating point context areas are dynamically allocated from
+the RTEMS RAM Workspace.
+
+The @code{confdefs.h} mechanism calcalutes the size
+of the RTEMS RAM Workspace automatically. It assumes that
+all tasks are floating point and that all will be allocated
+the miminum stack space. This calculation also automatically
+includes the memory that will be allocated for internal use
+by RTEMS. The following macros may be set
+by the application to make the calculation
+of memory required more accurate:
+
+@itemize @bullet
+
+@item @code{CONFIGURE_MEMORY_OVERHEAD}
+@item @code{CONFIGURE_EXTRA_TASK_STACKS}
+
+@end itemize
+
+The starting address of the RTEMS RAM Workspace must
+be aligned on a four-byte boundary. Failure to properly align
+the workspace area will result in the
+@code{@value{DIRPREFIX}fatal_error_occurred}
+directive being invoked with the
+@code{@value{RPREFIX}INVALID_ADDRESS} error code.
+
+A worksheet is provided in the @b{Memory Requirements}
+chapter of the Applications Supplement document for a specific
+target processor to assist the user in calculating the minimum
+size of the RTEMS RAM Workspace for each application. The value
+calculated with this worksheet is the minimum value that should
+be specified as the @code{work_space_size} parameter of the
+Configuration Table.
+
+The allocation of objects can operate in two modes. The default mode
+has an object number ceiling. No more than the specified number of
+objects can be allocated from the RTEMS RAM Workspace. The number of objects
+specified in the particular API Configuration table fields are
+allocated at initialisation. The second mode allows the number of
+objects to grow to use the available free memory in the RTEMS RAM Workspace.
+
+The auto-extending mode can be enabled individually for each object
+type by using the macro @code{rtems_resource_unlimited}. This takes a value
+as a parameter, and is used to set the object maximum number field in
+an API Configuration table. The value is an allocation unit size. When
+RTEMS is required to grow the object table it is grown by this
+size. The kernel will return the object memory back to the RTEMS RAM Workspace
+when an object is destroyed. The kernel will only return an allocated
+block of objects to the RTEMS RAM Workspace if at least half the allocation
+size of free objects remain allocated. RTEMS always keeps one
+allocation block of objects allocated. Here is an example of using
+@code{rtems_resource_unlimited}:
+
+@example
+#define CONFIGURE_MAXIMUM_TASKS rtems_resource_unlimited(5)
+@end example
+
+The user is cautioned that future versions of RTEMS may not have the
+same memory requirements per object. Although the value calculated is
+suficient for a particular target processor and release of RTEMS,
+memory usage is subject to change across versions and target
+processors. The user is advised to allocate somewhat more memory than
+the worksheet recommends to insure compatibility with future releases
+for a specific target processor and other target processors. To avoid
+problems, the user should recalculate the memory requirements each
+time one of the following events occurs:
+
+@itemize @bullet
+@item a configuration parameter is modified,
+@item task or interrupt stack requirements change,
+@item task floating point attribute is altered,
+@item RTEMS is upgraded, or
+@item the target processor is changed.
+@end itemize
+
+Failure to provide enough space in the RTEMS RAM
+Workspace will result in the
+@code{@value{DIRPREFIX}fatal_error_occurred} directive
+being invoked with the appropriate error code.