Does SuperCore use heap ?
Stan
zylog at club-internet.fr
Thu Jan 15 14:39:28 UTC 2004
----- Original Message -----
From: "Joel Sherrill" <joel.sherrill at OARcorp.com>
To: "Stan" <zylog at club-internet.fr>
Cc: "rtems-users" <rtems-users at rtems.com>
Sent: Tuesday, January 13, 2004 5:50 PM
Subject: Re: Does SuperCore use heap ?
> Stan wrote:
>
> > Hi,
> >
> > I thought SuperCore doesn't use heap, only libc does it ( when routine
like
> > open, read, write or malloc are called).
> Thus, Workspace is the memory used by RTEMS to allocate objects like
tasks
> > and semaphores etc...
> > But nevertheless, it seems to me that rtems_task_start allocates memory
from
> > heap.
>
> The workspace is another instance of a super core heap. There are two
> score heaps in a system -- the C program heap and the workspace.
>
If I don't need to use memory "malloc'ed " from C program,
can I declare the _HeapSize with minimal value ?
( because the memory is small )
> Yes if you did not reserve enough memory in the workspace.
>
I think to have reserved enough memory ( the define CONFIGURE_MAXIMUM_TASKS,
etc. are right ).
Here is my system.h file :
----------------------------------------------------------------------------
-----------------------------
#include <rtems.h>
#include <bsp.h>
/* functions */
rtems_task Init(
rtems_task_argument argument
);
/* configuration information */
#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
#define CONFIGURE_MICROSECONDS_PER_TICK 10000
#define CONFIGURE_MAXIMUM_TASKS 20
#define CONFIGURE_MAXIMUM_SEMAPHORES 0
#define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 0
#define CONFIGURE_MAXIMUM_TIMERS 0
#define CONFIGURE_MEMORY_OVERHEAD 0
#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
#define CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS 6
#define CONFIGURE_EXTRA_TASK_STACKS ( 0 )
#define CONFIGURE_INIT_TASK_STACKS_SIZE ( RTEMS_MINIMUM_STACK_SIZE )
#define CONFIGURE_INIT_TASK_PRIORITY 10
#define CONFIGURE_INIT_TASK_INITIAL_MODES (RTEMS_PREEMPT | \
RTEMS_NO_TIMESLICE | \
RTEMS_NO_ASR | \
RTEMS_INTERRUPT_LEVEL(0))
#define CONFIGURE_INIT_TASK_NAME rtems_build_name('M','O','N',' ')
#include <confdefs.h>
----------------------------------------------------------------------------
-----------------------------
Here is init.c file :
----------------------------------------------------------------------------
-----------------------------
/*
* Init
*/
#define CONFIGURE_INIT
#include "system.h"
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <termios.h>
#include <unistd.h>
#include <string.h>
#define VERSION "*** TEST V24 V1.07 ***"
#define MAXIMUM_TASKS (18)
rtems_task test(
rtems_task_argument argument
)
{
while(1){
rtems_task_wake_after( 100 );
}
rtems_task_delete( RTEMS_SELF );
}
rtems_task Init(
rtems_task_argument argument
)
{
rtems_name name[MAXIMUM_TASKS];
rtems_mode mode[MAXIMUM_TASKS];
rtems_id task_id[MAXIMUM_TASKS];
rtems_task_priority pri[MAXIMUM_TASKS];;
rtems_status_code status;
rtems_task_priority old_priority;
int count;
char str_name[30];
puts(VERSION);
CPU_usage_Dump();
for(count=0; count < MAXIMUM_TASKS; count++){
sprintf( str_name, "%03d", count);
printf("Build name (%s).\r\n", str_name);
name[count] = rtems_build_name('T', str_name[0], str_name[1],
str_name[2]);
}
for(count=0; count< MAXIMUM_TASKS; count++){
mode[count] = RTEMS_INTERRUPT_LEVEL(0) | RTEMS_NO_ASR;
mode[count] |= RTEMS_PREEMPT;
mode[count] |= RTEMS_TIMESLICE;
pri[count] = 20;
status = rtems_task_create(name[count], pri[count], 1024,
mode[count], RTEMS_DEFAULT_ATTRIBUTES, &task_id[count]);
if (status != RTEMS_SUCCESSFUL) {
printf("Error create task no %d\r\n", count);
}else printf("Creation task no %d\r\n", count);
}
/* ------------------- START TASK --------------------*/
for(count=0; count < MAXIMUM_TASKS; count++){
status = rtems_task_start(task_id[count], test, count);
if (status != RTEMS_SUCCESSFUL) {
printf("Error start task no %d\r\n", count);
}else printf("Start task no %d\r\n", count);
}
while(1){
rtems_task_wake_after( 200 );
CPU_usage_Dump();
}
status = rtems_task_delete( RTEMS_SELF );
}
----------------------------------------------------------------------------
-----------------------------
> > Why the memory isn't allocated from the workspace ?
>
> It was until it ran out. :)
>
The memory workspace is calculate by confdefs.h ?
Why is its size is not sufficient ?
> > Where is my error ? ;)
>
> I don't see the task create calls but it is possible that you aren't
> accounting for all the stack memory you are allocating. Are they
> minimum size or larger?
They have minimum size.
> If they are larger than minimum then you have to account for such.
In my case, CONFIGURE_EXTRA_TASK_STACK can be initialize with zero.
Tell me if I make a mistake ;)
I have other questions :
Why this problem cause rtems_fatal_error_occurred instead of returning
with code RTEMS_NO_MEMORY ?
Between rtems-4.0.6pre4 and rtems-ss-20030703, are they some differences
for memory management ?
Because, it seems to me that behaviour is not same.
Before, on my old bsp based upon efi68k, I worked with minimum heap ( with
HeapSize= 0x1000) because
no memory is "malloc'ed" by the C program.
With this size, four tasks were successfully launched but not with my new
bsp based upon mcf5206elite ...
An idea ?
Thanks again...
Stan.
More information about the users
mailing list