source: rtems/cpukit/sapi/include/confdefs.h @ 742a2ba

4.115
Last change on this file since 742a2ba was 82db8e56, checked in by Joel Sherrill <joel.sherrill@…>, on 09/15/11 at 15:49:32

2011-09-15 Petr Benes <benesp16@…>

PR 1906/cpukit

  • sapi/Makefile.am, sapi/preinstall.am, sapi/include/confdefs.h, score/Makefile.am, score/preinstall.am: Add the CBS (Constant Bandwidth Server) scheduler. This is a complex scheduling policy built atop of the EDF scheduler. Unlike other schedulers, this one provides a user API and handles not only deadlines of tasks but also claimed budget per period. The main aim of the scheduler is isolation of tasks so that each task is guaranteed to meet all deadlines regardless of how other tasks behave.
  • sapi/include/rtems/cbs.h, sapi/inline/rtems/cbs.inl, score/include/rtems/score/schedulercbs.h, score/src/schedulercbs.c, score/src/schedulercbsattachthread.c, score/src/schedulercbscleanup.c, score/src/schedulercbscreateserver.c, score/src/schedulercbsdestroyserver.c, score/src/schedulercbsdetachthread.c, score/src/schedulercbsgetapprovedbudget.c, score/src/schedulercbsgetexecutiontime.c, score/src/schedulercbsgetparameters.c, score/src/schedulercbsgetremainingbudget.c, score/src/schedulercbsgetserverid.c, score/src/schedulercbsreleasejob.c, score/src/schedulercbssetparameters.c, score/src/schedulercbsunblock.c: New files.
  • Property mode set to 100644
