blob: 58b350da762bc27203caee082224abfef484819b (
plain) (
tree)
|
|
/**
* @file rtems/config.h
*
* This include file contains the table of user defined configuration
* parameters.
*/
/*
* COPYRIGHT (c) 1989-2011.
* On-Line Applications Research Corporation (OAR).
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.rtems.com/license/LICENSE.
*/
#ifndef _RTEMS_CONFIG_H
#define _RTEMS_CONFIG_H
#ifdef __cplusplus
extern "C" {
#endif
/*
* Unlimited object support. Changes the configuration table entry for POSIX
* or RTEMS APIs to bounded only by the memory of the work-space.
*
* Use the macro to define the resource unlimited before placing in
* the configuration table.
*/
#include <rtems/score/object.h>
#define RTEMS_UNLIMITED_OBJECTS OBJECTS_UNLIMITED_OBJECTS
#define rtems_resource_unlimited(resource) \
( resource | RTEMS_UNLIMITED_OBJECTS )
#define rtems_resource_is_unlimited(resource) \
_Objects_Is_unlimited(resource)
#define rtems_resource_maximum_per_allocation(resource) \
_Objects_Maximum_per_allocation(resource)
/*
* This is kind of kludgy but it allows targets to totally ignore the
* optional APIs like POSIX safely.
*/
#ifdef RTEMS_POSIX_API
#include <rtems/posix/config.h>
#else
typedef void *posix_api_configuration_table;
#endif
#include <rtems/rtems/config.h>
#include <rtems/extension.h>
#include <rtems/io.h>
#if defined(RTEMS_MULTIPROCESSING)
#include <rtems/score/mpci.h>
#endif
#if defined(RTEMS_MULTIPROCESSING)
/*
* The following records define the Multiprocessor Configuration
* Table. This table defines the multiprocessor system
* characteristics which must be known by RTEMS in a multiprocessor
* system.
*/
typedef struct {
/** This is the local node number. */
uint32_t node;
/** This is the maximum number of nodes in system. */
uint32_t maximum_nodes;
/** This is the maximum number of global objects. */
uint32_t maximum_global_objects;
/** This is the maximum number of proxies. */
uint32_t maximum_proxies;
/** The MPCI Receive server is assumed to have a stack of at least
* minimum stack size. This field specifies the amount of extra
* stack this task will be given in bytes.
*/
uint32_t extra_mpci_receive_server_stack;
/** This is a pointer to User/BSP provided MPCI Table. */
rtems_mpci_table *User_mpci_table;
} rtems_multiprocessing_table;
#endif
/**
* @brief Task stack allocator initialization hook.
*
* @param[in] stack_space_size Size of the stack space in bytes.
*/
typedef void (*rtems_stack_allocate_init_hook)( size_t stack_space_size );
/**
* @brief Task stack allocator hook.
*
* @param[in] stack_size Size of the task stack in bytes.
*
* @retval NULL Not enough memory.
* @retval other Pointer to task stack.
*/
typedef void *(*rtems_stack_allocate_hook)( size_t stack_size );
/**
* @brief Task stack deallocator hook.
*
* @param[in] addr Pointer to previously allocated task stack.
*/
typedef void (*rtems_stack_free_hook)( void *addr );
/*
* The following records define the Configuration Table. The
* information contained in this table is required in all
* RTEMS systems, whether single or multiprocessor. This
* table primarily defines the following:
*
* + location and size of the RTEMS Workspace
* + microseconds per clock tick
* + clock ticks per task timeslice
* + required number of each object type for each API configured
*/
typedef struct {
/** This field specifies the base address of the RTEMS Workspace.
*/
void *work_space_start;
/** This field specifies the size in bytes of the RTEMS Workspace.
*/
uintptr_t work_space_size;
/** This field specifies the size in bytes of the RTEMS thread stack space.
*/
uintptr_t stack_space_size;
/** This field specifies the maximum number of dynamically installed
* used extensions.
*/
uint32_t maximum_extensions;
/** This field specifies the number of microseconds which elapse
* between clock ticks. This is the basis for RTEMS timing.
*/
uint32_t microseconds_per_tick;
/** This field specifies the number of nanoseconds which elapse
* between clock ticks. This value is derived from the
* microseconds_per_tick field and provided to avoid calculation at
* run-time.
*/
uint32_t nanoseconds_per_tick;
/** This field specifies the number of ticks in each task's timeslice.
*/
uint32_t ticks_per_timeslice;
/** This element points to the BSP's optional idle task which may override
* the default one provided with RTEMS.
*/
Thread (*idle_task)( uintptr_t );
/** This field specifies the size of the IDLE task's stack. If less than or
* equal to the minimum stack size, then the IDLE task will have the minimum
* stack size.
*/
uint32_t idle_task_stack_size;
/** This field specifies the size of the interrupt stack. If less than or
* equal to the minimum stack size, then the interrupt stack will be of
* minimum stack size.
*/
uint32_t interrupt_stack_size;
/**
* @brief Optional task stack allocator initialization hook.
*/
rtems_stack_allocate_init_hook stack_allocate_init_hook;
/**
* @brief Optional task stack allocator hook.
*/
rtems_stack_allocate_hook stack_allocate_hook;
/**
* @brief Optional task stack free hook.
*/
rtems_stack_free_hook stack_free_hook;
/** If this element is TRUE, then RTEMS will zero the Executive Workspace.
* When this element is FALSE, it is assumed that the BSP or invoking
* environment has ensured that memory was cleared before RTEMS was
* invoked.
*/
bool do_zero_of_workspace;
/**
* @brief Specifies if a unified work area is used or not.
*
* If this element is @a true, then the RTEMS Workspace and the C Program
* Heap use the same heap, otherwise they use separate heaps.
*/
bool unified_work_area;
/**
* @brief Specifies if the stack allocator avoids the work space.
*
* If this element is @a true, then the stack allocator must not allocate the
* thread stacks from the RTEMS Workspace, otherwise it should allocate the
* thread stacks from the RTEMS Workspace.
*/
bool stack_allocator_avoids_work_space;
uint32_t maximum_drivers;
uint32_t number_of_device_drivers;
rtems_driver_address_table *Device_driver_table;
uint32_t number_of_initial_extensions;
rtems_extensions_table *User_extension_table;
#if defined(RTEMS_MULTIPROCESSING)
rtems_multiprocessing_table *User_multiprocessing_table;
#endif
} rtems_configuration_table;
/**
* This is the configuration table generated by confdefs.h.
*/
extern rtems_configuration_table Configuration;
#if defined(RTEMS_MULTIPROCESSING)
/**
* This points to the multiprocessing configuration table.
*/
SAPI_EXTERN rtems_multiprocessing_table *_Configuration_MP_table;
#endif
#if defined(RTEMS_MULTIPROCESSING)
/**
* @brief RTEMS Multiprocessing Configuration Table
*
* This is the RTEMS Multiprocessing Configuration Table expected to
* be generated by confdefs.h.
*/
extern rtems_multiprocessing_table Multiprocessing_configuration;
#endif
/*
* Some handy macros to avoid dependencies on either the BSP
* or the exact format of the configuration table.
*/
#define rtems_configuration_get_table() \
(&Configuration)
#define rtems_configuration_get_unified_work_area() \
(Configuration.unified_work_area)
#define rtems_configuration_get_stack_allocator_avoids_work_space() \
(Configuration.stack_allocator_avoids_work_space)
#define rtems_configuration_get_stack_space_size() \
(Configuration.stack_space_size)
#define rtems_configuration_set_stack_space_size( _size ) \
do { Configuration.stack_space_size = (_size); } while (0)
#define rtems_configuration_get_work_space_start() \
(Configuration.work_space_start)
#define rtems_configuration_set_work_space_start( _start ) \
do { Configuration.work_space_start = (_start); } while (0)
#define rtems_configuration_get_work_space_size() \
(Configuration.work_space_size + \
(rtems_configuration_get_stack_allocator_avoids_work_space() ? \
0 : rtems_configuration_get_stack_space_size()))
#define rtems_configuration_set_work_space_size( _size ) \
do { Configuration.work_space_size = (_size); } while (0)
#define rtems_configuration_get_maximum_extensions() \
(Configuration.maximum_extensions)
#define rtems_configuration_get_microseconds_per_tick() \
(Configuration.microseconds_per_tick)
#define rtems_configuration_get_milliseconds_per_tick() \
(Configuration.microseconds_per_tick / 1000)
#define rtems_configuration_get_nanoseconds_per_tick() \
(Configuration.nanoseconds_per_tick)
#define rtems_configuration_set_microseconds_per_tick( _us ) \
do { \
Configuration.microseconds_per_tick = (_us); \
Configuration.nanoseconds_per_tick = \
1000 * Configuration.microseconds_per_tick; \
} while (0)
#define rtems_configuration_get_ticks_per_timeslice() \
(Configuration.ticks_per_timeslice)
#define rtems_configuration_get_idle_task() \
(Configuration.idle_task)
#define rtems_configuration_get_idle_task_stack_size() \
(Configuration.idle_task_stack_size)
/* XXX We need to get this from the generated table
* since BSPs need it before the pointer is set.
* Eventually all should be done this way.
*/
extern rtems_configuration_table Configuration;
#define rtems_configuration_get_interrupt_stack_size() \
(Configuration.interrupt_stack_size)
#define rtems_configuration_get_stack_allocate_init_hook() \
(Configuration.stack_allocate_init_hook)
#define rtems_configuration_get_stack_allocate_hook() \
(Configuration.stack_allocate_hook)
#define rtems_configuration_get_stack_free_hook() \
(Configuration.stack_free_hook)
/**
* This macro assists in accessing the field which indicates whether
* RTEMS is responsible for zeroing the Executive Workspace.
*/
#define rtems_configuration_get_do_zero_of_workspace() \
(Configuration.do_zero_of_workspace)
#define rtems_configuration_get_number_of_device_drivers() \
(Configuration.number_of_device_drivers)
#define rtems_configuration_get_device_driver_table() \
(Configuration.Device_driver_table)
#define rtems_configuration_get_number_of_initial_extensions() \
(Configuration.number_of_initial_extensions)
#define rtems_configuration_get_user_extension_table() \
(Configuration.User_extension_table)
#if defined(RTEMS_MULTIPROCESSING)
#define rtems_configuration_get_user_multiprocessing_table() \
(Configuration.User_multiprocessing_table)
#else
#define rtems_configuration_get_user_multiprocessing_table() \
NULL
#endif
#define rtems_configuration_get_rtems_api_configuration() \
(&Configuration_RTEMS_API)
#define rtems_configuration_get_posix_api_configuration() \
(&Configuration_POSIX_API)
#ifdef __cplusplus
}
#endif
#endif
/* end of include file */
|