2008-06-17 Joel Sherrill <joel.sherrill@oarcorp.com>

* sapi/include/confdefs.h: When you disabled newlib reentrancy, it
	still reserved memory for the reentrancy structure. This is about 1K
	per task. On psim, we now reserve only 1936 bytes and only 240 remain
	after all allocations. Further analysis will be required to narrow
	that down. In addition, the new constant CONFIGURE_CONFDEFS_DEBUG can
	be defined and the structure named Configuration_Memory_Debug will be
	instantiated. This structure contains many of the component values
	that go into the memory reservation computation. This is helpful when
	tracking down problems.
This commit is contained in:
Joel Sherrill
2008-06-17 20:51:23 +00:00
parent f2a776acb5
commit 4175abd19e
2 changed files with 222 additions and 103 deletions

View File

@@ -1,3 +1,15 @@
2008-06-17 Joel Sherrill <joel.sherrill@oarcorp.com>
* sapi/include/confdefs.h: When you disabled newlib reentrancy, it
still reserved memory for the reentrancy structure. This is about 1K
per task. On psim, we now reserve only 1936 bytes and only 240 remain
after all allocations. Further analysis will be required to narrow
that down. In addition, the new constant CONFIGURE_CONFDEFS_DEBUG can
be defined and the structure named Configuration_Memory_Debug will be
instantiated. This structure contains many of the component values
that go into the memory reservation computation. This is helpful when
tracking down problems.
2008-06-17 Joel Sherrill <joel.sherrill@oarcorp.com>
* sapi/include/confdefs.h: The math in the _Configure_Object_RAM macro

View File