File size: 79.0 KB
Line 
1/**
2 * @file rtems/confdefs.h
3 *
4 *  This include file contains the configuration table template that will
5 *  be instantiated by an application based on the setting of a number
6 *  of macros.  The macros are documented in the Configuring a System
7 *  chapter of the Classic API User's Guide
8 *
9 *  The model is to estimate the memory required for each configured item
10 *  and sum those estimates.  The estimate can be too high or too low for
11 *  a variety of reasons:
12 *
13 *  Reasons estimate is too high:
14 *    + FP contexts (not all tasks are FP)
15 *
16 *  Reasons estimate is too low:
17 *    + stacks greater than minimum size
18 *    + messages
19 *    + application must account for device driver resources
20 *    + application must account for add-on library resource requirements
21 *
22 *  NOTE:  Eventually this may be able to take into account some of
23 *         the above.  This procedure has evolved from just enough to
24 *         support the RTEMS Test Suites into something that can be
25 *         used remarkably reliably by most applications.
26 */
27
28/*
29 *  COPYRIGHT (c) 1989-2011.
30 *  On-Line Applications Research Corporation (OAR).
31 *
32 *  The license and distribution terms for this file may be
33 *  found in the file LICENSE in this distribution or at
34 *  http://www.rtems.com/license/LICENSE.
35 *
36 *  $Id$
37 */
38
39#ifndef __CONFIGURATION_TEMPLATE_h
40#define __CONFIGURATION_TEMPLATE_h
41
42/*
43 * Include the executive's configuration
44 */
45#include <rtems.h>
46#include <rtems/score/apimutex.h>
47
48#ifdef __cplusplus
49extern "C" {
50#endif
51
52extern rtems_initialization_tasks_table Initialization_tasks[];
53extern rtems_driver_address_table       Device_drivers[];
54extern rtems_configuration_table        Configuration;
55#if defined(RTEMS_MULTIPROCESSING)
56  extern rtems_multiprocessing_table      Multiprocessing_configuration;
57#endif
58#ifdef RTEMS_POSIX_API
59  extern posix_api_configuration_table    Configuration_POSIX_API;
60#endif
61
62/**
63 *  This macro determines whether the RTEMS reentrancy support for
64 *  the Newlib C Library is enabled.
65 */
66#ifdef RTEMS_SCHEDSIM
67  #undef RTEMS_NEWLIB
68#endif
69
70#if (defined(RTEMS_NEWLIB) && !defined(CONFIGURE_DISABLE_NEWLIB_REENTRANCY))
71  #define CONFIGURE_NEWLIB_EXTENSION 1
72#else
73  #define CONFIGURE_NEWLIB_EXTENSION 0
74#endif
75
76#ifndef RTEMS_SCHEDSIM
77#include <rtems/libio.h>
78
79#ifdef CONFIGURE_INIT
80rtems_libio_init_functions_t rtems_libio_init_helper =
81    #ifdef CONFIGURE_APPLICATION_DISABLE_FILESYSTEM
82    NULL;
83    #else
84    rtems_libio_init;
85    #endif
86
87rtems_libio_supp_functions_t rtems_libio_supp_helper =
88    #ifdef CONFIGURE_APPLICATION_DISABLE_FILESYSTEM
89    NULL;
90    #else
91    open_dev_console;
92    #endif
93
94rtems_fs_init_functions_t    rtems_fs_init_helper =
95    #ifdef CONFIGURE_APPLICATION_DISABLE_FILESYSTEM
96    NULL;
97    #else
98    rtems_filesystem_initialize;
99    #endif
100#endif
101#endif
102
103/*
104 *  If the application disables the filesystem, they will not need
105 *  a mount table, so do not produce one.
106 */
107#ifdef CONFIGURE_APPLICATION_DISABLE_FILESYSTEM
108  #define CONFIGURE_HAS_OWN_MOUNT_TABLE
109#endif
110
111/**
112 *  This macro defines the number of POSIX file descriptors allocated
113 *  and managed by libio.  These are the "integer" file descriptors that
114 *  are used by calls like open(2) and read(2).
115 */
116#ifndef CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS
117  #define CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS 3
118#endif
119
120/**
121 *  From the number of file descriptors, we can determine how many
122 *  semaphores the implementation will require.
123 */
124#define CONFIGURE_LIBIO_SEMAPHORES \
125  (CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS + 1)
126
127#ifdef CONFIGURE_INIT
128  /**
129   *  When instantiating the configuration tables, this variable is
130   *  initialized to specify the maximum number of file descriptors.
131   */
132  uint32_t rtems_libio_number_iops = CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS;
133#endif
134
135/**
136 *  This macro determines if termios is disabled by this application.
137 *  This only means that resources will not be reserved.  If you end
138 *  up using termios, it will fail.
139 */
140#ifdef CONFIGURE_TERMIOS_DISABLED
141  #define CONFIGURE_TERMIOS_SEMAPHORES 0
142#else
143  /**
144   *  This macro specifies the number of serial or PTY ports that will
145   *  use termios.
146   */
147  #ifndef CONFIGURE_NUMBER_OF_TERMIOS_PORTS
148  #define CONFIGURE_NUMBER_OF_TERMIOS_PORTS 1
149  #endif
150
151  /**
152   *  This macro reserves the number of semaphores required by termios
153   *  based upon the number of communication ports that will use it.
154   */
155  #define CONFIGURE_TERMIOS_SEMAPHORES \
156    ((CONFIGURE_NUMBER_OF_TERMIOS_PORTS * 4) + 1)
157#endif
158
159/**
160 *  This macro specifies the number of PTYs that can be concurrently
161 *  active.
162 */
163#ifndef CONFIGURE_MAXIMUM_PTYS
164  #define CONFIGURE_MAXIMUM_PTYS 0
165#endif
166
167/**
168 *  This variable contains the maximum number of PTYs that can be
169 *  concurrently active.
170 */
171#ifdef CONFIGURE_INIT
172  int rtems_telnetd_maximum_ptys = CONFIGURE_MAXIMUM_PTYS;
173#else
174  extern int rtems_telnetd_maximum_ptys;
175#endif
176
177#if defined(RTEMS_SMP)
178  /*
179   *  If configured for SMP, then we need to know the maximum CPU cores.
180   */
181  #if !defined(CONFIGURE_SMP_APPLICATION)
182    #if !defined(CONFIGURE_SMP_MAXIMUM_PROCESSORS)
183      #define CONFIGURE_SMP_MAXIMUM_PROCESSORS 1
184    #endif
185  #else
186    #if !defined(CONFIGURE_SMP_MAXIMUM_PROCESSORS)
187      #error "CONFIGURE_SMP_MAXIMUM_PROCESSORS not specified for SMP Application"
188    #endif
189  #endif
190#endif
191
192/*
193 *  Filesystems and Mount Table Configuration.
194 *
195 *  Defines to control the file system:
196 *
197 *   CONFIGURE_APPLICATION_DISABLE_FILESYSTEM:
198 *     Disable the RTEMS filesystems. You get an empty DEVFS.
199 *
200 *   CONFIGURE_USE_DEVFS_AS_BASE_FILESYSTEM:
201 *     Use the DEVFS as the root file system. Limited functions are
202 *     provided when this is used.
203 *
204 *   CONFIGURE_FILESYSTEM_ALL:
205 *     Add file filesystems to the default filesystem table.
206 *
207 *   List of available file systems. You can define as many as you like:
208 *     CONFIGURE_FILESYSTEM_MINIIMFS - MiniIMFS, use DEVFS now
209 *     CONFIGURE_FILESYSTEM_IMFS     - In Memory File System (IMFS)
210 *     CONFIGURE_FILESYSTEM_DEVFS    - Device File System (DSVFS)
211 *     CONFIGURE_FILESYSTEM_TFTPFS   - TFTP File System, networking enabled
212 *     CONFIGURE_FILESYSTEM_FTPFS    - FTP File System, networking enabled
213 *     CONFIGURE_FILESYSTEM_NFS      - Network File System, networking enabled
214 *     CONFIGURE_FILESYSTEM_DOSFS    - DOS File System, uses libblock
215 *     CONFIGURE_FILESYSTEM_RFS      - RTEMS File System (RFS), uses libblock
216 *
217 *   Combinations:
218 *
219 *    - If nothing is defined the base file system is the IMFS.
220 *
221 *    - If CONFIGURE_APPLICATION_DISABLE_FILESYSTEM is defined all filesystem
222 *      are disabled by force and an empty DEVFS is created.
223 *
224 *    - If CONFIGURE_USE_DEV_AS_BASE_FILESYSTEM is defined all filesystem
225 *      are disabled by force and DEVFS is defined.
226 */
227
228#ifdef CONFIGURE_INIT
229
230  /*
231   * Include all file systems. Do this before checking if the filesystem has
232   * been disabled.
233   */
234  #ifdef CONFIGURE_FILESYSTEM_ALL
235    #define CONFIGURE_FILESYSTEM_MINIIMFS
236    #define CONFIGURE_FILESYSTEM_IMFS
237    #define CONFIGURE_FILESYSTEM_DEVFS
238    #define CONFIGURE_FILESYSTEM_TFTPFS
239    #define CONFIGURE_FILESYSTEM_FTPFS
240    #define CONFIGURE_FILESYSTEM_NFS
241    #define CONFIGURE_FILESYSTEM_DOSFS
242    #define CONFIGURE_FILESYSTEM_RFS
243  #endif
244
245  /*
246   * If disabling the file system, give a compile error if the user has
247   * configured other filesystem parameters.
248   */
249  #if defined(CONFIGURE_APPLICATION_DISABLE_FILESYSTEM)
250     #if defined(CONFIGURE_USE_DEVFS_AS_BASE_FILESYSTEM) || \
251         defined(CONFIGURE_USE_MINIIMFS_AS_BASE_FILESYSTEM)
252       #error "Filesystem disabled but a base filesystem configured."
253     #endif
254
255    #if defined(CONFIGURE_FILESYSTEM_MINIIMFS) || \
256        defined(CONFIGURE_FILESYSTEM_IMFS) || \
257        defined(CONFIGURE_FILESYSTEM_DEVFS) || \
258        defined(CONFIGURE_FILESYSTEM_TFTPFS) || \
259        defined(CONFIGURE_FILESYSTEM_FTPFS) || \
260        defined(CONFIGURE_FILESYSTEM_NFS) || \
261        defined(CONFIGURE_FILESYSTEM_DOSFS) || \
262        defined(CONFIGURE_FILESYSTEM_RFS)
263        #error "Configured filesystems but root filesystem was not IMFS!"
264        #error "Filesystems could be disabled, DEVFS is root, or"
265        #error "  miniIMFS is root!"
266     #endif
267  #endif
268
269  /*
270   * If the base filesystem is DEVFS define it else define IMFS.
271   * We will have either DEVFS or IMFS defined after this.
272   */
273  #if !defined(CONFIGURE_APPLICATION_DISABLE_FILESYSTEM)
274    #if defined(CONFIGURE_USE_DEVFS_AS_BASE_FILESYSTEM)
275      #define CONFIGURE_FILESYSTEM_DEVFS
276    #elif defined(CONFIGURE_USE_MINIIMFS_AS_BASE_FILESYSTEM)
277      #define CONFIGURE_FILESYSTEM_MINIIMFS
278    #elif !defined(CONFIGURE_FILESYSTEM_IMFS)
279      #define CONFIGURE_FILESYSTEM_IMFS
280    #endif
281  #endif
282
283#endif
284
285#ifndef RTEMS_SCHEDSIM
286/**
287 * IMFS
288 */
289#include <rtems/imfs.h>
290
291/**
292 *  This specifies the number of bytes per block for files within the IMFS.
293 *  There are a maximum number of blocks per file so this dictates the maximum
294 *  size of a file.  This has to be balanced with the unused portion of each
295 *  block that might be wasted.
296 */
297#ifndef CONFIGURE_IMFS_MEMFILE_BYTES_PER_BLOCK
298  #define CONFIGURE_IMFS_MEMFILE_BYTES_PER_BLOCK \
299                    IMFS_MEMFILE_DEFAULT_BYTES_PER_BLOCK
300#endif
301
302/**
303 *  This defines the miniIMFS file system table entry.
304 */
305#if !defined(CONFIGURE_FILESYSTEM_ENTRY_miniIMFS) && \
306    defined(CONFIGURE_FILESYSTEM_MINIIMFS)
307  #define CONFIGURE_FILESYSTEM_ENTRY_miniIMFS \
308    { RTEMS_FILESYSTEM_TYPE_MINIIMFS, miniIMFS_initialize }
309#endif
310#endif
311
312/**
313 *  Internall it is called FIFOs not pipes
314 */
315#if defined(CONFIGURE_PIPES_ENABLED)
316  #define CONFIGURE_FIFOS_ENABLED
317#endif
318
319#ifndef RTEMS_SCHEDSIM
320/**
321 *  This defines the IMFS file system table entry.
322 */
323#if !defined(CONFIGURE_FILESYSTEM_ENTRY_IMFS) && \
324    defined(CONFIGURE_FILESYSTEM_IMFS)
325  #if defined(CONFIGURE_FIFOS_ENABLED)
326    #define CONFIGURE_FILESYSTEM_ENTRY_IMFS \
327      { RTEMS_FILESYSTEM_TYPE_IMFS, fifoIMFS_initialize }
328  #else
329    #define CONFIGURE_FILESYSTEM_ENTRY_IMFS \
330      { RTEMS_FILESYSTEM_TYPE_IMFS, IMFS_initialize }
331  #endif
332#endif
333#endif
334
335/**
336 *  This sets up the resources for the PIPES/FIFOs
337 */
338#if defined(CONFIGURE_FIFOS_ENABLED)
339  #if !defined(CONFIGURE_MAXIMUM_FIFOS) && !defined(CONFIGURE_MAXIMUM_PIPES)
340     #error "No FIFOs or PIPES configured"
341  #endif
342  #if !defined(CONFIGURE_MAXIMUM_FIFOS)
343    #define CONFIGURE_MAXIMUM_FIFOS 0
344  #endif
345  #if !defined(CONFIGURE_MAXIMUM_PIPES)
346    #define CONFIGURE_MAXIMUM_PIPES 0
347  #endif
348  #define CONFIGURE_BARRIERS_FOR_FIFOS \
349    (2 * (CONFIGURE_MAXIMUM_FIFOS + CONFIGURE_MAXIMUM_PIPES))
350  #define CONFIGURE_SEMAPHORES_FOR_FIFOS \
351    (1 + (CONFIGURE_MAXIMUM_FIFOS + CONFIGURE_MAXIMUM_PIPES))
352#else
353  #define CONFIGURE_BARRIERS_FOR_FIFOS   0
354  #define CONFIGURE_SEMAPHORES_FOR_FIFOS 0
355#endif
356
357/**
358 * DEVFS
359 */
360#if !defined(CONFIGURE_FILESYSTEM_ENTRY_DEVFS) && \
361    defined(CONFIGURE_FILESYSTEM_DEVFS)
362#include <rtems/devfs.h>
363  #define CONFIGURE_FILESYSTEM_ENTRY_DEVFS \
364    { RTEMS_FILESYSTEM_TYPE_DEVFS, devFS_initialize }
365#endif
366
367#ifdef RTEMS_NETWORKING
368  /**
369   * FTPFS
370   */
371  #if !defined(CONFIGURE_FILESYSTEM_ENTRY_FTPFS) && \
372      defined(CONFIGURE_FILESYSTEM_FTPFS)
373    #include <rtems/ftpfs.h>
374    #define CONFIGURE_FILESYSTEM_ENTRY_FTPFS \
375      { RTEMS_FILESYSTEM_TYPE_FTPFS, rtems_ftpfs_initialize }
376  #endif
377
378  /**
379   * TFTPFS
380   */
381  #if !defined(CONFIGURE_FILESYSTEM_ENTRY_TFTPFS) && \
382      defined(CONFIGURE_FILESYSTEM_TFTPFS)
383    #include <rtems/tftp.h>
384    #define CONFIGURE_FILESYSTEM_ENTRY_TFTPFS \
385      { RTEMS_FILESYSTEM_TYPE_TFTPFS, rtems_tftpfs_initialize }
386  #endif
387
388  /**
389   * NFS
390   */
391  #if !defined(CONFIGURE_FILESYSTEM_ENTRY_NFS) && \
392      defined(CONFIGURE_FILESYSTEM_NFS)
393    #include <librtemsNfs.h>
394    #define CONFIGURE_FILESYSTEM_ENTRY_NFS \
395      { RTEMS_FILESYSTEM_TYPE_NFS, rtems_nfs_initialize }
396  #endif
397#endif
398
399/**
400 * DOSFS
401 */
402#if !defined(CONFIGURE_FILESYSTEM_ENTRY_DOSFS) && \
403    defined(CONFIGURE_FILESYSTEM_DOSFS)
404  #include <rtems/dosfs.h>
405  #define CONFIGURE_FILESYSTEM_ENTRY_DOSFS \
406    { RTEMS_FILESYSTEM_TYPE_DOSFS, rtems_dosfs_initialize }
407#endif
408
409/**
410 * RFS
411 */
412#if !defined(CONFIGURE_FILESYSTEM_ENTRY_RFS) && \
413    defined(CONFIGURE_FILESYSTEM_RFS)
414  #include <rtems/rtems-rfs.h>
415  #define CONFIGURE_FILESYSTEM_ENTRY_RFS \
416    { RTEMS_FILESYSTEM_TYPE_RFS, rtems_rfs_rtems_initialise }
417#endif
418
419#ifdef CONFIGURE_INIT
420
421  /*
422   *  DEVFS variables.
423   */
424  #if defined(CONFIGURE_APPLICATION_DISABLE_FILESYSTEM)
425    #define CONFIGURE_MEMORY_FOR_DEVFS  0
426  #elif defined(CONFIGURE_FILESYSTEM_DEVFS)
427    #ifndef CONFIGURE_MAXIMUM_DEVICES
428      #define CONFIGURE_MAXIMUM_DEVICES 4
429    #endif
430    #include <rtems/devfs.h>
431    uint32_t rtems_device_table_size = CONFIGURE_MAXIMUM_DEVICES;
432    #define CONFIGURE_MEMORY_FOR_DEVFS \
433      _Configure_Object_RAM(CONFIGURE_MAXIMUM_DEVICES, \
434         sizeof (rtems_device_name_t))
435  #else
436    #define CONFIGURE_MEMORY_FOR_DEVFS  0
437  #endif
438
439#ifndef RTEMS_SCHEDSIM
440  #if defined(CONFIGURE_FILESYSTEM_IMFS) || \
441      defined(CONFIGURE_FILESYSTEM_MINIIMFS)
442    int imfs_rq_memfile_bytes_per_block = CONFIGURE_IMFS_MEMFILE_BYTES_PER_BLOCK;
443  #endif
444#endif
445
446  /**
447   * Table termination record.
448   */
449  #define CONFIGURE_FILESYSTEM_NULL { NULL, NULL }
450
451#ifndef RTEMS_SCHEDSIM
452  /**
453   * The default file system table. Must be terminated with the NULL entry if
454   * you provide your own.
455   */
456  #ifndef CONFIGURE_HAS_OWN_FILESYSTEM_TABLE
457    const rtems_filesystem_table_t rtems_filesystem_table[] = {
458      #if defined(CONFIGURE_FILESYSTEM_MINIIMFS) && \
459          defined(CONFIGURE_FILESYSTEM_ENTRY_miniIMFS)
460        CONFIGURE_FILESYSTEM_ENTRY_miniIMFS,
461      #endif
462      #if defined(CONFIGURE_FILESYSTEM_IMFS) && \
463          defined(CONFIGURE_FILESYSTEM_ENTRY_IMFS)
464        CONFIGURE_FILESYSTEM_ENTRY_IMFS,
465      #endif
466      #if defined(CONFIGURE_FILESYSTEM_DEVFS) && \
467          defined(CONFIGURE_FILESYSTEM_ENTRY_DEVFS)
468        CONFIGURE_FILESYSTEM_ENTRY_DEVFS,
469      #endif
470      #if defined(CONFIGURE_FILESYSTEM_TFTPFS) && \
471          defined(CONFIGURE_FILESYSTEM_ENTRY_TFTPFS)
472        CONFIGURE_FILESYSTEM_ENTRY_TFTPFS,
473      #endif
474      #if defined(CONFIGURE_FILESYSTEM_FTPFS) && \
475          defined(CONFIGURE_FILESYSTEM_ENTRY_FTPFS)
476        CONFIGURE_FILESYSTEM_ENTRY_FTPFS,
477      #endif
478      #if defined(CONFIGURE_FILESYSTEM_NFS) && \
479          defined(CONFIGURE_FILESYSTEM_ENTRY_NFS)
480        CONFIGURE_FILESYSTEM_ENTRY_NFS,
481      #endif
482      #if defined(CONFIGURE_FILESYSTEM_DOSFS) && \
483          defined(CONFIGURE_FILESYSTEM_ENTRY_DOSFS)
484        CONFIGURE_FILESYSTEM_ENTRY_DOSFS,
485      #endif
486      #if defined(CONFIGURE_FILESYSTEM_RFS) && \
487          defined(CONFIGURE_FILESYSTEM_ENTRY_RFS)
488        CONFIGURE_FILESYSTEM_ENTRY_RFS,
489      #endif
490      CONFIGURE_FILESYSTEM_NULL
491    };
492  #endif
493
494  #ifndef CONFIGURE_HAS_OWN_MOUNT_TABLE
495    const rtems_filesystem_mount_table_t configuration_mount_table = {
496      #if defined(CONFIGURE_USE_DEVFS_AS_BASE_FILESYSTEM)
497        RTEMS_FILESYSTEM_TYPE_DEVFS,
498      #elif defined(CONFIGURE_USE_MINIIMFS_AS_BASE_FILESYSTEM)
499        RTEMS_FILESYSTEM_TYPE_MINIIMFS,
500      #else  /* using IMFS as base filesystem */
501        RTEMS_FILESYSTEM_TYPE_IMFS,
502      #endif
503      RTEMS_FILESYSTEM_READ_WRITE,
504      NULL,
505      NULL
506    };
507
508    const rtems_filesystem_mount_table_t
509        *rtems_filesystem_mount_table = &configuration_mount_table;
510    const int rtems_filesystem_mount_table_size = 1;
511  #endif
512
513#endif
514#endif
515
516/*
517 *  STACK_CHECKER_ON was still available in 4.9 so give a warning for now.
518 */
519#if defined(STACK_CHECKER_ON)
520  #define CONFIGURE_STACK_CHECKER_ENABLED
521  #warning "STACK_CHECKER_ON deprecated -- use CONFIGURE_STACK_CHECKER_ENABLED"
522#endif
523
524/**
525 *  This configures the stack checker user extension.
526 */
527#ifdef CONFIGURE_STACK_CHECKER_ENABLED
528  #define CONFIGURE_STACK_CHECKER_EXTENSION 1
529#else
530  #define CONFIGURE_STACK_CHECKER_EXTENSION 0
531#endif
532
533/**
534 *  @brief Maximum Priority configuration
535 *
536 *  This configures the maximum priority value that
537 *  a task may have.
538 *
539 *  The following applies to the data space requirements
540 *  of the Priority Scheduler.
541 *
542 *  By reducing the number of priorities in a system,
543 *  the amount of RAM required by RTEMS can be significantly
544 *  reduced.  RTEMS allocates a Chain_Control structure per
545 *  priority and this structure contains 3 pointers.  So
546 *  the default is (256 * 12) = 3K on 32-bit architectures.
547 *
548 *  This must be one less than a power of 2 between
549 *  4 and 256.  Valid values along with the application
550 *  priority levels and memory saved when pointers are
551 *  32-bits in size are:
552 *
553 *    + 3,  2 application priorities, 3024 bytes saved
554 *    + 7, 5 application priorities, 2976 bytes saved
555 *    + 15, 13 application priorities, 2880 bytes saved
556 *    + 31, 29 application priorities, 2688 bytes saved
557 *    + 63, 61 application priorities, 2304 bytes saved
558 *    + 127, 125 application priorities, 1536 bytes saved
559 *    + 255, 253 application priorities, 0 bytes saved
560 *
561 *  It is specified in terms of Classic API priority values.
562 */
563#ifndef CONFIGURE_MAXIMUM_PRIORITY
564  #define CONFIGURE_MAXIMUM_PRIORITY PRIORITY_DEFAULT_MAXIMUM
565#endif
566
567/*
568 * Scheduler configuration.
569 *
570 * The scheduler configuration allows an application to select the
571 * scheduling policy to use.  The supported configurations are:
572 *  CONFIGURE_SCHEDULER_USER       - user provided scheduler
573 *  CONFIGURE_SCHEDULER_PRIORITY   - Deterministic Priority Scheduler
574 *  CONFIGURE_SCHEDULER_SIMPLE     - Light-weight Priority Scheduler
575 *  CONFIGURE_SCHEDULER_SIMPLE_SMP - Simple SMP Priority Scheduler
576 *  CONFIGURE_SCHEDULER_EDF        - EDF Scheduler
577 *  CONFIGURE_SCHEDULER_CBS        - CBS Scheduler
578 *
579 * If no configuration is specified by the application, then
580 * CONFIGURE_SCHEDULER_PRIORITY is assumed to be the default.
581 *
582 * An application can define its own scheduling policy by defining
583 * CONFIGURE_SCHEDULER_USER and the following:
584 *    - CONFIGURE_SCHEDULER_ENTRY_POINTS
585 *    - CONFIGURE_MEMORY_FOR_SCHEDULER - base memory
586 *    - CONFIGURE_MEMORY_PER_TASK_FOR_SCHEDULER - per task memory
587 */
588#include <rtems/score/scheduler.h>
589
590#if defined(CONFIGURE_SCHEDULER_USER) && \
591    !defined(CONFIGURE_SCHEDULER_USER_ENTRY_POINTS)
592  #error "CONFIGURE_ERROR: CONFIGURE_SCHEDULER_USER requires CONFIGURE_SCHEDULER_USER_ENTRY_POINTS"
593#endif
594
595#if !defined(RTEMS_SMP)
596  #undef CONFIGURE_SCHEDULER_SIMPLE_SMP
597#endif
598
599/* If no scheduler is specified, the priority scheduler is default. */
600#if !defined(CONFIGURE_SCHEDULER_USER) && \
601    !defined(CONFIGURE_SCHEDULER_PRIORITY) && \
602    !defined(CONFIGURE_SCHEDULER_SIMPLE) && \
603    !defined(CONFIGURE_SCHEDULER_SIMPLE_SMP) && \
604    !defined(CONFIGURE_SCHEDULER_EDF) && \
605    !defined(CONFIGURE_SCHEDULER_CBS)
606  #if defined(RTEMS_SMP) && defined(CONFIGURE_SMP_APPLICATION)
607    #define CONFIGURE_SCHEDULER_SIMPLE_SMP
608  #else
609    #define CONFIGURE_SCHEDULER_PRIORITY
610  #endif
611#endif
612
613/*
614 * If the Priority Scheduler is selected, then configure for it.
615 */
616#if defined(CONFIGURE_SCHEDULER_PRIORITY)
617  #include <rtems/score/schedulerpriority.h>
618  #define CONFIGURE_SCHEDULER_ENTRY_POINTS SCHEDULER_PRIORITY_ENTRY_POINTS
619
620  /**
621   * This defines the memory used by the priority scheduler.
622   */
623  #define CONFIGURE_MEMORY_FOR_SCHEDULER ( \
624    _Configure_From_workspace( \
625      ((CONFIGURE_MAXIMUM_PRIORITY+1) * sizeof(Chain_Control)) ) \
626  )
627  #define CONFIGURE_MEMORY_PER_TASK_FOR_SCHEDULER ( \
628    _Configure_From_workspace(sizeof(Scheduler_priority_Per_thread)) )
629#endif
630
631/*
632 * If the Simple Priority Scheduler is selected, then configure for it.
633 */
634#if defined(CONFIGURE_SCHEDULER_SIMPLE)
635  #include <rtems/score/schedulersimple.h>
636  #define CONFIGURE_SCHEDULER_ENTRY_POINTS SCHEDULER_SIMPLE_ENTRY_POINTS
637
638  /**
639   * define the memory used by the simple scheduler
640   */
641  #define CONFIGURE_MEMORY_FOR_SCHEDULER ( \
642    _Configure_From_workspace( sizeof(Chain_Control) ) \
643  )
644  #define CONFIGURE_MEMORY_PER_TASK_FOR_SCHEDULER (0)
645#endif
646
647/*
648 * If the Simple SMP Priority Scheduler is selected, then configure for it.
649 */
650#if defined(CONFIGURE_SCHEDULER_SIMPLE_SMP)
651  #include <rtems/score/schedulersimplesmp.h>
652  #define CONFIGURE_SCHEDULER_ENTRY_POINTS SCHEDULER_SIMPLE_SMP_ENTRY_POINTS
653
654  /**
655   * Define the memory used by the Simple SMP Scheduler
656   *
657   * NOTE: This is the same as the Simple Scheduler
658   */
659  #define CONFIGURE_MEMORY_FOR_SCHEDULER ( \
660    _Configure_From_workspace( sizeof(Chain_Control) ) \
661  )
662  #define CONFIGURE_MEMORY_PER_TASK_FOR_SCHEDULER (0)
663#endif
664
665/*
666 * If the EDF Scheduler is selected, then configure for it.
667 */
668#if defined(CONFIGURE_SCHEDULER_EDF)
669  #include <rtems/score/scheduleredf.h>
670  #define CONFIGURE_SCHEDULER_ENTRY_POINTS SCHEDULER_EDF_ENTRY_POINTS
671
672  /**
673   * define the memory used by the EDF scheduler
674   */
675  #define CONFIGURE_MEMORY_FOR_SCHEDULER ( \
676    _Configure_From_workspace(0))
677  #define CONFIGURE_MEMORY_PER_TASK_FOR_SCHEDULER ( \
678    _Configure_From_workspace(sizeof(Scheduler_EDF_Per_thread)))
679#endif
680
681/*
682 * If the CBS Scheduler is selected, then configure for it.
683 */
684#if defined(CONFIGURE_SCHEDULER_CBS)
685  #include <rtems/score/schedulercbs.h>
686  #define CONFIGURE_SCHEDULER_ENTRY_POINTS SCHEDULER_CBS_ENTRY_POINTS
687
688  #ifndef CONFIGURE_CBS_MAXIMUM_SERVERS
689    #define CONFIGURE_CBS_MAXIMUM_SERVERS CONFIGURE_MAXIMUM_TASKS
690  #endif
691
692  #ifdef CONFIGURE_INIT
693    uint32_t _Scheduler_CBS_Maximum_servers = CONFIGURE_CBS_MAXIMUM_SERVERS;
694  #endif
695
696  /**
697   * define the memory used by the CBS scheduler
698   */
699  #define CONFIGURE_MEMORY_FOR_SCHEDULER ( \
700    _Configure_From_workspace((sizeof(Scheduler_CBS_Server) + \
701        sizeof(Scheduler_CBS_Server*)) * CONFIGURE_CBS_MAXIMUM_SERVERS))
702  #define CONFIGURE_MEMORY_PER_TASK_FOR_SCHEDULER ( \
703    _Configure_From_workspace(sizeof(Scheduler_CBS_Per_thread)))
704#endif
705
706#if defined(CONFIGURE_SCHEDULER_USER)
707  #define CONFIGURE_SCHEDULER_ENTRY_POINTS \
708          CONFIGURE_SCHEDULER_USER_ENTRY_POINTS
709
710  #define CONFIGURE_SCHEDULER_MEMORY_FOR_SCHEDULER \
711          CONFIGURE_SCHEDULER_USER_MEMORY_FOR_SCHEDULER
712#endif
713
714/*
715 * Set up the scheduler entry points table.  The scheduling code uses
716 * this code to know which scheduler is configured by the user.
717 */
718#ifdef CONFIGURE_INIT
719  Scheduler_Control  _Scheduler = {
720    NULL,                             /* Scheduler Specific Data Pointer */
721    CONFIGURE_SCHEDULER_ENTRY_POINTS  /* Scheduler Operations */
722  };
723#endif
724
725/*
726 *  If you said the IDLE task was going to do application initialization
727 *  and didn't override the IDLE body, then something is amiss.
728 */
729#if (defined(CONFIGURE_IDLE_TASK_INITIALIZES_APPLICATION) && \
730     !defined(CONFIGURE_IDLE_TASK_BODY))
731  #error "CONFIGURE_ERROR: You did not override the IDLE task body."
732#endif
733
734/**
735 *  @brief Idle task body configuration
736 *
737 *  There is a default IDLE thread body provided by RTEMS which
738 *  has the possibility of being CPU specific.  There may be a
739 *  BSP specific override of the RTEMS default body and in turn,
740 *  the application may override and provide its own.
741 */
742#ifndef CONFIGURE_IDLE_TASK_BODY
743  #if defined(BSP_IDLE_TASK_BODY)
744    #define CONFIGURE_IDLE_TASK_BODY BSP_IDLE_TASK_BODY
745  #elif (CPU_PROVIDES_IDLE_THREAD_BODY == TRUE)
746    #define CONFIGURE_IDLE_TASK_BODY _CPU_Thread_Idle_body
747  #else
748    /* only instantiate and compile if used */
749    #ifdef CONFIGURE_INIT
750      void *_Thread_Idle_body(uintptr_t ignored)
751      {
752        for( ; ; ) ;
753        return 0;   /* to avoid warning */
754      }
755    #endif
756    #define CONFIGURE_IDLE_TASK_BODY _Thread_Idle_body
757  #endif
758#endif
759
760/**
761 *  By default, use the minimum stack size requested by this port.
762 */
763#ifndef CONFIGURE_MINIMUM_TASK_STACK_SIZE
764  #define CONFIGURE_MINIMUM_TASK_STACK_SIZE CPU_STACK_MINIMUM_SIZE
765#endif
766
767/**
768 *  @brief Idle task stack size configuration
769 *
770 *  By default, the IDLE task will have a stack of minimum size.
771 *  The BSP or application may override this value.
772 */
773#ifndef CONFIGURE_IDLE_TASK_STACK_SIZE
774  #ifdef BSP_IDLE_TASK_STACK_SIZE
775    #define CONFIGURE_IDLE_TASK_STACK_SIZE BSP_IDLE_TASK_STACK_SIZE
776  #else
777    #define CONFIGURE_IDLE_TASK_STACK_SIZE CONFIGURE_MINIMUM_TASK_STACK_SIZE
778  #endif
779#endif
780
781/**
782 *  @brief Interrupt stack size configuration
783 *
784 *  By default, the interrupt stack will be of minimum size.
785 *  The BSP or application may override this value.
786 */
787#ifndef CONFIGURE_INTERRUPT_STACK_SIZE
788  #ifdef BSP_INTERRUPT_STACK_SIZE
789    #define CONFIGURE_INTERRUPT_STACK_SIZE BSP_INTERRUPT_STACK_SIZE
790  #else
791    #define CONFIGURE_INTERRUPT_STACK_SIZE CONFIGURE_MINIMUM_TASK_STACK_SIZE
792  #endif
793#endif
794
795/**
796 *  This reserves memory for the interrupt stack if it is to be allocated
797 *  by RTEMS rather than the BSP.
798 *
799 *  @todo Try to get to the point where all BSPs support allocating the
800 *        memory from the Workspace.
801 */
802#if (CPU_ALLOCATE_INTERRUPT_STACK == 0)
803  #define CONFIGURE_INTERRUPT_STACK_MEMORY 0
804#else
805  #define CONFIGURE_INTERRUPT_STACK_MEMORY \
806     _Configure_From_workspace( CONFIGURE_INTERRUPT_STACK_SIZE )
807#endif
808
809/**
810 *  Configure the very much optional task stack allocator
811 */
812#ifndef CONFIGURE_TASK_STACK_ALLOCATOR
813  #define CONFIGURE_TASK_STACK_ALLOCATOR NULL
814#endif
815
816/**
817 *  Configure the very much optional task stack deallocator
818 */
819#ifndef CONFIGURE_TASK_STACK_DEALLOCATOR
820  #define CONFIGURE_TASK_STACK_DEALLOCATOR NULL
821#endif
822
823/**
824 *  Should the RTEMS Workspace and C Program Heap be cleared automatically
825 *  at system start up?
826 */
827#ifndef CONFIGURE_ZERO_WORKSPACE_AUTOMATICALLY
828  #ifdef BSP_ZERO_WORKSPACE_AUTOMATICALLY
829    #define CONFIGURE_ZERO_WORKSPACE_AUTOMATICALLY \
830            BSP_ZERO_WORKSPACE_AUTOMATICALLY
831  #else
832    #define CONFIGURE_ZERO_WORKSPACE_AUTOMATICALLY FALSE
833  #endif
834#endif
835
836/*
837 *  RTEMS Malloc configuration
838 */
839
840#include <rtems/malloc.h>
841
842#ifdef CONFIGURE_INIT
843  /**
844   *  By default, RTEMS uses separate heaps for the RTEMS Workspace and
845   *  the C Program Heap.  On many BSPs, these can be optionally
846   *  combined provided one larger memory pool. This is particularly
847   *  useful in combination with the unlimited objects configuration.
848   */
849  #ifdef BSP_DEFAULT_UNIFIED_WORK_AREAS
850    #ifndef CONFIGURE_UNIFIED_WORK_AREAS
851      #define CONFIGURE_UNIFIED_WORK_AREAS
852    #endif
853  #endif
854 
855  #ifdef CONFIGURE_UNIFIED_WORK_AREAS
856    #include <rtems/score/wkspace.h>
857    Heap_Control  *RTEMS_Malloc_Heap = &_Workspace_Area;
858    bool           rtems_unified_work_area = true;
859  #else
860    Heap_Control   RTEMS_Malloc_Area;
861    Heap_Control  *RTEMS_Malloc_Heap = &RTEMS_Malloc_Area;
862    bool           rtems_unified_work_area = false;
863  #endif
864#endif
865
866#ifdef CONFIGURE_INIT
867  /**
868   *  This configures the malloc family statistics to be available.
869   *  By default only function call counts are kept.
870   */
871  rtems_malloc_statistics_functions_t *rtems_malloc_statistics_helpers =
872    #ifndef CONFIGURE_MALLOC_STATISTICS
873      NULL;
874    #else
875      &rtems_malloc_statistics_helpers_table;
876    #endif
877#endif
878
879#ifdef CONFIGURE_INIT
880  /**
881   *  This configures the sbrk() support for the malloc family.
882   *  By default it is assumed that the BSP provides all available
883   *  RAM to the malloc family implementation so sbrk()'ing to get
884   *  more memory would always fail anyway.
885   */
886  rtems_malloc_sbrk_functions_t *rtems_malloc_sbrk_helpers =
887    #ifndef CONFIGURE_MALLOC_BSP_SUPPORTS_SBRK
888      NULL;
889    #else
890      &rtems_malloc_sbrk_helpers_table;
891    #endif
892#endif
893
894#ifdef CONFIGURE_INIT
895  /**
896   *  This configures the malloc family plugin which dirties memory
897   *  allocated.  This is helpful for finding unitialized data structure
898   *  problems.
899   */
900  rtems_malloc_dirtier_t rtems_malloc_dirty_helper =
901    #if defined(CONFIGURE_MALLOC_DIRTY)
902      rtems_malloc_dirty_memory;
903    #else
904      NULL;
905    #endif
906#endif
907
908/**
909 *  This is a helper macro used in calculations in this file.  It is used
910 *  to noted when an element is allocated from the RTEMS Workspace and adds
911 *  a factor to account for heap overhead plus an alignment factor that
912 *  may be applied.
913 */
914#define _Configure_From_workspace(_size) \
915  (ssize_t)((_size) + HEAP_BLOCK_HEADER_SIZE + CPU_HEAP_ALIGNMENT - 1)
916
917/**
918 *  Do not use the unlimited bit as part of the multiplication
919 *  for memory usage.
920 */
921#define _Configure_Max_Objects(_max) \
922  ((_max) & ~RTEMS_UNLIMITED_OBJECTS)
923
924/**
925 *  This macro accounts for how memory for a set of configured objects is
926 *  allocated from the Executive Workspace.
927 *
928 *  NOTE: It does NOT attempt to address the more complex case of unlimited
929 *        objects.
930 */
931#define _Configure_Object_RAM(_number, _size) \
932  ( _Configure_From_workspace(_Configure_Max_Objects(_number) * (_size)) + \
933    _Configure_From_workspace( \
934      ((_Configure_Max_Objects(_number) + 1) * sizeof(Objects_Control *)) + \
935      (sizeof(void *) + sizeof(uint32_t) + sizeof(Objects_Name *)) \
936    ) \
937  )
938
939/*
940 *  Default User Initialization Task Table.  This table guarantees that
941 *  one user initialization table is defined.
942 */
943
944#ifdef CONFIGURE_RTEMS_INIT_TASKS_TABLE
945
946#ifdef CONFIGURE_HAS_OWN_INIT_TASK_TABLE
947
948/*
949 *  The user is defining their own table information and setting the
950 *  appropriate variables.
951 */
952
953#else
954
955#ifndef CONFIGURE_INIT_TASK_NAME
956  #define CONFIGURE_INIT_TASK_NAME          rtems_build_name('U', 'I', '1', ' ')
957#endif
958
959#ifndef CONFIGURE_INIT_TASK_STACK_SIZE
960  #define CONFIGURE_INIT_TASK_STACK_SIZE    CONFIGURE_MINIMUM_TASK_STACK_SIZE
961#endif
962
963#ifndef CONFIGURE_INIT_TASK_PRIORITY
964  #define CONFIGURE_INIT_TASK_PRIORITY      1
965#endif
966
967#ifndef CONFIGURE_INIT_TASK_ATTRIBUTES
968  #define CONFIGURE_INIT_TASK_ATTRIBUTES    RTEMS_DEFAULT_ATTRIBUTES
969#endif
970
971#ifndef CONFIGURE_INIT_TASK_ENTRY_POINT
972  #ifdef __cplusplus
973  extern "C" {
974  #endif
975    rtems_task Init (rtems_task_argument );
976  #ifdef __cplusplus
977  }
978  #endif
979  #define CONFIGURE_INIT_TASK_ENTRY_POINT   Init
980  extern const char* bsp_boot_cmdline;
981  #define CONFIGURE_INIT_TASK_ARGUMENTS     ((rtems_task_argument) &bsp_boot_cmdline)
982#endif
983
984#ifndef CONFIGURE_INIT_TASK_INITIAL_MODES
985  #define CONFIGURE_INIT_TASK_INITIAL_MODES RTEMS_NO_PREEMPT
986#endif
987
988#ifndef CONFIGURE_INIT_TASK_ARGUMENTS
989  #define CONFIGURE_INIT_TASK_ARGUMENTS     0
990#endif
991
992#ifdef CONFIGURE_INIT
993  rtems_initialization_tasks_table Initialization_tasks[] = {
994    { CONFIGURE_INIT_TASK_NAME,
995      CONFIGURE_INIT_TASK_STACK_SIZE,
996      CONFIGURE_INIT_TASK_PRIORITY,
997      CONFIGURE_INIT_TASK_ATTRIBUTES,
998      CONFIGURE_INIT_TASK_ENTRY_POINT,
999      CONFIGURE_INIT_TASK_INITIAL_MODES,
1000      CONFIGURE_INIT_TASK_ARGUMENTS
1001    }
1002  };
1003#endif
1004
1005#define CONFIGURE_INIT_TASK_TABLE Initialization_tasks
1006
1007#define CONFIGURE_INIT_TASK_TABLE_SIZE \
1008  sizeof(CONFIGURE_INIT_TASK_TABLE) / sizeof(rtems_initialization_tasks_table)
1009
1010#endif    /* CONFIGURE_HAS_OWN_INIT_TASK_TABLE */
1011
1012#else     /* CONFIGURE_RTEMS_INIT_TASKS_TABLE */
1013
1014#define CONFIGURE_INIT_TASK_TABLE      NULL
1015#define CONFIGURE_INIT_TASK_TABLE_SIZE 0
1016#define CONFIGURE_INIT_TASK_STACK_SIZE 0
1017
1018#endif
1019
1020/*
1021 *  Default Device Driver Table.  Each driver needed by the test is explicitly
1022 *  choosen by that test.  There is always a null driver entry.
1023 */
1024
1025#define NULL_DRIVER_TABLE_ENTRY \
1026 { NULL, NULL, NULL, NULL, NULL, NULL }
1027
1028#ifdef CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
1029  #include <rtems/console.h>
1030#endif
1031
1032#ifdef CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
1033  #include <rtems/clockdrv.h>
1034#endif
1035
1036#ifdef CONFIGURE_APPLICATION_NEEDS_TIMER_DRIVER
1037  #include <rtems/timerdrv.h>
1038#endif
1039
1040#ifdef CONFIGURE_APPLICATION_NEEDS_RTC_DRIVER
1041  #include <rtems/rtc.h>
1042#endif
1043
1044#ifdef CONFIGURE_APPLICATION_NEEDS_WATCHDOG_DRIVER
1045  #include <rtems/watchdogdrv.h>
1046#endif
1047
1048#ifdef CONFIGURE_APPLICATION_NEEDS_FRAME_BUFFER_DRIVER
1049  #include <rtems/framebuffer.h>
1050#endif
1051
1052#ifdef CONFIGURE_APPLICATION_NEEDS_STUB_DRIVER
1053  #include <rtems/devnull.h>
1054#endif
1055
1056#ifdef CONFIGURE_APPLICATION_NEEDS_ZERO_DRIVER
1057  #include <rtems/devzero.h>
1058#endif
1059
1060#ifdef CONFIGURE_APPLICATION_NEEDS_IDE_DRIVER
1061  /* the ide driver needs the ATA driver */
1062  #ifndef CONFIGURE_APPLICATION_NEEDS_ATA_DRIVER
1063    #define CONFIGURE_APPLICATION_NEEDS_ATA_DRIVER
1064  #endif
1065  #include <libchip/ide_ctrl.h>
1066#endif
1067
1068#ifdef CONFIGURE_APPLICATION_NEEDS_ATA_DRIVER
1069  #include <libchip/ata.h>
1070#endif
1071
1072#ifndef CONFIGURE_HAS_OWN_DEVICE_DRIVER_TABLE
1073
1074#ifdef CONFIGURE_INIT
1075  rtems_driver_address_table Device_drivers[] = {
1076    #ifdef CONFIGURE_BSP_PREREQUISITE_DRIVERS
1077      CONFIGURE_BSP_PREREQUISITE_DRIVERS,
1078    #endif
1079    #ifdef CONFIGURE_APPLICATION_PREREQUISITE_DRIVERS
1080      CONFIGURE_APPLICATION_PREREQUISITE_DRIVERS,
1081    #endif
1082    #ifdef CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
1083      CONSOLE_DRIVER_TABLE_ENTRY,
1084    #endif
1085    #ifdef CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
1086      CLOCK_DRIVER_TABLE_ENTRY,
1087    #endif
1088    #ifdef CONFIGURE_APPLICATION_NEEDS_RTC_DRIVER
1089      RTC_DRIVER_TABLE_ENTRY,
1090    #endif
1091    #ifdef CONFIGURE_APPLICATION_NEEDS_WATCHDOG_DRIVER
1092      WATCHDOG_DRIVER_TABLE_ENTRY,
1093    #endif
1094    #ifdef CONFIGURE_APPLICATION_NEEDS_STUB_DRIVER
1095      DEVNULL_DRIVER_TABLE_ENTRY,
1096    #endif
1097    #ifdef CONFIGURE_APPLICATION_NEEDS_ZERO_DRIVER
1098      DEVZERO_DRIVER_TABLE_ENTRY,
1099    #endif
1100    #ifdef CONFIGURE_APPLICATION_NEEDS_IDE_DRIVER
1101      IDE_CONTROLLER_DRIVER_TABLE_ENTRY,
1102    #endif
1103    #ifdef CONFIGURE_APPLICATION_NEEDS_ATA_DRIVER
1104      ATA_DRIVER_TABLE_ENTRY,
1105    #endif
1106    #ifdef CONFIGURE_APPLICATION_NEEDS_FRAME_BUFFER_DRIVER
1107      FRAME_BUFFER_DRIVER_TABLE_ENTRY,
1108    #endif
1109    #ifdef CONFIGURE_APPLICATION_EXTRA_DRIVERS
1110      CONFIGURE_APPLICATION_EXTRA_DRIVERS,
1111    #endif
1112    #ifdef CONFIGURE_APPLICATION_NEEDS_NULL_DRIVER
1113      NULL_DRIVER_TABLE_ENTRY
1114    #elif !defined(CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER) && \
1115        !defined(CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER) && \
1116        !defined(CONFIGURE_APPLICATION_NEEDS_RTC_DRIVER) && \
1117        !defined(CONFIGURE_APPLICATION_NEEDS_STUB_DRIVER) && \
1118        !defined(CONFIGURE_APPLICATION_NEEDS_ZERO_DRIVER) && \
1119        !defined(CONFIGURE_APPLICATION_NEEDS_IDE_DRIVER) && \
1120        !defined(CONFIGURE_APPLICATION_NEEDS_ATA_DRIVER) && \
1121        !defined(CONFIGURE_APPLICATION_NEEDS_FRAME_BUFFER_DRIVER) && \
1122        !defined(CONFIGURE_APPLICATION_EXTRA_DRIVERS)
1123      NULL_DRIVER_TABLE_ENTRY
1124    #endif
1125  };
1126#endif
1127
1128#endif  /* CONFIGURE_HAS_OWN_DEVICE_DRIVER_TABLE */
1129
1130/*
1131 *  Default the number of drivers per node.  This value may be
1132 *  overridden by the user.
1133 */
1134
1135#define CONFIGURE_NUMBER_OF_DRIVERS \
1136  ((sizeof(Device_drivers) / sizeof(rtems_driver_address_table)))
1137
1138/**
1139 *  This specifies the maximum number of device drivers that
1140 *  can be installed in the system at one time.  It must account
1141 *  for both the statically and dynamically installed drivers.
1142 */
1143#ifndef CONFIGURE_MAXIMUM_DRIVERS
1144  #define CONFIGURE_MAXIMUM_DRIVERS CONFIGURE_NUMBER_OF_DRIVERS
1145#endif
1146
1147
1148#ifdef CONFIGURE_APPLICATION_NEEDS_ATA_DRIVER
1149  /*
1150   * configure the priority of the ATA driver task
1151   */
1152  #ifndef CONFIGURE_ATA_DRIVER_TASK_PRIORITY
1153    #define CONFIGURE_ATA_DRIVER_TASK_PRIORITY ATA_DRIVER_TASK_DEFAULT_PRIORITY
1154  #endif
1155  #ifdef CONFIGURE_INIT
1156    rtems_task_priority rtems_ata_driver_task_priority
1157      = CONFIGURE_ATA_DRIVER_TASK_PRIORITY;
1158  #endif /* CONFIGURE_INIT */
1159#endif
1160
1161/*
1162 * add bdbuf configuration and values for swapout task priority
1163 */
1164#ifdef CONFIGURE_APPLICATION_NEEDS_LIBBLOCK
1165  #include <rtems/bdbuf.h>
1166  /*
1167   * configure the bdbuf cache parameters
1168   */
1169  #ifndef CONFIGURE_BDBUF_MAX_READ_AHEAD_BLOCKS
1170    #define CONFIGURE_BDBUF_MAX_READ_AHEAD_BLOCKS \
1171                              RTEMS_BDBUF_MAX_READ_AHEAD_BLOCKS_DEFAULT
1172  #endif
1173  #ifndef CONFIGURE_BDBUF_MAX_WRITE_BLOCKS
1174    #define CONFIGURE_BDBUF_MAX_WRITE_BLOCKS \
1175                              RTEMS_BDBUF_MAX_WRITE_BLOCKS_DEFAULT
1176  #endif
1177  #ifndef CONFIGURE_SWAPOUT_TASK_PRIORITY
1178    #define CONFIGURE_SWAPOUT_TASK_PRIORITY \
1179                              RTEMS_BDBUF_SWAPOUT_TASK_PRIORITY_DEFAULT
1180  #endif
1181  #ifndef CONFIGURE_SWAPOUT_SWAP_PERIOD
1182    #define CONFIGURE_SWAPOUT_SWAP_PERIOD \
1183                              RTEMS_BDBUF_SWAPOUT_TASK_SWAP_PERIOD_DEFAULT
1184  #endif
1185  #ifndef CONFIGURE_SWAPOUT_BLOCK_HOLD
1186    #define CONFIGURE_SWAPOUT_BLOCK_HOLD \
1187                              RTEMS_BDBUF_SWAPOUT_TASK_BLOCK_HOLD_DEFAULT
1188  #endif
1189  #ifndef CONFIGURE_SWAPOUT_WORKER_TASKS
1190    #define CONFIGURE_SWAPOUT_WORKER_TASKS \
1191                              RTEMS_BDBUF_SWAPOUT_WORKER_TASKS_DEFAULT
1192  #endif
1193  #ifndef CONFIGURE_SWAPOUT_WORKER_TASK_PRIORITY
1194    #define CONFIGURE_SWAPOUT_WORKER_TASK_PRIORITY \
1195                              RTEMS_BDBUF_SWAPOUT_WORKER_TASK_PRIORITY_DEFAULT
1196  #endif
1197  #ifndef CONFIGURE_BDBUF_CACHE_MEMORY_SIZE
1198    #define CONFIGURE_BDBUF_CACHE_MEMORY_SIZE \
1199                              RTEMS_BDBUF_CACHE_MEMORY_SIZE_DEFAULT
1200  #endif
1201  #ifndef CONFIGURE_BDBUF_BUFFER_MIN_SIZE
1202    #define CONFIGURE_BDBUF_BUFFER_MIN_SIZE \
1203                              RTEMS_BDBUF_BUFFER_MIN_SIZE_DEFAULT
1204  #endif
1205  #ifndef CONFIGURE_BDBUF_BUFFER_MAX_SIZE
1206    #define CONFIGURE_BDBUF_BUFFER_MAX_SIZE \
1207                              RTEMS_BDBUF_BUFFER_MAX_SIZE_DEFAULT
1208  #endif
1209  #ifdef CONFIGURE_INIT
1210    const rtems_bdbuf_config rtems_bdbuf_configuration = {
1211      CONFIGURE_BDBUF_MAX_READ_AHEAD_BLOCKS,
1212      CONFIGURE_BDBUF_MAX_WRITE_BLOCKS,
1213      CONFIGURE_SWAPOUT_TASK_PRIORITY,
1214      CONFIGURE_SWAPOUT_SWAP_PERIOD,
1215      CONFIGURE_SWAPOUT_BLOCK_HOLD,
1216      CONFIGURE_SWAPOUT_WORKER_TASKS,
1217      CONFIGURE_SWAPOUT_WORKER_TASK_PRIORITY,
1218      CONFIGURE_BDBUF_CACHE_MEMORY_SIZE,
1219      CONFIGURE_BDBUF_BUFFER_MIN_SIZE,
1220      CONFIGURE_BDBUF_BUFFER_MAX_SIZE
1221    };
1222  #endif
1223
1224  /*
1225   *  Semaphores:
1226   *    o disk lock
1227   *    o bdbuf lock
1228   *    o bdbuf sync lock
1229   *    o bdbuf access condition
1230   *    o bdbuf transfer condition
1231   *    o bdbuf buffer condition
1232   */
1233  #define CONFIGURE_LIBBLOCK_SEMAPHORES 6
1234
1235  #if defined(CONFIGURE_HAS_OWN_BDBUF_TABLE) || \
1236      defined(CONFIGURE_BDBUF_BUFFER_SIZE) || \
1237      defined(CONFIGURE_BDBUF_BUFFER_COUNT)
1238    #error BDBUF Cache does not use a buffer configuration table. Please remove.
1239  #endif
1240#else
1241  #define CONFIGURE_LIBBLOCK_SEMAPHORES 0
1242#endif /* CONFIGURE_APPLICATION_NEEDS_LIBBLOCK */
1243
1244#if defined(RTEMS_MULTIPROCESSING)
1245  /*
1246   *  Default Multiprocessing Configuration Table.  The defaults are
1247   *  appropriate for most of the RTEMS Multiprocessor Test Suite.  Each
1248   *  value may be overridden within each test to customize the environment.
1249   */
1250
1251  #ifdef CONFIGURE_MP_APPLICATION
1252    #define CONFIGURE_TIMER_FOR_SHARED_MEMORY_DRIVER 1
1253
1254    #ifndef CONFIGURE_HAS_OWN_MULTIPROCESSING_TABLE
1255
1256      #ifndef CONFIGURE_MP_NODE_NUMBER
1257        #define CONFIGURE_MP_NODE_NUMBER                NODE_NUMBER
1258      #endif
1259
1260      #ifndef CONFIGURE_MP_MAXIMUM_NODES
1261        #define CONFIGURE_MP_MAXIMUM_NODES              2
1262      #endif
1263
1264      #ifndef CONFIGURE_MP_MAXIMUM_GLOBAL_OBJECTS
1265        #define CONFIGURE_MP_MAXIMUM_GLOBAL_OBJECTS     32
1266      #endif
1267      #define CONFIGURE_MEMORY_FOR_GLOBAL_OBJECTS(_global_objects) \
1268        _Configure_Object_RAM((_global_objects), sizeof(Objects_MP_Control))
1269
1270      #ifndef CONFIGURE_MP_MAXIMUM_PROXIES
1271        #define CONFIGURE_MP_MAXIMUM_PROXIES            32
1272      #endif
1273      #define CONFIGURE_MEMORY_FOR_PROXIES(_proxies) \
1274        _Configure_Object_RAM((_proxies) + 1, sizeof(Thread_Proxy_control) )
1275
1276      #ifndef CONFIGURE_EXTRA_MPCI_RECEIVE_SERVER_STACK
1277        #define CONFIGURE_EXTRA_MPCI_RECEIVE_SERVER_STACK 0
1278      #endif
1279
1280      #ifndef CONFIGURE_MP_MPCI_TABLE_POINTER
1281        #include <mpci.h>
1282        #define CONFIGURE_MP_MPCI_TABLE_POINTER         &MPCI_table
1283      #endif
1284
1285      #ifdef CONFIGURE_INIT
1286        rtems_multiprocessing_table Multiprocessing_configuration = {
1287          CONFIGURE_MP_NODE_NUMBER,               /* local node number */
1288          CONFIGURE_MP_MAXIMUM_NODES,             /* maximum # nodes */
1289          CONFIGURE_MP_MAXIMUM_GLOBAL_OBJECTS,    /* maximum # global objects */
1290          CONFIGURE_MP_MAXIMUM_PROXIES,           /* maximum # proxies */
1291          CONFIGURE_EXTRA_MPCI_RECEIVE_SERVER_STACK, /* MPCI stack > minimum */
1292          CONFIGURE_MP_MPCI_TABLE_POINTER         /* ptr to MPCI config table */
1293        };
1294      #endif
1295
1296      #define CONFIGURE_MULTIPROCESSING_TABLE    &Multiprocessing_configuration
1297
1298    #endif /* CONFIGURE_HAS_OWN_MULTIPROCESSING_TABLE */
1299
1300  #else
1301
1302    #define CONFIGURE_MULTIPROCESSING_TABLE    NULL
1303
1304  #endif /* CONFIGURE_MP_APPLICATION */
1305#endif /* RTEMS_MULTIPROCESSING */
1306
1307#ifndef CONFIGURE_TIMER_FOR_SHARED_MEMORY_DRIVER
1308  #define CONFIGURE_TIMER_FOR_SHARED_MEMORY_DRIVER 0
1309#endif
1310
1311
1312/*
1313 *  Default Configuration Table.
1314 */
1315
1316#ifndef CONFIGURE_HAS_OWN_CONFIGURATION_TABLE
1317
1318  #ifndef CONFIGURE_MAXIMUM_TASKS
1319    #define CONFIGURE_MAXIMUM_TASKS               0
1320  #endif
1321
1322  #ifndef CONFIGURE_DISABLE_CLASSIC_API_NOTEPADS
1323    #define CONFIGURE_NOTEPADS_ENABLED           TRUE
1324  #else
1325    #define CONFIGURE_NOTEPADS_ENABLED           FALSE
1326  #endif
1327
1328  #ifndef CONFIGURE_DISABLE_CLASSIC_API_NOTEPADS
1329    #define CONFIGURE_MEMORY_PER_TASK_FOR_CLASSIC_API \
1330      _Configure_From_workspace( sizeof(RTEMS_API_Control) )
1331  #else
1332    #define CONFIGURE_MEMORY_PER_TASK_FOR_CLASSIC_API \
1333      _Configure_From_workspace( sizeof(RTEMS_API_Control) - \
1334        (RTEMS_NUMBER_NOTEPADS * sizeof(uint32_t)))
1335  #endif
1336
1337  /**
1338   *  This macro calculates the memory required for task variables.
1339   *
1340   *  @note Each task variable is individually allocated from the Workspace.
1341   *        Hence, we do the multiplication on the configured size.
1342   */
1343  #ifndef CONFIGURE_MAXIMUM_TASK_VARIABLES
1344    #define CONFIGURE_MAXIMUM_TASK_VARIABLES                     0
1345    #define CONFIGURE_MEMORY_FOR_TASK_VARIABLES(_task_variables) 0
1346  #else
1347    #define CONFIGURE_MEMORY_FOR_TASK_VARIABLES(_task_variables) \
1348      (_task_variables) * \
1349         _Configure_From_workspace(sizeof(rtems_task_variable_t))
1350  #endif
1351
1352  #ifndef CONFIGURE_MAXIMUM_TIMERS
1353    #define CONFIGURE_MAXIMUM_TIMERS             0
1354    #define CONFIGURE_MEMORY_FOR_TIMERS(_timers) 0
1355  #else
1356    #define CONFIGURE_MEMORY_FOR_TIMERS(_timers) \
1357      _Configure_Object_RAM(_timers, sizeof(Timer_Control) )
1358  #endif
1359
1360  #ifndef CONFIGURE_MAXIMUM_SEMAPHORES
1361    #define CONFIGURE_MAXIMUM_SEMAPHORES                 0
1362  #endif
1363
1364  #define CONFIGURE_SEMAPHORES \
1365    (CONFIGURE_MAXIMUM_SEMAPHORES + CONFIGURE_LIBIO_SEMAPHORES + \
1366      CONFIGURE_TERMIOS_SEMAPHORES + CONFIGURE_LIBBLOCK_SEMAPHORES + \
1367      CONFIGURE_SEMAPHORES_FOR_FIFOS)
1368
1369  /*
1370   * If there are no user or support semaphores defined, then we can assume
1371   * that no memory need be allocated at all for semaphores.
1372   */
1373  #if CONFIGURE_SEMAPHORES == 0
1374    #define CONFIGURE_MEMORY_FOR_SEMAPHORES(_semaphores) 0
1375  #else
1376    #define CONFIGURE_MEMORY_FOR_SEMAPHORES(_semaphores) \
1377      _Configure_Object_RAM(_semaphores, sizeof(Semaphore_Control) )
1378  #endif
1379
1380  #ifndef CONFIGURE_MAXIMUM_MESSAGE_QUEUES
1381    #define CONFIGURE_MAXIMUM_MESSAGE_QUEUES             0
1382    #define CONFIGURE_MEMORY_FOR_MESSAGE_QUEUES(_queues) 0
1383  #else
1384    #define CONFIGURE_MEMORY_FOR_MESSAGE_QUEUES(_queues) \
1385      _Configure_Object_RAM(_queues, sizeof(Message_queue_Control) )
1386  #endif
1387
1388  #ifndef CONFIGURE_MAXIMUM_PARTITIONS
1389    #define CONFIGURE_MAXIMUM_PARTITIONS                 0
1390    #define CONFIGURE_MEMORY_FOR_PARTITIONS(_partitions) 0
1391  #else
1392    #define CONFIGURE_MEMORY_FOR_PARTITIONS(_partitions) \
1393      _Configure_Object_RAM(_partitions, sizeof(Partition_Control) )
1394  #endif
1395
1396  #ifndef CONFIGURE_MAXIMUM_REGIONS
1397    #define CONFIGURE_MAXIMUM_REGIONS              0
1398    #define CONFIGURE_MEMORY_FOR_REGIONS(_regions) 0
1399  #else
1400    #define CONFIGURE_MEMORY_FOR_REGIONS(_regions) \
1401      _Configure_Object_RAM(_regions, sizeof(Region_Control) )
1402  #endif
1403
1404  #ifndef CONFIGURE_MAXIMUM_PORTS
1405    #define CONFIGURE_MAXIMUM_PORTS            0
1406    #define CONFIGURE_MEMORY_FOR_PORTS(_ports) 0
1407  #else
1408    #define CONFIGURE_MEMORY_FOR_PORTS(_ports) \
1409      _Configure_Object_RAM(_ports, sizeof(Dual_ported_memory_Control) )
1410  #endif
1411
1412  #ifndef CONFIGURE_MAXIMUM_PERIODS
1413    #define CONFIGURE_MAXIMUM_PERIODS              0
1414    #define CONFIGURE_MEMORY_FOR_PERIODS(_periods) 0
1415  #else
1416    #define CONFIGURE_MEMORY_FOR_PERIODS(_periods) \
1417      _Configure_Object_RAM(_periods, sizeof(Rate_monotonic_Control) )
1418  #endif
1419
1420  #ifndef CONFIGURE_MAXIMUM_BARRIERS
1421    #define CONFIGURE_MAXIMUM_BARRIERS               0
1422  #endif
1423
1424  #define CONFIGURE_BARRIERS \
1425     (CONFIGURE_MAXIMUM_BARRIERS + CONFIGURE_BARRIERS_FOR_FIFOS)
1426
1427  #if CONFIGURE_BARRIERS == 0
1428    #define CONFIGURE_MEMORY_FOR_BARRIERS(_barriers) 0
1429  #else
1430    #define CONFIGURE_MEMORY_FOR_BARRIERS(_barriers) \
1431      _Configure_Object_RAM(_barriers, sizeof(Barrier_Control) )
1432  #endif
1433
1434  #ifndef CONFIGURE_MAXIMUM_USER_EXTENSIONS
1435    #define CONFIGURE_MAXIMUM_USER_EXTENSIONS                 0
1436    #define CONFIGURE_MEMORY_FOR_USER_EXTENSIONS(_extensions) 0
1437  #else
1438    #define CONFIGURE_MEMORY_FOR_USER_EXTENSIONS(_extensions) \
1439      _Configure_Object_RAM(_extensions, sizeof(Extension_Control) )
1440  #endif
1441
1442  #ifndef CONFIGURE_MICROSECONDS_PER_TICK
1443    #define CONFIGURE_MICROSECONDS_PER_TICK \
1444            RTEMS_MILLISECONDS_TO_MICROSECONDS(10)
1445  #endif
1446
1447  #ifndef CONFIGURE_TICKS_PER_TIMESLICE
1448    #define CONFIGURE_TICKS_PER_TIMESLICE        50
1449  #endif
1450
1451/*
1452 *  Initial Extension Set
1453 */
1454
1455#ifdef CONFIGURE_INIT
1456#ifdef CONFIGURE_STACK_CHECKER_ENABLED
1457#include <rtems/stackchk.h>
1458#endif
1459#include <rtems/libcsupport.h>
1460
1461#if defined(CONFIGURE_INITIAL_EXTENSIONS) || \
1462    defined(CONFIGURE_STACK_CHECKER_ENABLED) || \
1463    (defined(RTEMS_NEWLIB) && !defined(CONFIGURE_DISABLE_NEWLIB_REENTRANCY))
1464  rtems_extensions_table Configuration_Initial_Extensions[] = {
1465    #if !defined(CONFIGURE_DISABLE_NEWLIB_REENTRANCY)
1466      RTEMS_NEWLIB_EXTENSION,
1467    #endif
1468    #if defined(CONFIGURE_STACK_CHECKER_ENABLED)
1469      RTEMS_STACK_CHECKER_EXTENSION,
1470    #endif
1471    #if defined(CONFIGURE_INITIAL_EXTENSIONS)
1472      CONFIGURE_INITIAL_EXTENSIONS,
1473    #endif
1474  };
1475
1476  #define CONFIGURE_INITIAL_EXTENSION_TABLE Configuration_Initial_Extensions
1477  #define CONFIGURE_NUMBER_OF_INITIAL_EXTENSIONS \
1478    ((sizeof(Configuration_Initial_Extensions) / \
1479      sizeof(rtems_extensions_table)))
1480#else
1481  #define CONFIGURE_INITIAL_EXTENSION_TABLE NULL
1482  #define CONFIGURE_NUMBER_OF_INITIAL_EXTENSIONS 0
1483#endif
1484
1485
1486#endif
1487
1488/*
1489 *  POSIX API Configuration Parameters
1490 */
1491
1492#ifdef RTEMS_POSIX_API
1493
1494  #include <sys/types.h>
1495  #include <signal.h>
1496  #include <limits.h>
1497  #include <mqueue.h>
1498  #include <rtems/posix/barrier.h>
1499  #include <rtems/posix/cond.h>
1500  #include <rtems/posix/mqueue.h>
1501  #include <rtems/posix/mutex.h>
1502  #include <rtems/posix/key.h>
1503  #include <rtems/posix/psignal.h>
1504  #include <rtems/posix/rwlock.h>
1505  #include <rtems/posix/semaphore.h>
1506  #include <rtems/posix/spinlock.h>
1507  #include <rtems/posix/threadsup.h>
1508  #include <rtems/posix/timer.h>
1509
1510  /**
1511   *  Account for the object control structures plus the name
1512   *  of the object to be duplicated.
1513   */
1514  #define _Configure_POSIX_Named_Object_RAM(_number, _size) \
1515    _Configure_Object_RAM( (_number), _size ) + \
1516    ((_number) + _Configure_From_workspace(NAME_MAX) )
1517
1518  #ifndef CONFIGURE_MAXIMUM_POSIX_THREADS
1519    #define CONFIGURE_MAXIMUM_POSIX_THREADS      0
1520  #endif
1521
1522  #define CONFIGURE_MEMORY_PER_TASK_FOR_POSIX_API \
1523    _Configure_From_workspace( \
1524      CONFIGURE_MINIMUM_TASK_STACK_SIZE + \
1525      sizeof (POSIX_API_Control) + \
1526     (sizeof (void *) * (CONFIGURE_MAXIMUM_POSIX_KEYS)) \
1527    )
1528
1529  #ifndef CONFIGURE_MAXIMUM_POSIX_MUTEXES
1530    #define CONFIGURE_MAXIMUM_POSIX_MUTEXES              0
1531    #define CONFIGURE_MEMORY_FOR_POSIX_MUTEXES(_mutexes) 0
1532  #else
1533    #define CONFIGURE_MEMORY_FOR_POSIX_MUTEXES(_mutexes) \
1534      _Configure_Object_RAM(_mutexes, sizeof(POSIX_Mutex_Control) )
1535  #endif
1536
1537  #ifndef CONFIGURE_MAXIMUM_POSIX_CONDITION_VARIABLES
1538    #define CONFIGURE_MAXIMUM_POSIX_CONDITION_VARIABLES               0
1539    #define CONFIGURE_MEMORY_FOR_POSIX_CONDITION_VARIABLES(_condvars) 0
1540  #else
1541    #define CONFIGURE_MEMORY_FOR_POSIX_CONDITION_VARIABLES(_condvars) \
1542        _Configure_Object_RAM(_condvars, \
1543                            sizeof(POSIX_Condition_variables_Control) )
1544  #endif
1545
1546  #ifndef CONFIGURE_MAXIMUM_POSIX_KEYS
1547    #define CONFIGURE_MAXIMUM_POSIX_KEYS           0
1548    #define CONFIGURE_MEMORY_FOR_POSIX_KEYS(_keys) 0
1549  #else
1550    #define CONFIGURE_MEMORY_FOR_POSIX_KEYS(_keys) \
1551      _Configure_Object_RAM(_keys, sizeof(POSIX_Keys_Control) )
1552  #endif
1553
1554  #ifndef CONFIGURE_MAXIMUM_POSIX_TIMERS
1555    #define CONFIGURE_MAXIMUM_POSIX_TIMERS             0
1556    #define CONFIGURE_MEMORY_FOR_POSIX_TIMERS(_timers) 0
1557  #else
1558    #define CONFIGURE_MEMORY_FOR_POSIX_TIMERS(_timers) \
1559      _Configure_Object_RAM(_timers, sizeof(POSIX_Timer_Control) )
1560  #endif
1561
1562  #ifndef CONFIGURE_MAXIMUM_POSIX_QUEUED_SIGNALS
1563    #define CONFIGURE_MAXIMUM_POSIX_QUEUED_SIGNALS                     0
1564    #define CONFIGURE_MEMORY_FOR_POSIX_QUEUED_SIGNALS(_queued_signals) 0
1565  #else
1566    #define CONFIGURE_MEMORY_FOR_POSIX_QUEUED_SIGNALS(_queued_signals) \
1567      _Configure_From_workspace( \
1568        (_queued_signals) * (sizeof(POSIX_signals_Siginfo_node)) )
1569  #endif
1570
1571  #ifndef CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUES
1572    #define CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUES                     0
1573    #define CONFIGURE_MEMORY_FOR_POSIX_MESSAGE_QUEUES(_message_queues) 0
1574    #define CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUE_DESCRIPTORS          0
1575    #define CONFIGURE_MEMORY_FOR_POSIX_MESSAGE_QUEUE_DESCRIPTORS(_fds) 0
1576  #else
1577    #define CONFIGURE_MEMORY_FOR_POSIX_MESSAGE_QUEUES(_message_queues) \
1578      _Configure_POSIX_Named_Object_RAM( \
1579         _message_queues, sizeof(POSIX_Message_queue_Control) )
1580
1581    /* default to same number */
1582    #ifndef CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUE_DESCRIPTORS
1583       #define CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUE_DESCRIPTORS \
1584               CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUES
1585    #endif
1586
1587    #define CONFIGURE_MEMORY_FOR_POSIX_MESSAGE_QUEUE_DESCRIPTORS(_mqueue_fds) \
1588      _Configure_POSIX_Named_Object_RAM( \
1589         _mqueue_fds, sizeof(POSIX_Message_queue_Control_fd) )
1590  #endif
1591
1592  #ifndef CONFIGURE_MAXIMUM_POSIX_SEMAPHORES
1593    #define CONFIGURE_MAXIMUM_POSIX_SEMAPHORES                 0
1594    #define CONFIGURE_MEMORY_FOR_POSIX_SEMAPHORES(_semaphores) 0
1595  #else
1596    #define CONFIGURE_MEMORY_FOR_POSIX_SEMAPHORES(_semaphores) \
1597      _Configure_POSIX_Named_Object_RAM( \
1598         _semaphores, sizeof(POSIX_Semaphore_Control) )
1599  #endif
1600
1601  #ifndef CONFIGURE_MAXIMUM_POSIX_BARRIERS
1602    #define CONFIGURE_MAXIMUM_POSIX_BARRIERS               0
1603    #define CONFIGURE_MEMORY_FOR_POSIX_BARRIERS(_barriers) 0
1604  #else
1605    #define CONFIGURE_MEMORY_FOR_POSIX_BARRIERS(_barriers) \
1606      _Configure_Object_RAM(_barriers, sizeof(POSIX_Barrier_Control) )
1607  #endif
1608
1609  #ifndef CONFIGURE_MAXIMUM_POSIX_SPINLOCKS
1610    #define CONFIGURE_MAXIMUM_POSIX_SPINLOCKS                0
1611    #define CONFIGURE_MEMORY_FOR_POSIX_SPINLOCKS(_spinlocks) 0
1612  #else
1613    #define CONFIGURE_MEMORY_FOR_POSIX_SPINLOCKS(_spinlocks) \
1614      _Configure_Object_RAM(_spinlocks, sizeof(POSIX_Spinlock_Control) )
1615  #endif
1616
1617  #ifndef CONFIGURE_MAXIMUM_POSIX_RWLOCKS
1618    #define CONFIGURE_MAXIMUM_POSIX_RWLOCKS              0
1619    #define CONFIGURE_MEMORY_FOR_POSIX_RWLOCKS(_rwlocks) 0
1620  #else
1621    #define CONFIGURE_MEMORY_FOR_POSIX_RWLOCKS(_rwlocks) \
1622      _Configure_Object_RAM(_rwlocks, sizeof(POSIX_RWLock_Control) )
1623  #endif
1624
1625  #ifdef CONFIGURE_POSIX_INIT_THREAD_TABLE
1626
1627    #ifdef CONFIGURE_POSIX_HAS_OWN_INIT_THREAD_TABLE
1628
1629      /*
1630       *  The user is defining their own table information and setting the
1631       *  appropriate variables for the POSIX Initialization Thread Table.
1632       */
1633
1634    #else
1635
1636      #ifndef CONFIGURE_POSIX_INIT_THREAD_ENTRY_POINT
1637        #define CONFIGURE_POSIX_INIT_THREAD_ENTRY_POINT   POSIX_Init
1638      #endif
1639
1640      #ifndef CONFIGURE_POSIX_INIT_THREAD_STACK_SIZE
1641        #define CONFIGURE_POSIX_INIT_THREAD_STACK_SIZE \
1642                (CONFIGURE_MINIMUM_TASK_STACK_SIZE * 2)
1643      #endif
1644
1645      #ifdef CONFIGURE_INIT
1646        posix_initialization_threads_table POSIX_Initialization_threads[] = {
1647          { CONFIGURE_POSIX_INIT_THREAD_ENTRY_POINT, \
1648              CONFIGURE_POSIX_INIT_THREAD_STACK_SIZE }
1649        };
1650      #endif
1651
1652      #define CONFIGURE_POSIX_INIT_THREAD_TABLE_NAME \
1653              POSIX_Initialization_threads
1654
1655      #define CONFIGURE_POSIX_INIT_THREAD_TABLE_SIZE \
1656        sizeof(CONFIGURE_POSIX_INIT_THREAD_TABLE_NAME) / \
1657            sizeof(posix_initialization_threads_table)
1658
1659    #endif    /* CONFIGURE_POSIX_HAS_OWN_INIT_TASK_TABLE */
1660
1661  #else     /* CONFIGURE_POSIX_INIT_THREAD_TABLE */
1662
1663    #define CONFIGURE_POSIX_INIT_THREAD_TABLE_NAME NULL
1664    #define CONFIGURE_POSIX_INIT_THREAD_TABLE_SIZE 0
1665
1666  #endif
1667
1668  #define CONFIGURE_MEMORY_FOR_POSIX \
1669    ( CONFIGURE_MEMORY_FOR_POSIX_MUTEXES( CONFIGURE_MAXIMUM_POSIX_MUTEXES + \
1670          CONFIGURE_MAXIMUM_GO_CHANNELS + CONFIGURE_GO_INIT_MUTEXES) + \
1671      CONFIGURE_MEMORY_FOR_POSIX_CONDITION_VARIABLES( \
1672          CONFIGURE_MAXIMUM_POSIX_CONDITION_VARIABLES + \
1673          CONFIGURE_MAXIMUM_GO_CHANNELS + CONFIGURE_GO_INIT_CONDITION_VARIABLES) + \
1674      CONFIGURE_MEMORY_FOR_POSIX_KEYS( CONFIGURE_MAXIMUM_POSIX_KEYS ) + \
1675      CONFIGURE_MEMORY_FOR_POSIX_QUEUED_SIGNALS( \
1676          CONFIGURE_MAXIMUM_POSIX_QUEUED_SIGNALS ) + \
1677      CONFIGURE_MEMORY_FOR_POSIX_MESSAGE_QUEUES( \
1678          CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUES ) + \
1679      CONFIGURE_MEMORY_FOR_POSIX_MESSAGE_QUEUE_DESCRIPTORS( \
1680          CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUE_DESCRIPTORS ) + \
1681      CONFIGURE_MEMORY_FOR_POSIX_SEMAPHORES( \
1682          CONFIGURE_MAXIMUM_POSIX_SEMAPHORES ) + \
1683      CONFIGURE_MEMORY_FOR_POSIX_BARRIERS(CONFIGURE_MAXIMUM_POSIX_BARRIERS) + \
1684      CONFIGURE_MEMORY_FOR_POSIX_SPINLOCKS( \
1685          CONFIGURE_MAXIMUM_POSIX_SPINLOCKS ) + \
1686      CONFIGURE_MEMORY_FOR_POSIX_RWLOCKS( \
1687          CONFIGURE_MAXIMUM_POSIX_RWLOCKS ) + \
1688      CONFIGURE_MEMORY_FOR_POSIX_TIMERS( CONFIGURE_MAXIMUM_POSIX_TIMERS ) + \
1689      (CONFIGURE_POSIX_INIT_THREAD_STACK_SIZE) \
1690     )
1691#else
1692
1693  #define CONFIGURE_MAXIMUM_POSIX_THREADS         0
1694  #define CONFIGURE_MEMORY_PER_TASK_FOR_POSIX_API 0
1695  #define CONFIGURE_MEMORY_FOR_POSIX              0
1696
1697#endif    /* RTEMS_POSIX_API */
1698
1699#ifndef CONFIGURE_POSIX_INIT_THREAD_STACK_SIZE
1700  #define CONFIGURE_POSIX_INIT_THREAD_STACK_SIZE    0
1701#endif
1702
1703/*
1704 *  This block of defines are for applications which use GNAT/RTEMS.
1705 *  GNAT implements each Ada task as a POSIX thread.
1706 */
1707#ifdef CONFIGURE_GNAT_RTEMS
1708
1709  /**
1710   *  The GNAT run-time needs something less than (10) POSIX mutexes.
1711   *  We may be able to get by with less but why bother.
1712   */
1713  #define CONFIGURE_GNAT_MUTEXES 10
1714
1715  /**
1716   *  This is the maximum number of Ada tasks which can be concurrently
1717   *  in existence.  Twenty (20) are required to run all tests in the
1718   *  ACATS (formerly ACVC).
1719   */
1720  #ifndef CONFIGURE_MAXIMUM_ADA_TASKS
1721    #define CONFIGURE_MAXIMUM_ADA_TASKS  20
1722  #endif
1723
1724  /**
1725   * This is the number of non-Ada tasks which invoked Ada code.
1726   */
1727  #ifndef CONFIGURE_MAXIMUM_FAKE_ADA_TASKS
1728    #define CONFIGURE_MAXIMUM_FAKE_ADA_TASKS 0
1729  #endif
1730
1731  /**
1732   * Ada tasks are allocated twice the minimum stack space.
1733   */
1734  #define CONFIGURE_ADA_TASKS_STACK \
1735    (CONFIGURE_MAXIMUM_ADA_TASKS * \
1736      (CONFIGURE_MINIMUM_TASK_STACK_SIZE + (6 * 1024)))
1737
1738#else
1739  #define CONFIGURE_GNAT_MUTEXES           0
1740  #define CONFIGURE_MAXIMUM_ADA_TASKS      0
1741  #define CONFIGURE_MAXIMUM_FAKE_ADA_TASKS 0
1742  #define CONFIGURE_ADA_TASKS_STACK        0
1743#endif
1744
1745#ifdef CONFIGURE_ENABLE_GO
1746
1747  #ifndef CONFIGURE_MAXIMUM_POSIX_THREADS
1748    #define CONFIGURE_MAXIMUM_POSIX_THREADS 1
1749  #endif
1750  #ifndef CONFIGURE_MAXIMUM_POSIX_MUTEXES
1751    #define CONFIGURE_MAXIMUM_POSIX_MUTEXES 1
1752  #endif
1753  #ifndef CONFIGURE_MAXIMUM_POSIX_CONDITION_VARIABLES
1754    #define CONFIGURE_MAXIMUM_CONDITION_VARIABLES 1
1755  #endif
1756
1757  #define CONFIGURE_GO_INIT_MUTEXES 77
1758  #define CONFIGURE_GO_INIT_CONDITION_VARIABLES 4
1759
1760  #ifndef CONFIGURE_MAXIMUM_GOROUTINES
1761    #define CONFIGURE_MAXIMUM_GOROUTINES 400
1762  #endif
1763
1764  #define CONFIGURE_GOROUTINES_TASK_VARIABLES \
1765    (2 * CONFIGURE_MAXIMUM_GOROUTINES)
1766
1767  #ifndef CONFIGURE_MAXIMUM_GO_CHANNELS
1768    #define CONFIGURE_MAXIMUM_GO_CHANNELS 500
1769  #endif
1770
1771#else
1772  #define CONFIGURE_GO_INIT_MUTEXES             0
1773  #define CONFIGURE_GO_INIT_CONDITION_VARIABLES 0
1774  #define CONFIGURE_MAXIMUM_GOROUTINES          0
1775  #define CONFIGURE_GOROUTINES_TASK_VARIABLES   0
1776  #define CONFIGURE_MAXIMUM_GO_CHANNELS         0
1777#endif
1778
1779#ifndef RTEMS_SCHEDSIM
1780/**
1781 *  This macro specifies the amount of memory to be reserved for the
1782 *  Newlib C Library reentrancy structure -- if we are using newlib.
1783 */
1784
1785#if (defined(RTEMS_NEWLIB) && !defined(CONFIGURE_DISABLE_NEWLIB_REENTRANCY))
1786  #include <reent.h>
1787
1788  #define CONFIGURE_MEMORY_PER_TASK_FOR_NEWLIB \
1789    _Configure_From_workspace(sizeof(struct _reent))
1790#else
1791  #define CONFIGURE_MEMORY_PER_TASK_FOR_NEWLIB 0
1792#endif
1793
1794#else
1795  #define CONFIGURE_MEMORY_PER_TASK_FOR_NEWLIB 0
1796#endif
1797
1798
1799/*
1800 *  Calculate the RAM size based on the maximum number of objects configured.
1801 */
1802
1803#ifndef CONFIGURE_EXECUTIVE_RAM_SIZE
1804
1805/**
1806 *  Account for allocating the following per object
1807 *    + array of object control structures
1808 *    + local pointer table -- pointer per object plus a zero'th
1809 *      entry in the local pointer table.
1810 */
1811
1812#define CONFIGURE_MEMORY_FOR_TASKS(_tasks, _number_FP_tasks) \
1813 ( \
1814  _Configure_Object_RAM(_tasks, sizeof(Thread_Control)) + \
1815  (_Configure_Max_Objects(_tasks) * \
1816   (_Configure_From_workspace(CONFIGURE_MINIMUM_TASK_STACK_SIZE) + \
1817    CONFIGURE_MEMORY_PER_TASK_FOR_CLASSIC_API + \
1818    CONFIGURE_MEMORY_PER_TASK_FOR_NEWLIB + \
1819    CONFIGURE_MEMORY_PER_TASK_FOR_POSIX_API + \
1820    CONFIGURE_MEMORY_PER_TASK_FOR_SCHEDULER))  + \
1821  _Configure_From_workspace( \
1822    _Configure_Max_Objects(_number_FP_tasks) * CONTEXT_FP_SIZE) + \
1823  _Configure_From_workspace( \
1824          (CONFIGURE_MAXIMUM_USER_EXTENSIONS + 1) * sizeof(void *)) \
1825 )
1826
1827/**
1828 *  This defines the amount of memory configured for the multiprocessing
1829 *  support required by this application.
1830 */
1831#ifdef CONFIGURE_MP_APPLICATION
1832  #define CONFIGURE_MEMORY_FOR_MP \
1833    (CONFIGURE_MEMORY_FOR_PROXIES(CONFIGURE_MP_MAXIMUM_PROXIES) + \
1834     CONFIGURE_MEMORY_FOR_GLOBAL_OBJECTS( \
1835             CONFIGURE_MP_MAXIMUM_GLOBAL_OBJECTS) + \
1836     CONFIGURE_MEMORY_FOR_TASKS(1, 1) + \
1837     CONFIGURE_EXTRA_MPCI_RECEIVE_SERVER_STACK \
1838  )
1839#else
1840  #define CONFIGURE_MEMORY_FOR_MP  0
1841#endif
1842
1843/**
1844 *  This is so we can account for tasks with stacks greater than minimum
1845 *  size.  This is in bytes.
1846 */
1847#ifndef CONFIGURE_EXTRA_TASK_STACKS
1848  #define CONFIGURE_EXTRA_TASK_STACKS 0
1849#endif
1850
1851/**
1852 *  The following macro is used to calculate the memory allocated by RTEMS
1853 *  for the message buffers associated with a particular message queue.
1854 *  There is a fixed amount of overhead per message.
1855 */
1856#define CONFIGURE_MESSAGE_BUFFERS_FOR_QUEUE(_messages, _size) \
1857    _Configure_From_workspace( \
1858      (_messages) * ((_size) + sizeof(CORE_message_queue_Buffer_control)))
1859
1860/**
1861 *  This macros is set to the amount of memory required for pending message
1862 *  buffers in bytes.  It should be constructed by adding together a
1863 *  set of values determined by CONFIGURE_MESSAGE_BUFFERS_FOR_QUEUE.
1864 */
1865#ifndef CONFIGURE_MESSAGE_BUFFER_MEMORY
1866  #define CONFIGURE_MESSAGE_BUFFER_MEMORY 0
1867#endif
1868
1869/**
1870 *  This macro is available just in case the confdefs.h file underallocates
1871 *  memory for a particular application.  This lets the user add some extra
1872 *  memory in case something broken and underestimates.
1873 *
1874 *  It is also possible for cases where confdefs.h overallocates memory,
1875 *  you could substract memory from the allocated.  The estimate is just
1876 *  that, an estimate, and assumes worst case alignment and padding on
1877 *  each allocated element.  So in some cases it could be too conservative.
1878 *
1879 *  @note Historically this was used for message buffers.
1880 */
1881#ifndef CONFIGURE_MEMORY_OVERHEAD
1882  #define CONFIGURE_MEMORY_OVERHEAD 0
1883#endif
1884
1885/**
1886 *  On architectures that use Simple Vectored Interrupts, it is RTEMS
1887 *  responsibility to allocate the vector table.  This avoids reserving
1888 *  the memory on architectures that use the Programmable Interrupt
1889 *  Controller Vectored Interrupts.
1890 */
1891#if (CPU_SIMPLE_VECTORED_INTERRUPTS == TRUE)
1892  /*
1893   *  This is a (hopefully) temporary hack.  On the mips, the number of
1894   *  vectors is NOT statically defined.  But it has to be statically
1895   *  defined for this to work.  This is an issue looking for a nice
1896   *  solution.
1897   */
1898  #if defined(__mips__)
1899    #define CONFIGURE_INTERRUPT_VECTOR_TABLE \
1900      _Configure_From_workspace( (sizeof(ISR_Handler_entry) * 256))
1901  #else
1902    #define CONFIGURE_INTERRUPT_VECTOR_TABLE \
1903      _Configure_From_workspace( \
1904        (sizeof(ISR_Handler_entry) * ISR_NUMBER_OF_VECTORS))
1905  #endif
1906#else
1907  #define CONFIGURE_INTERRUPT_VECTOR_TABLE 0
1908#endif
1909
1910/**
1911 *  RTEMS uses one instance of an internal mutex class.  This accounts
1912 *  for that mutex
1913 */
1914#define CONFIGURE_API_MUTEX_MEMORY \
1915  _Configure_Object_RAM(1, sizeof(API_Mutex_Control))
1916
1917/**
1918 *  This defines the formula used to compute the amount of memory
1919 *  reserved for IDLE task control structures and stacks.
1920 */
1921#define CONFIGURE_IDLE_TASKS(_count) \
1922    (CONFIGURE_MEMORY_FOR_TASKS(_count, 0) + \
1923      _count * _Configure_From_workspace( \
1924       (CONFIGURE_IDLE_TASK_STACK_SIZE - CONFIGURE_MINIMUM_TASK_STACK_SIZE)))
1925
1926/**
1927 *  This calculates the amount of memory reserved for the IDLE tasks.
1928 *  In an SMP system, each CPU core has its own idle task.
1929 */
1930#if defined(RTEMS_SMP)
1931  #define CONFIGURE_MEMORY_FOR_IDLE_TASK \
1932          CONFIGURE_IDLE_TASKS(CONFIGURE_SMP_MAXIMUM_PROCESSORS)
1933#else
1934  #define CONFIGURE_MEMORY_FOR_IDLE_TASK \
1935          CONFIGURE_IDLE_TASKS(1)
1936#endif
1937
1938/**
1939 *  This macro accounts for general RTEMS system overhead.
1940 */
1941#define CONFIGURE_MEMORY_FOR_SYSTEM_OVERHEAD \
1942  ( CONFIGURE_MEMORY_FOR_IDLE_TASK +                /* IDLE and stack */ \
1943    CONFIGURE_MEMORY_FOR_SCHEDULER +                /* Scheduler */ \
1944    CONFIGURE_INTERRUPT_VECTOR_TABLE +             /* interrupt vectors */ \
1945    CONFIGURE_INTERRUPT_STACK_MEMORY +             /* interrupt stack */ \
1946    CONFIGURE_API_MUTEX_MEMORY                     /* allocation mutex */ \
1947  )
1948
1949/*
1950 *  Now account for any extra memory that initialization tasks or threads
1951 *  may have requested.
1952 */
1953
1954/**
1955 *  This accounts for any extra memory required by the Classic API
1956 *  Initialization Task.
1957 */
1958#if (CONFIGURE_INIT_TASK_STACK_SIZE > CONFIGURE_MINIMUM_TASK_STACK_SIZE)
1959  #define CONFIGURE_INITIALIZATION_THREADS_STACKS_CLASSIC_PART \
1960      (CONFIGURE_INIT_TASK_STACK_SIZE - CONFIGURE_MINIMUM_TASK_STACK_SIZE)
1961#else
1962  #define CONFIGURE_INITIALIZATION_THREADS_STACKS_CLASSIC_PART 0
1963#endif
1964
1965/**
1966 *  This accounts for any extra memory required by the POSIX API
1967 *  Initialization Thread.
1968 */
1969#if defined(RTEMS_POSIX_API) && \
1970    (CONFIGURE_POSIX_INIT_THREAD_STACK_SIZE > CONFIGURE_MINIMUM_TASK_STACK_SIZE)
1971  #define CONFIGURE_INITIALIZATION_THREADS_STACKS_POSIX_PART \
1972    (CONFIGURE_POSIX_INIT_THREAD_STACK_SIZE - CONFIGURE_MINIMUM_TASK_STACK_SIZE)
1973#else
1974  #define CONFIGURE_INITIALIZATION_THREADS_STACKS_POSIX_PART 0
1975#endif
1976
1977/**
1978 *  This macro provides a summation of the various initialization task
1979 *  and thread stack requirements.
1980 */
1981#define CONFIGURE_INITIALIZATION_THREADS_STACKS \
1982    (CONFIGURE_INITIALIZATION_THREADS_STACKS_CLASSIC_PART + \
1983    CONFIGURE_INITIALIZATION_THREADS_STACKS_POSIX_PART)
1984
1985/**
1986 *  This macro provides a summation of the various task and thread
1987 *  requirements.
1988 */
1989#define CONFIGURE_TOTAL_TASKS_AND_THREADS \
1990   (CONFIGURE_MAXIMUM_TASKS + \
1991    CONFIGURE_MAXIMUM_POSIX_THREADS + CONFIGURE_MAXIMUM_ADA_TASKS + \
1992    CONFIGURE_MAXIMUM_GOROUTINES)
1993
1994/**
1995 *  This macro reserves the memory required by the statically configured
1996 *  user extensions.
1997 */
1998#define CONFIGURE_MEMORY_FOR_STATIC_EXTENSIONS \
1999     ((CONFIGURE_NEWLIB_EXTENSION * \
2000        _Configure_From_workspace( sizeof(User_extensions_Control))) + \
2001      (CONFIGURE_STACK_CHECKER_EXTENSION * \
2002        _Configure_From_workspace( sizeof(User_extensions_Control))) \
2003     )
2004
2005/**
2006 *  This macro provides a summation of the memory required by the
2007 *  Classic API as configured.
2008 */
2009#define CONFIGURE_MEMORY_FOR_CLASSIC \
2010  (CONFIGURE_MEMORY_FOR_TASK_VARIABLES(CONFIGURE_MAXIMUM_TASK_VARIABLES + \
2011    CONFIGURE_GOROUTINES_TASK_VARIABLES) + \
2012   CONFIGURE_MEMORY_FOR_TIMERS(CONFIGURE_MAXIMUM_TIMERS + \
2013    CONFIGURE_TIMER_FOR_SHARED_MEMORY_DRIVER ) + \
2014   CONFIGURE_MEMORY_FOR_SEMAPHORES(CONFIGURE_SEMAPHORES) + \
2015   CONFIGURE_MEMORY_FOR_MESSAGE_QUEUES(CONFIGURE_MAXIMUM_MESSAGE_QUEUES) + \
2016   CONFIGURE_MEMORY_FOR_PARTITIONS(CONFIGURE_MAXIMUM_PARTITIONS) + \
2017   CONFIGURE_MEMORY_FOR_REGIONS( CONFIGURE_MAXIMUM_REGIONS ) + \
2018   CONFIGURE_MEMORY_FOR_PORTS(CONFIGURE_MAXIMUM_PORTS) + \
2019   CONFIGURE_MEMORY_FOR_PERIODS(CONFIGURE_MAXIMUM_PERIODS) + \
2020   CONFIGURE_MEMORY_FOR_BARRIERS(CONFIGURE_BARRIERS) + \
2021   CONFIGURE_MEMORY_FOR_USER_EXTENSIONS(CONFIGURE_MAXIMUM_USER_EXTENSIONS) \
2022  )
2023
2024#if defined(RTEMS_SMP)
2025  #define CONFIGURE_MEMORY_FOR_SMP \
2026     (CONFIGURE_SMP_MAXIMUM_PROCESSORS * \
2027      _Configure_From_workspace( CONFIGURE_INTERRUPT_STACK_SIZE ) \
2028     )
2029#else
2030  #define CONFIGURE_MEMORY_FOR_SMP 0
2031#endif
2032
2033#if defined(CONFIGURE_CONFDEFS_DEBUG) && defined(CONFIGURE_INIT)
2034  /**
2035   *  This is a debug mechanism, so if you need to, the executable will
2036   *  have a structure with various partial values.  Add to this as you
2037   *  need to.  Viewing this structure in gdb combined with dumping
2038   *  the Configuration structures generated should help a lot in tracing
2039   *  down errors and analyzing where over and under allocations are.
2040   */
2041  typedef struct {
2042    uint32_t SYSTEM_OVERHEAD;
2043    uint32_t STATIC_EXTENSIONS;
2044    uint32_t INITIALIZATION_THREADS_STACKS;
2045
2046    uint32_t PER_INTEGER_TASK;
2047    uint32_t FP_OVERHEAD;
2048    uint32_t CLASSIC;
2049    uint32_t POSIX;
2050
2051    /* System overhead pieces */
2052    uint32_t INTERRUPT_VECTOR_TABLE;
2053    uint32_t INTERRUPT_STACK_MEMORY;
2054    uint32_t MEMORY_FOR_IDLE_TASK;
2055    uint32_t MEMORY_FOR_SCHEDULER;
2056    uint32_t MEMORY_PER_TASK_FOR_SCHEDULER;
2057
2058    /* Classic API Pieces */
2059    uint32_t CLASSIC_TASKS;
2060    uint32_t TASK_VARIABLES;
2061    uint32_t TIMERS;
2062    uint32_t SEMAPHORES;
2063    uint32_t MESSAGE_QUEUES;
2064    uint32_t PARTITIONS;
2065    uint32_t REGIONS;
2066    uint32_t PORTS;
2067    uint32_t PERIODS;
2068    uint32_t BARRIERS;
2069    uint32_t USER_EXTENSIONS;
2070#ifdef RTEMS_POSIX_API
2071    /* POSIX API Pieces */
2072    uint32_t POSIX_MUTEXES;
2073    uint32_t POSIX_CONDITION_VARIABLES;
2074    uint32_t POSIX_KEYS;
2075    uint32_t POSIX_TIMERS;
2076    uint32_t POSIX_QUEUED_SIGNALS;
2077    uint32_t POSIX_MESSAGE_QUEUES;
2078    uint32_t POSIX_SEMAPHORES;
2079    uint32_t POSIX_BARRIERS;
2080    uint32_t POSIX_SPINLOCKS;
2081    uint32_t POSIX_RWLOCKS;
2082#endif
2083  } Configuration_Debug_t;
2084
2085  Configuration_Debug_t Configuration_Memory_Debug = {
2086    /* General Information */
2087    CONFIGURE_MEMORY_FOR_SYSTEM_OVERHEAD,
2088    CONFIGURE_MEMORY_FOR_STATIC_EXTENSIONS,
2089    CONFIGURE_INITIALIZATION_THREADS_STACKS,
2090    CONFIGURE_MEMORY_FOR_TASKS(1, 0),
2091    CONFIGURE_MEMORY_FOR_TASKS(0, 1),
2092    CONFIGURE_MEMORY_FOR_CLASSIC,
2093    CONFIGURE_MEMORY_FOR_POSIX,
2094
2095    /* System overhead pieces */
2096    CONFIGURE_INTERRUPT_VECTOR_TABLE,
2097    CONFIGURE_INTERRUPT_STACK_MEMORY,
2098    CONFIGURE_MEMORY_FOR_IDLE_TASK,
2099    CONFIGURE_MEMORY_FOR_SCHEDULER,
2100    CONFIGURE_MEMORY_PER_TASK_FOR_SCHEDULER,
2101
2102    /* Classic API Pieces */
2103    CONFIGURE_MEMORY_FOR_TASKS(CONFIGURE_MAXIMUM_TASKS, 0),
2104    CONFIGURE_MEMORY_FOR_TASK_VARIABLES(CONFIGURE_MAXIMUM_TASK_VARIABLES +
2105      CONFIGURE_GOROUTINES_TASK_VARIABLES),
2106    CONFIGURE_MEMORY_FOR_TIMERS(CONFIGURE_MAXIMUM_TIMERS),
2107    CONFIGURE_MEMORY_FOR_SEMAPHORES(CONFIGURE_SEMAPHORES),
2108    CONFIGURE_MEMORY_FOR_MESSAGE_QUEUES(CONFIGURE_MAXIMUM_MESSAGE_QUEUES),
2109    CONFIGURE_MEMORY_FOR_PARTITIONS(CONFIGURE_MAXIMUM_PARTITIONS),
2110    CONFIGURE_MEMORY_FOR_REGIONS( CONFIGURE_MAXIMUM_REGIONS ),
2111    CONFIGURE_MEMORY_FOR_PORTS(CONFIGURE_MAXIMUM_PORTS),
2112    CONFIGURE_MEMORY_FOR_PERIODS(CONFIGURE_MAXIMUM_PERIODS),
2113    CONFIGURE_MEMORY_FOR_BARRIERS(CONFIGURE_BARRIERS),
2114    CONFIGURE_MEMORY_FOR_USER_EXTENSIONS(CONFIGURE_MAXIMUM_USER_EXTENSIONS),
2115
2116#ifdef RTEMS_POSIX_API
2117    /* POSIX API Pieces */
2118    CONFIGURE_MEMORY_FOR_POSIX_MUTEXES( CONFIGURE_MAXIMUM_POSIX_MUTEXES +
2119      CONFIGURE_MAXIMUM_GO_CHANNELS + CONFIGURE_GO_INIT_MUTEXES),
2120    CONFIGURE_MEMORY_FOR_POSIX_CONDITION_VARIABLES(
2121      CONFIGURE_MAXIMUM_POSIX_CONDITION_VARIABLES +
2122      CONFIGURE_MAXIMUM_GO_CHANNELS + CONFIGURE_GO_INIT_CONDITION_VARIABLES),
2123    CONFIGURE_MEMORY_FOR_POSIX_KEYS( CONFIGURE_MAXIMUM_POSIX_KEYS ),
2124    CONFIGURE_MEMORY_FOR_POSIX_QUEUED_SIGNALS(
2125      CONFIGURE_MAXIMUM_POSIX_QUEUED_SIGNALS ),
2126    CONFIGURE_MEMORY_FOR_POSIX_MESSAGE_QUEUES(
2127      CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUES ),
2128    CONFIGURE_MEMORY_FOR_POSIX_SEMAPHORES( CONFIGURE_MAXIMUM_POSIX_SEMAPHORES ),
2129    CONFIGURE_MEMORY_FOR_POSIX_BARRIERS( CONFIGURE_MAXIMUM_POSIX_BARRIERS ),
2130    CONFIGURE_MEMORY_FOR_POSIX_SPINLOCKS( CONFIGURE_MAXIMUM_POSIX_SPINLOCKS ),
2131    CONFIGURE_MEMORY_FOR_POSIX_RWLOCKS( CONFIGURE_MAXIMUM_POSIX_RWLOCKS ),
2132    CONFIGURE_MEMORY_FOR_POSIX_TIMERS( CONFIGURE_MAXIMUM_POSIX_TIMERS ),
2133#endif
2134  };
2135#endif
2136
2137/**
2138 *  This calculates the memory required for the executive workspace.
2139 */
2140#define CONFIGURE_EXECUTIVE_RAM_SIZE \
2141(( \
2142   CONFIGURE_MEMORY_FOR_SYSTEM_OVERHEAD + \
2143   CONFIGURE_MEMORY_FOR_DEVFS + \
2144   CONFIGURE_MEMORY_FOR_TASKS( \
2145     CONFIGURE_TOTAL_TASKS_AND_THREADS, CONFIGURE_TOTAL_TASKS_AND_THREADS) + \
2146   CONFIGURE_MEMORY_FOR_CLASSIC + \
2147   CONFIGURE_MEMORY_FOR_POSIX + \
2148   (CONFIGURE_MAXIMUM_POSIX_THREADS * CONFIGURE_MINIMUM_TASK_STACK_SIZE ) + \
2149   (CONFIGURE_MAXIMUM_GOROUTINES * CONFIGURE_MINIMUM_TASK_STACK_SIZE) + \
2150   CONFIGURE_INITIALIZATION_THREADS_STACKS + \
2151   CONFIGURE_MEMORY_FOR_STATIC_EXTENSIONS + \
2152   CONFIGURE_MEMORY_FOR_MP + \
2153   CONFIGURE_MEMORY_FOR_SMP + \
2154   CONFIGURE_MESSAGE_BUFFER_MEMORY + \
2155   (CONFIGURE_MEMORY_OVERHEAD * 1024) + \
2156   (CONFIGURE_EXTRA_TASK_STACKS) + (CONFIGURE_ADA_TASKS_STACK) \
2157) & ~0x7)
2158#endif
2159
2160#ifdef CONFIGURE_INIT
2161  /**
2162   *  This is the Classic API Configuration Table.
2163   */
2164  rtems_api_configuration_table Configuration_RTEMS_API = {
2165    CONFIGURE_MAXIMUM_TASKS,
2166    CONFIGURE_NOTEPADS_ENABLED,
2167    CONFIGURE_MAXIMUM_TIMERS + CONFIGURE_TIMER_FOR_SHARED_MEMORY_DRIVER,
2168    CONFIGURE_SEMAPHORES,
2169    CONFIGURE_MAXIMUM_MESSAGE_QUEUES,
2170    CONFIGURE_MAXIMUM_PARTITIONS,
2171    CONFIGURE_MAXIMUM_REGIONS,
2172    CONFIGURE_MAXIMUM_PORTS,
2173    CONFIGURE_MAXIMUM_PERIODS,
2174    CONFIGURE_BARRIERS,
2175    CONFIGURE_INIT_TASK_TABLE_SIZE,
2176    CONFIGURE_INIT_TASK_TABLE
2177  };
2178
2179  #ifdef RTEMS_POSIX_API
2180    /**
2181     *  This is the POSIX API Configuration Table.
2182     */
2183    posix_api_configuration_table Configuration_POSIX_API = {
2184      CONFIGURE_MAXIMUM_POSIX_THREADS + CONFIGURE_MAXIMUM_ADA_TASKS +
2185        CONFIGURE_MAXIMUM_GOROUTINES,
2186      CONFIGURE_MAXIMUM_POSIX_MUTEXES + CONFIGURE_GNAT_MUTEXES +
2187        CONFIGURE_MAXIMUM_ADA_TASKS + CONFIGURE_MAXIMUM_FAKE_ADA_TASKS +
2188        CONFIGURE_GO_INIT_MUTEXES + CONFIGURE_MAXIMUM_GO_CHANNELS,
2189      CONFIGURE_MAXIMUM_POSIX_CONDITION_VARIABLES +
2190        CONFIGURE_MAXIMUM_ADA_TASKS + CONFIGURE_MAXIMUM_FAKE_ADA_TASKS +
2191        CONFIGURE_GO_INIT_CONDITION_VARIABLES + CONFIGURE_MAXIMUM_GO_CHANNELS,
2192      CONFIGURE_MAXIMUM_POSIX_KEYS,
2193      CONFIGURE_MAXIMUM_POSIX_TIMERS,
2194      CONFIGURE_MAXIMUM_POSIX_QUEUED_SIGNALS,
2195      CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUES,
2196      CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUE_DESCRIPTORS,
2197      CONFIGURE_MAXIMUM_POSIX_SEMAPHORES,
2198      CONFIGURE_MAXIMUM_POSIX_BARRIERS,
2199      CONFIGURE_MAXIMUM_POSIX_RWLOCKS,
2200      CONFIGURE_MAXIMUM_POSIX_SPINLOCKS,
2201      CONFIGURE_POSIX_INIT_THREAD_TABLE_SIZE,
2202      CONFIGURE_POSIX_INIT_THREAD_TABLE_NAME
2203    };
2204  #endif
2205
2206  /** This variable specifies the minimum stack size for tasks in an RTEMS
2207   *  application.
2208   *
2209   *  @note This is left as a simple uint32_t so it can be externed as
2210   *        needed without requring being high enough logical to
2211   *        include the full configuration table.
2212   */
2213  uint32_t rtems_minimum_stack_size =
2214    CONFIGURE_MINIMUM_TASK_STACK_SIZE;
2215
2216  /** This variable specifies the maximum priority value that
2217   *  a task may have.  This must be a power of 2 between 4
2218   *  and 256 and is specified in terms of Classic API
2219   *  priority values.
2220   *
2221   *  @note This is left as a simple uint8_t so it can be externed as
2222   *        needed without requring being high enough logical to
2223   *        include the full configuration table.
2224   */
2225  uint8_t rtems_maximum_priority = CONFIGURE_MAXIMUM_PRIORITY;
2226
2227  /**
2228   *  This is the primary Configuration Table for this application.
2229   */
2230  rtems_configuration_table Configuration = {
2231    NULL,                                     /* filled in by BSP */
2232    CONFIGURE_EXECUTIVE_RAM_SIZE,             /* required RTEMS workspace */
2233    CONFIGURE_MAXIMUM_USER_EXTENSIONS,        /* maximum dynamic extensions */
2234    CONFIGURE_MICROSECONDS_PER_TICK,          /* microseconds per clock tick */
2235    CONFIGURE_TICKS_PER_TIMESLICE,            /* ticks per timeslice quantum */
2236    CONFIGURE_IDLE_TASK_BODY,                 /* user's IDLE task */
2237    CONFIGURE_IDLE_TASK_STACK_SIZE,           /* IDLE task stack size */
2238    CONFIGURE_INTERRUPT_STACK_SIZE,           /* interrupt stack size */
2239    CONFIGURE_TASK_STACK_ALLOCATOR,           /* stack allocator */
2240    CONFIGURE_TASK_STACK_DEALLOCATOR,         /* stack deallocator */
2241    CONFIGURE_ZERO_WORKSPACE_AUTOMATICALLY,   /* true to clear memory */
2242    CONFIGURE_MAXIMUM_DRIVERS,                /* maximum device drivers */
2243    CONFIGURE_NUMBER_OF_DRIVERS,              /* static device drivers */
2244    Device_drivers,                           /* pointer to driver table */
2245    CONFIGURE_NUMBER_OF_INITIAL_EXTENSIONS,   /* number of static extensions */
2246    CONFIGURE_INITIAL_EXTENSION_TABLE,        /* pointer to static extensions */
2247    #if defined(RTEMS_MULTIPROCESSING)
2248      CONFIGURE_MULTIPROCESSING_TABLE,        /* pointer to MP config table */
2249    #endif
2250  };
2251#endif
2252
2253#endif /* CONFIGURE_HAS_OWN_CONFIGURATION_TABLE */
2254
2255#if defined(RTEMS_SMP)
2256  /**
2257   *  Instantiate the variable which specifies the number of CPUs
2258   *  in an SMP configuration.
2259   */
2260  #if defined(CONFIGURE_INIT)
2261    uint32_t rtems_configuration_smp_maximum_processors = \
2262        CONFIGURE_SMP_MAXIMUM_PROCESSORS;
2263  #else
2264    extern uint32_t rtems_configuration_smp_maximum_processors;
2265  #endif
2266 /*
2267  * Instantiate the Per CPU information based upon the user configuration.
2268  */
2269 #if defined(CONFIGURE_INIT)
2270   Per_CPU_Control _Per_CPU_Information[CONFIGURE_SMP_MAXIMUM_PROCESSORS];
2271   Per_CPU_Control *_Per_CPU_Information_p[CONFIGURE_SMP_MAXIMUM_PROCESSORS];
2272 #endif
2273
2274#endif
2275
2276/*
2277 *  If the user has configured a set of Classic API Initialization Tasks,
2278 *  then we need to install the code that runs that loop.
2279 */
2280#ifdef CONFIGURE_INIT
2281  #if defined(CONFIGURE_RTEMS_INIT_TASKS_TABLE) || \
2282      defined(CONFIGURE_HAS_OWN_INIT_TASK_TABLE)
2283    void (_RTEMS_tasks_Initialize_user_tasks_body)(void);
2284    void (*_RTEMS_tasks_Initialize_user_tasks_p)(void) =
2285              _RTEMS_tasks_Initialize_user_tasks_body;
2286  #else
2287    void (*_RTEMS_tasks_Initialize_user_tasks_p)(void) = NULL;
2288  #endif
2289#endif
2290
2291/*
2292 *  If the user has configured a set of POSIX Initialization Threads,
2293 *  then we need to install the code that runs that loop.
2294 */
2295#ifdef RTEMS_POSIX_API
2296  #ifdef CONFIGURE_INIT
2297    #if defined(CONFIGURE_POSIX_INIT_THREAD_TABLE) || \
2298        defined(CONFIGURE_POSIX_HAS_OWN_INIT_THREAD_TABLE)
2299      void _POSIX_Threads_Initialize_user_threads_body(void);
2300      void (*_POSIX_Threads_Initialize_user_threads_p)(void) =
2301                _POSIX_Threads_Initialize_user_threads_body;
2302    #else
2303      void (*_POSIX_Threads_Initialize_user_threads_p)(void) = NULL;
2304    #endif
2305  #endif
2306#endif
2307
2308#ifdef __cplusplus
2309}
2310#endif
2311
2312/******************************************************************
2313 ******************************************************************
2314 ******************************************************************
2315 *         CONFIGURATION WARNINGS AND ERROR CHECKING              *
2316 ******************************************************************
2317 ******************************************************************
2318 ******************************************************************
2319 */
2320
2321/*
2322 *  Make sure a task/thread of some sort is configured.
2323 *
2324 *  When analyzing RTEMS to find the smallest possible of memory
2325 *  that must be allocated, you probably do want to configure 0
2326 *  tasks/threads so there is a smaller set of calls to _Workspace_Allocate
2327 *  to analyze.
2328 */
2329#if !defined(CONFIGURE_IDLE_TASK_INITIALIZES_APPLICATION)
2330  #if (CONFIGURE_MAXIMUM_TASKS == 0) && \
2331      (CONFIGURE_MAXIMUM_POSIX_THREADS == 0) && \
2332      (CONFIGURE_MAXIMUM_ADA_TASKS == 0) && \
2333      (CONFIGURE_MAXIMUM_GOROUTINES == 0)
2334    #error "CONFIGURATION ERROR: No tasks or threads configured!!"
2335  #endif
2336#endif
2337
2338#ifndef RTEMS_SCHEDSIM
2339/*
2340 *  Make sure at least one of the initialization task/thread
2341 *  tables was defined.
2342 */
2343#if !defined(CONFIGURE_RTEMS_INIT_TASKS_TABLE) && \
2344    !defined(CONFIGURE_POSIX_INIT_THREAD_TABLE) && \
2345    !defined(CONFIGURE_IDLE_TASK_INITIALIZES_APPLICATION)
2346#error "CONFIGURATION ERROR: No initialization tasks or threads configured!!"
2347#endif
2348#endif
2349
2350/*
2351 *  If the user is trying to configure a multiprocessing application and
2352 *  RTEMS was not configured and built multiprocessing, then error out.
2353 */
2354#if defined(CONFIGURE_MP_APPLICATION) && \
2355    !defined(RTEMS_MULTIPROCESSING)
2356#error "CONFIGURATION ERROR: RTEMS not configured for multiprocessing!!"
2357#endif
2358
2359/*
2360 *  If an attempt was made to configure POSIX objects and
2361 *  the POSIX API was not configured into RTEMS, error out.
2362 */
2363#if !defined(RTEMS_POSIX_API)
2364  #if ((CONFIGURE_MAXIMUM_POSIX_THREADS != 0) || \
2365       (CONFIGURE_MAXIMUM_POSIX_MUTEXES != 0) || \
2366       (CONFIGURE_MAXIMUM_POSIX_CONDITION_VARIABLES != 0) || \
2367       (CONFIGURE_MAXIMUM_POSIX_KEYS != 0) || \
2368       (CONFIGURE_MAXIMUM_POSIX_TIMERS != 0) || \
2369       (CONFIGURE_MAXIMUM_POSIX_QUEUED_SIGNALS != 0) || \
2370       (CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUES != 0) || \
2371       (CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUE_DESCRIPTORS != 0) || \
2372       (CONFIGURE_MAXIMUM_POSIX_SEMAPHORES != 0) || \
2373       (CONFIGURE_MAXIMUM_POSIX_BARRIERS != 0) || \
2374       (CONFIGURE_MAXIMUM_POSIX_SPINLOCKS != 0) || \
2375       (CONFIGURE_MAXIMUM_POSIX_RWLOCKS != 0) || \
2376      defined(CONFIGURE_POSIX_INIT_THREAD_TABLE))
2377  #error "CONFIGURATION ERROR: POSIX API support not configured!!"
2378  #endif
2379#endif
2380
2381#ifndef RTEMS_SCHEDSIM
2382/*
2383 *  You must either explicity include or exclude the clock driver.
2384 *  It is such a common newbie error to leave it out.  Maybe this
2385 *  will put an end to it.
2386 *
2387 *  NOTE: If you are using the timer driver, it is considered
2388 *        mutually exclusive with the clock driver because the
2389 *        drivers are assumed to use the same "timer" hardware
2390 *        on many boards.
2391 */
2392#if !defined(CONFIGURE_HAS_OWN_DEVICE_DRIVER_TABLE)
2393  #if !defined(CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER) && \
2394      !defined(CONFIGURE_APPLICATION_DOES_NOT_NEED_CLOCK_DRIVER) && \
2395      !defined(CONFIGURE_APPLICATION_NEEDS_TIMER_DRIVER)
2396    #error "CONFIGURATION ERROR: Do you want the clock driver or not?!?"
2397   #endif
2398#endif
2399#endif
2400
2401/*
2402 *  These names have been obsoleted so make the user application stop compiling
2403 */
2404#if defined(CONFIGURE_TEST_NEEDS_TIMER_DRIVER) || \
2405    defined(CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER) || \
2406    defined(CONFIGURE_TEST_NEEDS_CLOCK_DRIVER) || \
2407    defined(CONFIGURE_TEST_NEEDS_RTC_DRIVER) || \
2408    defined(CONFIGURE_TEST_NEEDS_STUB_DRIVER)
2409#error "CONFIGURATION ERROR: CONFIGURE_TEST_XXX constants are obsolete"
2410#endif
2411
2412/*
2413 *  Validate the configured maximum priority
2414 */
2415#if ((CONFIGURE_MAXIMUM_PRIORITY != 3) && \
2416     (CONFIGURE_MAXIMUM_PRIORITY != 7) && \
2417     (CONFIGURE_MAXIMUM_PRIORITY != 15) && \
2418     (CONFIGURE_MAXIMUM_PRIORITY != 31) && \
2419     (CONFIGURE_MAXIMUM_PRIORITY != 63) && \
2420     (CONFIGURE_MAXIMUM_PRIORITY != 127) && \
2421     (CONFIGURE_MAXIMUM_PRIORITY != 255))
2422  #error "Maximum priority is not 1 less than a power of 2 between 4 and 256"
2423#endif
2424
2425#if (CONFIGURE_MAXIMUM_PRIORITY > PRIORITY_DEFAULT_MAXIMUM)
2426  #error "Maximum priority configured higher than supported by target."
2427#endif
2428
2429/*
2430 *  If you have fewer POSIX Message Queue Descriptors than actual
2431 *  POSIX Message Queues, then you will not be able to open all the
2432 *  queues.
2433 */
2434#if (CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUE_DESCRIPTORS < \
2435     CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUES)
2436  #error "Fewer POSIX Message Queue descriptors than Queues!"
2437#endif
2438
2439#endif
2440/* end of include file */
Note: See TracBrowser for help on using the repository browser.