summaryrefslogblamecommitdiffstats
path: root/cpukit/sapi/include/rtems/config.h
blob: 25ddfda42146e48dd4e4c65493499aac44514966 (plain) (tree)
1
2
3
4
5
6
7
8
9

                       


                                                                     
   
 
  
                            
                                                    
  

                                                           
                                         



        

                       




                  
  


                                                                             

                                                                    



                                                         
 

                                            
 
  
                                                                      
                                    


                      
                               
     


                                            

                               

                            
                                  
                             
      
 
                                  





                                                                    
                







                                                       
 
                                                                    




                                                                   

                                                           
                              
      
 























                                                                          






                                                              

                                       
                                                                    
   
                

                                                                   
                                                  


                                                                    
                                                 
 



                                                                             


                                                                      
                                                    



                                                                  
                                                       


                                                                        
                                                     



                                                                            
                                                         






                                                                               





                                                                            

                                                              
     
                                                          
 

                                               
     





                                                     


                                                                            
                                                                      

              
                                                      
 
















                                                                               




                                                              


                                                              
                            
 

                                                             
   
                                                
 
                                  


                                                              

                                                                    
 










                                                                       




                                                             
                                         
                        
 











                                                                     
                                                    
                                        
 


                                                                   
                                                   





                                                                          

                                                      
                                          

                                                         
                                             
                                                         
                                                    

                                                        

                                                       
                                           
 
                                             
                                 

                                                        
                                            
 
                                                   




                                                    
                                                        
                                            
 


                                                            
                                                       
                                           

                                                   
                                       
 




                                                                     
                                       
 
                                                            
                                                

                                                       
                                           

                                                                
                                                    

                                                        
                                            
 

                                                                
                                                  
     

                                                                
      

                                                           
                                  

                                                           
                                  
 





                         
/**
 * @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.
 *
 *  $Id$
 */

#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 )

/*
 *  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 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.microseconds_per_tick * 1000)

#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 */