@@ -897,7 +897,7 @@ extern rtems_configuration_table Configuration;
#endif
#define CONFIGURE_MEMORY_PER_TASK_FOR_POSIX_API \
( \
_Configure_From_workspace( \
sizeof (POSIX_API_Control) + \
(sizeof (void *) * (CONFIGURE_MAXIMUM_POSIX_KEYS)) \
)
@@ -1030,8 +1030,7 @@ extern rtems_configuration_table Configuration;
#endif
#define CONFIGURE_MEMORY_FOR_POSIX \
( \
CONFIGURE_MEMORY_FOR_POSIX_MUTEXES( CONFIGURE_MAXIMUM_POSIX_MUTEXES ) + \
( CONFIGURE_MEMORY_FOR_POSIX_MUTEXES( CONFIGURE_MAXIMUM_POSIX_MUTEXES ) + \
CONFIGURE_MEMORY_FOR_POSIX_CONDITION_VARIABLES( \
CONFIGURE_MAXIMUM_POSIX_CONDITION_VARIABLES ) + \
CONFIGURE_MEMORY_FOR_POSIX_KEYS( CONFIGURE_MAXIMUM_POSIX_KEYS ) + \
@@ -1240,8 +1239,7 @@ extern rtems_configuration_table Configuration;
#endif
#define CONFIGURE_MEMORY_FOR_ITRON \
( \
CONFIGURE_MEMORY_FOR_ITRON_SEMAPHORES( \
( CONFIGURE_MEMORY_FOR_ITRON_SEMAPHORES( \
CONFIGURE_MAXIMUM_ITRON_SEMAPHORES ) + \
CONFIGURE_MEMORY_FOR_ITRON_EVENTFLAGS( \
CONFIGURE_MAXIMUM_ITRON_EVENTFLAGS ) + \
@@ -1273,12 +1271,18 @@ extern rtems_configuration_table Configuration;
#endif /* RTEMS_ITRON_API */
#if defined(RTEMS_NEWLIB)
/**
* This macro specifies the amount of memory to be reserved for the
* Newlib C Library reentrancy structure -- if we are using newlib.
*/
#if (defined(RTEMS_NEWLIB) && !defined(CONFIGURE_DISABLE_NEWLIB_REENTRANCY))
#include <reent.h>
#define CONFIGURE_MEMORY_PER_TASK_FOR_LIBC_REENTRANCY sizeof(struct _reent)
#define CONFIGURE_MEMORY_PER_TASK_FOR_NEWLIB \
_Configure_From_workspace(sizeof(struct _reent))
#else
#define CONFIGURE_MEMORY_PER_TASK_FOR_LIBC_REENTRANCY 0
#define CONFIGURE_MEMORY_PER_TASK_FOR_NEWLIB 0
#endif
/*
@@ -1300,9 +1304,9 @@ extern rtems_configuration_table Configuration;
((_tasks) * \
(_Configure_From_workspace(CONFIGURE_MINIMUM_TASK_STACK_SIZE) + \
_Configure_From_workspace(CONFIGURE_MEMORY_PER_TASK_FOR_CLASSIC_API) + \
_Configure_From_workspace(CONFIGURE_MEMORY_PER_TASK_FOR_LIBC_REENTRANCY) + \
_Configure_From_workspace(CONFIGURE_MEMORY_PER_TASK_FOR_POSIX_API) + \
_Configure_From_workspace(CONFIGURE_MEMORY_PER_TASK_FOR_ITRON_API))) + \
CONFIGURE_MEMORY_PER_TASK_FOR_NEWLIB + \
CONFIGURE_MEMORY_PER_TASK_FOR_POSIX_API + \
CONFIGURE_MEMORY_PER_TASK_FOR_ITRON_API)) + \
_Configure_From_workspace((_number_FP_tasks) * CONTEXT_FP_SIZE) \
)
@@ -1394,15 +1398,27 @@ extern rtems_configuration_table Configuration;
#define CONFIGURE_API_MUTEX_MEMORY \
_Configure_Object_RAM(1, sizeof(API_Mutex_Control))
/**
* This defines the memory used by the thread ready chains. There is
* one chain per priority.
*/
#define CONFIGURE_MEMORY_FOR_THREAD_READY_CHAINS \
_Configure_From_workspace( \
((CONFIGURE_MAXIMUM_PRIORITY+1) * sizeof(Chain_Control)) )
/**
* This defines the amount of memory reserved for the IDLE task
* control structures and stack.
*/
#define CONFIGURE_MEMORY_FOR_IDLE_TASK \
(CONFIGURE_MEMORY_FOR_TASKS(1, 0) + \
(CONFIGURE_IDLE_TASK_STACK_SIZE - CONFIGURE_MINIMUM_TASK_STACK_SIZE))
/**
* This macro accounts for general RTEMS system overhead.
*/
#define CONFIGURE_MEMORY_FOR_SYSTEM_OVERHEAD \
( \
CONFIGURE_MEMORY_FOR_TASKS(1, 0) + /* IDLE and stack */ \
(CONFIGURE_IDLE_TASK_STACK_SIZE - CONFIGURE_MINIMUM_TASK_STACK_SIZE) + \
_Configure_From_workspace( /* Ready chains */ \
((CONFIGURE_MAXIMUM_PRIORITY+1) * sizeof(Chain_Control)) ) + \
( CONFIGURE_MEMORY_FOR_IDLE_TASK + /* IDLE and stack */ \
CONFIGURE_MEMORY_FOR_THREAD_READY_CHAINS + /* Ready chains */ \
CONFIGURE_INTERRUPT_VECTOR_TABLE + /* interrupt vectors */ \
CONFIGURE_INTERRUPT_STACK_MEMORY + /* interrupt stack */ \
CONFIGURE_API_MUTEX_MEMORY /* allocation mutex */ \
@@ -1495,7 +1511,7 @@ extern rtems_configuration_table Configuration;
CONFIGURE_MEMORY_FOR_USER_EXTENSIONS(CONFIGURE_MAXIMUM_USER_EXTENSIONS) \
)
#if 1 && defined(CONFIGURE_INIT)
#if defined(CONFIGURE_CONFDEFS_DEBUG) && defined(CONFIGURE_INIT)
/**
* This is a debug mechanism, so if you need to, the executable will
* have a structure with various partial values. Add to this as you
@@ -1504,23 +1520,114 @@ extern rtems_configuration_table Configuration;
* down errors and analyzing where over and under allocations are.
*/
typedef struct {
uint32_t Classic;
uint32_t ITRON;
uint32_t SYSTEM_OVERHEAD;
uint32_t STATIC_EXTENSIONS;
uint32_t INITIALIZATION_THREADS_STACKS;
uint32_t CLASSIC;
uint32_t POSIX;
uint32_t TASKS;
uint32_t INIT_TASK_STACKS;
uint32_t CLASSIC_SEMAPHORES;
uint32_t ITRON;
/* System overhead pieces */
uint32_t INTERRUPT_VECTOR_TABLE;
uint32_t INTERRUPT_STACK_MEMORY;
uint32_t THREAD_READY_CHAINS;
uint32_t MEMORY_FOR_IDLE_TASK;
/* Classic API Pieces */
uint32_t TASK_VARIABLES;
uint32_t TIMERS;
uint32_t SEMAPHORES;
uint32_t MESSAGE_QUEUES;
uint32_t PARTITIONS;
uint32_t REGIONS;
uint32_t PORTS;
uint32_t PERIODS;
uint32_t BARRIERS;
uint32_t USER_EXTENSIONS;
#ifdef RTEMS_POSIX_API
/* POSIX API Pieces */
uint32_t POSIX_MUTEXES;
uint32_t POSIX_CONDITION_VARIABLES;
uint32_t POSIX_KEYS;
uint32_t POSIX_TIMERS;
uint32_t POSIX_QUEUED_SIGNALS;
uint32_t POSIX_MESSAGE_QUEUES;
uint32_t POSIX_SEMAPHORES;
uint32_t POSIX_BARRIERS;
uint32_t POSIX_SPINLOCKS;
uint32_t POSIX_RWLOCKS;
#endif
#ifdef RTEMS_ITRON_API
/* ITRON API Pieces */
uint32_t ITRON_SEMAPHORES;
uint32_t ITRON_EVENTFLAGS;
uint32_t ITRON_MAILBOXES;
uint32_t ITRON_MESSAGE_BUFFERS;
uint32_t ITRON_PORTS;
uint32_t ITRON_MEMORY_POOLS;
uint32_t ITRON_FIXED_MEMORY_POOLS;
#endif
} Configuration_Debug_t;
Configuration_Debug_t Configuration_Memory_Debug = {
CONFIGURE_MEMORY_FOR_CLASSIC, /* MEMORY_CLASSIC */
CONFIGURE_MEMORY_FOR_ITRON, /* MEMORY_ITRON */
CONFIGURE_MEMORY_FOR_POSIX, /* MEMORY_POSIX */
CONFIGURE_MEMORY_FOR_TASKS( /* MEMORY_TASKS */
CONFIGURE_TOTAL_TASKS_AND_THREADS, CONFIGURE_TOTAL_TASKS_AND_THREADS),
CONFIGURE_INITIALIZATION_THREADS_STACKS, /* INIT_TASK_STACKS */
CONFIGURE_MEMORY_FOR_SEMAPHORES(CONFIGURE_MAXIMUM_SEMAPHORES + \
CONFIGURE_LIBIO_SEMAPHORES + CONFIGURE_TERMIOS_SEMAPHORES)
/* General Information */
CONFIGURE_MEMORY_FOR_SYSTEM_OVERHEAD,
CONFIGURE_MEMORY_FOR_STATIC_EXTENSIONS,
CONFIGURE_INITIALIZATION_THREADS_STACKS,
CONFIGURE_MEMORY_FOR_CLASSIC,
CONFIGURE_MEMORY_FOR_POSIX,
CONFIGURE_MEMORY_FOR_ITRON,
/* System overhead pieces */
CONFIGURE_INTERRUPT_VECTOR_TABLE,
CONFIGURE_INTERRUPT_STACK_MEMORY,
CONFIGURE_MEMORY_FOR_THREAD_READY_CHAINS,
CONFIGURE_MEMORY_FOR_IDLE_TASK,
/* Classic API Pieces */
CONFIGURE_MEMORY_FOR_TASK_VARIABLES(CONFIGURE_MAXIMUM_TASK_VARIABLES),
CONFIGURE_MEMORY_FOR_TIMERS(CONFIGURE_MAXIMUM_TIMERS),
CONFIGURE_MEMORY_FOR_SEMAPHORES(CONFIGURE_MAXIMUM_SEMAPHORES +
CONFIGURE_LIBIO_SEMAPHORES + CONFIGURE_TERMIOS_SEMAPHORES),
CONFIGURE_MEMORY_FOR_MESSAGE_QUEUES(CONFIGURE_MAXIMUM_MESSAGE_QUEUES),
CONFIGURE_MEMORY_FOR_PARTITIONS(CONFIGURE_MAXIMUM_PARTITIONS),
CONFIGURE_MEMORY_FOR_REGIONS( CONFIGURE_MAXIMUM_REGIONS ),
CONFIGURE_MEMORY_FOR_PORTS(CONFIGURE_MAXIMUM_PORTS),
CONFIGURE_MEMORY_FOR_PERIODS(CONFIGURE_MAXIMUM_PERIODS),
CONFIGURE_MEMORY_FOR_BARRIERS(CONFIGURE_MAXIMUM_BARRIERS),
CONFIGURE_MEMORY_FOR_USER_EXTENSIONS(CONFIGURE_MAXIMUM_USER_EXTENSIONS),
#ifdef RTEMS_POSIX_API
/* POSIX API Pieces */
CONFIGURE_MEMORY_FOR_POSIX_MUTEXES( CONFIGURE_MAXIMUM_POSIX_MUTEXES ),
CONFIGURE_MEMORY_FOR_POSIX_CONDITION_VARIABLES(
CONFIGURE_MAXIMUM_POSIX_CONDITION_VARIABLES ),
CONFIGURE_MEMORY_FOR_POSIX_KEYS( CONFIGURE_MAXIMUM_POSIX_KEYS ),
CONFIGURE_MEMORY_FOR_POSIX_QUEUED_SIGNALS(
CONFIGURE_MAXIMUM_POSIX_QUEUED_SIGNALS ),
CONFIGURE_MEMORY_FOR_POSIX_MESSAGE_QUEUES(
CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUES ),
CONFIGURE_MEMORY_FOR_POSIX_SEMAPHORES( CONFIGURE_MAXIMUM_POSIX_SEMAPHORES ),
CONFIGURE_MEMORY_FOR_POSIX_BARRIERS( CONFIGURE_MAXIMUM_POSIX_BARRIERS ),
CONFIGURE_MEMORY_FOR_POSIX_SPINLOCKS( CONFIGURE_MAXIMUM_POSIX_SPINLOCKS ),
CONFIGURE_MEMORY_FOR_POSIX_RWLOCKS( CONFIGURE_MAXIMUM_POSIX_RWLOCKS ),
CONFIGURE_MEMORY_FOR_POSIX_TIMERS( CONFIGURE_MAXIMUM_POSIX_TIMERS ),
#endif
#ifdef RTEMS_ITRON_API
/* ITRON API Pieces */
CONFIGURE_MEMORY_FOR_ITRON_SEMAPHORES( CONFIGURE_MAXIMUM_ITRON_SEMAPHORES ),
CONFIGURE_MEMORY_FOR_ITRON_EVENTFLAGS( CONFIGURE_MAXIMUM_ITRON_EVENTFLAGS ),
CONFIGURE_MEMORY_FOR_ITRON_MAILBOXES( CONFIGURE_MAXIMUM_ITRON_MAILBOXES ),
CONFIGURE_MEMORY_FOR_ITRON_MESSAGE_BUFFERS(
CONFIGURE_MAXIMUM_ITRON_MESSAGE_BUFFERS ),
CONFIGURE_MEMORY_FOR_ITRON_PORTS( CONFIGURE_MAXIMUM_ITRON_PORTS ),
CONFIGURE_MEMORY_FOR_ITRON_MEMORY_POOLS(
CONFIGURE_MAXIMUM_ITRON_MEMORY_POOLS ),
CONFIGURE_MEMORY_FOR_ITRON_FIXED_MEMORY_POOLS(
CONFIGURE_MAXIMUM_ITRON_FIXED_MEMORY_POOLS ),
#endif
};
#endif