task creation

Joel Sherrill joel.sherrill at OARcorp.com
Tue Apr 3 12:11:57 UTC 2001


I am surprised no one else replied to this.  Each of the tasks
is created with 2 * minimum stack size and you did not configure
any extra task stack memory in the workspace.  After a while,
you just run out of memory.  This line is in the system.h

#define CONFIGURE_EXTRA_TASK_STACKS         (3 *
RTEMS_MINIMUM_STACK_SIZE)


and now you are looping to create WAY tasks.

--joel

"D.G.Somerton" wrote:
> 
> Hello,
> 
>   Does anybody know why this output is produced by the included program?
> 
> *** CLOCK TICK TEST ***
> Error creating task 20, status is 0000000d
> Error creating task 21, status is 0000000d
> Error creating task 22, status is 0000000d
> Error creating task 23, status is 0000000d
> TA01 - rtems_clock_get - 10:00:00   04/02/2001
> TA02 - rtems_clock_get - 10:00:00   04/02/2001
> TA03 - rtems_clock_get - 10:00:00   04/02/2001
> TA04 - rtems_clock_get - 10:00:00   04/02/2001
> TA05 - rtems_clock_get - 10:00:00   04/02/2001
> TA06 - rtems_clock_get - 10:00:00   04/02/2001
> TA07 - rtems_clock_get - 10:00:00   04/02/2001
> TA08 - rtems_clock_get - 10:00:00   04/02/2001
> TA09 - rtems_clock_get - 10:00:00   04/02/2001
> TA10 - rtems_clock_get - 10:00:00   04/02/2001
> TA11 - rtems_clock_get - 10:00:00   04/02/2001
> TA12 - rtems_clock_get - 10:00:00   04/02/2001
> TA13 - rtems_clock_get - 10:00:00   04/02/2001
> TA14 - rtems_clock_get - 10:00:00   04/02/2001
> TA15 - rtems_clock_get - 10:00:00   04/02/2001
> TA16 - rtems_clock_get - 10:00:01   04/02/2001
> TA17 - rtems_clock_get - 10:00:01   04/02/2001
> TA18 - rtems_clock_get - 10:00:01   04/02/2001
> TA19 - rtems_clock_get - 10:00:01   04/02/2001
> 
> Program:
>   System.h
> 
> /*  system.h
>  *
>  *  This include file contains information that is included in every
>  *  function in the test set.
>  *
>  *  COPYRIGHT (c) 1989-1999.
>  *  On-Line Applications Research Corporation (OAR).
>  *
>  *  The license and distribution terms for this file may be
>  *  found in the file LICENSE in this distribution or at
>  *  http://www.OARcorp.com/rtems/license.html.
>  *
>  *  $Id: system.h,v 1.12.2.4 2000/05/24 17:06:40 joel Exp $
>  */
> 
> #include <rtems.h>
> 
> /* functions */
> 
> rtems_task
> Init (rtems_task_argument argument);
> 
> rtems_task
> Test_task (rtems_task_argument argument);
> 
> /* global variables */
> 
> /*
>  *  Keep the names and IDs in global variables so another task can use them.
>  */
> 
> extern rtems_id   Task_id  [32];         /* array of task ids */
> extern rtems_name Task_name[32];       /* array of task names */
> 
> /* configuration information */
> 
> #include <bsp.h> /* for device driver prototypes */
> 
> #define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
> #define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
> 
> #define CONFIGURE_MAXIMUM_TASKS             32
> 
> #define CONFIGURE_RTEMS_INIT_TASKS_TABLE
> 
> #define CONFIGURE_EXTRA_TASK_STACKS         (3 * RTEMS_MINIMUM_STACK_SIZE)
> 
> #include <confdefs.h>
> 
> /*
>  *  Handy macros and static inline functions
>  */
> 
> /*
>  *  Macro to hide the ugliness of printing the time.
>  */
> 
> #define print_time(_s1, _tb, _s2) \
>   do { \
>     printf( "%s%02d:%02d:%02d   %02d/%02d/%04d%s", \
>        _s1, (_tb)->hour, (_tb)->minute, (_tb)->second, \
>        (_tb)->month, (_tb)->day, (_tb)->year, _s2 ); \
>     fflush(stdout); \
>   } while ( 0 )
> 
> /*
>  *  Macro to print an task name that is composed of ASCII characters.
>  *
>  */
> 
> #define put_name( _name, _crlf ) \
>   do { \
>     rtems_unsigned32 c0, c1, c2, c3; \
>     \
>     c0 = ((_name) >> 24) & 0xff; \
>     c1 = ((_name) >> 16) & 0xff; \
>     c2 = ((_name) >> 8) & 0xff; \
>     c3 = (_name) & 0xff; \
>     putchar( (char)c0 ); \
>     if ( c1 ) putchar( (char)c1 ); \
>     if ( c2 ) putchar( (char)c2 ); \
>     if ( c3 ) putchar( (char)c3 ); \
>     if ( (_crlf) ) \
>       putchar( '\n' ); \
>   } while (0)
> 
> /*
>  *  static inline routine to make obtaining ticks per second easier.
>  */
> 
> static __inline rtems_unsigned32
> get_ticks_per_second (void)
> {
>   rtems_interval ticks_per_second;
>   rtems_clock_get (RTEMS_CLOCK_GET_TICKS_PER_SECOND, &ticks_per_second);
>   return ticks_per_second;
> }
> 
> /*
>  *  This allows us to view the "Test_task" instantiations as a set
>  *  of numbered tasks by eliminating the number of application
>  *  tasks created.
>  *
>  *  In reality, this is too complex for the purposes of this
>  *  example.  It would have been easier to pass a task argument. :)
>  *  But it shows how rtems_id's can sometimes be used.
>  */
> 
> #define task_number(tid)\
>  (rtems_get_index(tid)-rtems_configuration_get_rtems_api_configuration ()->number_of_initialization_tasks)
> 
> /* end of include file */
> 
> Init.c
> /*  Init
>  *
>  *  This routine is the initialization task for this test program.
>  *  It is called from init_exec and has the responsibility for creating
>  *  and starting the tasks that make up the test.  If the time of day
>  *  clock is required for the test, it should also be set to a known
>  *  value by this function.
>  *
>  *  Input parameters:  NONE
>  *
>  *  Output parameters:  NONE
>  *
>  *  COPYRIGHT (c) 1989-1999.
>  *  On-Line Applications Research Corporation (OAR).
>  *
>  *  The license and distribution terms for this file may be
>  *  found in the file LICENSE in this distribution or at
>  *  http://www.OARcorp.com/rtems/license.html.
>  *
>  *  $Id: init.c,v 1.10.2.1 2000/05/05 12:58:06 joel Exp $
>  */
> 
> #define CONFIGURE_INIT
> #include "system.h"
> #include <stdio.h>
> 
> /*
>  *  Keep the names and IDs in global variables so another task can use them.
>  */
> 
> rtems_id   Task_id  [32];       /* array of task ids */
> rtems_name Task_name[32];       /* array of task names */
> 
> rtems_task
> Init (rtems_task_argument argument)
> {
>   int  i;
>   char name[5];
>   char buf [80];
> 
>   rtems_status_code status;
>   rtems_time_of_day time;
> 
>   puts ("\n\n*** CLOCK TICK TEST ***");
> 
>   time.year   = 2001;
>   time.month  = 4;
>   time.day    = 2;
>   time.hour   = 10;
>   time.minute = 0;
>   time.second = 0;
>   time.ticks  = 0;
> 
>   status = rtems_clock_set (&time);
> 
> #if 1
>   for (i = 1; i < 24; i++)
>   {
>    sprintf (name, "TA%02d", i);
>     Task_name[i] = rtems_build_name (name[0], name[1], name[2], name[3]);
>     status = rtems_task_create (Task_name[i], 1, RTEMS_MINIMUM_STACK_SIZE * 2, RTEMS_DEFAULT_MODES, RTEMS_DEFAULT_ATTRIBUTES, &Task_id[i]);
>     if (status != RTEMS_SUCCESSFUL)
>     {
>       sprintf (buf, "Error creating task %d, status is %08x", i, status);
>       puts (buf);
>     }
>     else
>     {
>       status = rtems_task_start (Task_id[i], Test_task, i);
>       if (status != RTEMS_SUCCESSFUL)
>       {
>         sprintf (buf, "Error starting task %d, status is %08x", i, status);
>         puts (buf);
>       }
>     }
>   }
> #endif
> 
> #if 0
>   Task_name[1] = rtems_build_name ('T', 'A', '1', ' ');
>   Task_name[2] = rtems_build_name ('T', 'A', '2', ' ');
>   Task_name[3] = rtems_build_name ('T', 'A', '3', ' ');
> 
>   status = rtems_task_create (Task_name[1], 1, RTEMS_MINIMUM_STACK_SIZE * 2, RTEMS_DEFAULT_MODES, RTEMS_DEFAULT_ATTRIBUTES, &Task_id[1]);
>   status = rtems_task_create (Task_name[2], 1, RTEMS_MINIMUM_STACK_SIZE * 2, RTEMS_DEFAULT_MODES, RTEMS_DEFAULT_ATTRIBUTES, &Task_id[2]);
>   status = rtems_task_create (Task_name[3], 1, RTEMS_MINIMUM_STACK_SIZE * 2, RTEMS_DEFAULT_MODES, RTEMS_DEFAULT_ATTRIBUTES, &Task_id[3]);
> 
>   status = rtems_task_start (Task_id[1], Test_task, 1);
>   status = rtems_task_start (Task_id[2], Test_task, 2);
>   status = rtems_task_start (Task_id[3], Test_task, 3);
> #endif
> 
>   status = rtems_task_delete (RTEMS_SELF);
> }
> 
> Tasks.c
> 
> /*  Test_task
>  *
>  *  This routine serves as a test task.  It verifies the basic task
>  *  switching capabilities of the executive.
>  *
>  *  Input parameters:  NONE
>  *
>  *  Output parameters:  NONE
>  *
>  *  COPYRIGHT (c) 1989-1999.
>  *  On-Line Applications Research Corporation (OAR).
>  *
>  *  The license and distribution terms for this file may be
>  *  found in the file LICENSE in this distribution or at
>  *  http://www.OARcorp.com/rtems/license.html.
>  *
>  *  $Id: tasks.c,v 1.7.2.1 2000/05/05 12:58:06 joel Exp $
>  */
> 
> #include "system.h"
> #include <stdio.h>
> 
> rtems_task
> Test_task (rtems_task_argument unused)
> {
>   rtems_id          tid;
>   rtems_time_of_day time;
>   rtems_unsigned32  task_index;
>   rtems_status_code status;
> 
>   status = rtems_task_ident (RTEMS_SELF, RTEMS_SEARCH_ALL_NODES, &tid);
>   task_index = task_number (tid);
> 
>   for (;;)
>   {
>     status = rtems_clock_get (RTEMS_CLOCK_GET_TOD, &time);
>     put_name (Task_name[task_index], FALSE);
>     print_time (" - rtems_clock_get - ", &time, "\n");
>     status = rtems_task_wake_after (task_index * 5 * get_ticks_per_second());
>   }
> }
> 
> D.G.Somerton

-- 
Joel Sherrill, Ph.D.             Director of Research & Development
joel at OARcorp.com                 On-Line Applications Research
Ask me about RTEMS: a free RTOS  Huntsville AL 35805
   Support Available             (256) 722-9985



More information about the users mailing list