Comtrol eCos User Manual

Page 488

Advertising
background image

Chapter 32. µITRON API

(you must have at least one task at startup in order that the system can actually run; this is not so for other uITRON
object types)

Q: Can I have different stack sizes for µITRON tasks?

Simply set aside different amounts of memory for each task to use for its stack. Going back to a typical default
setting for the µITRON tasks, the definitions in

pkgconf/uitron.h

might look like this:

#define CYGDAT_UITRON_TASK_EXTERNS \

extern "C" void task1( unsigned int ); \

extern "C" void task2( unsigned int ); \

extern "C" void task3( unsigned int ); \

extern "C" void task4( unsigned int ); \

static char stack1[ CYGNUM_UITRON_STACK_SIZE ], \

stack2[ CYGNUM_UITRON_STACK_SIZE ], \

stack3[ CYGNUM_UITRON_STACK_SIZE ], \

stack4[ CYGNUM_UITRON_STACK_SIZE ];

#define CYGDAT_UITRON_TASK_INITIALIZERS \

CYG_UIT_TASK( "t1", 1, task1, &stack1, CYGNUM_UITRON_STACK_SIZE ), \

CYG_UIT_TASK( "t2", 2, task2, &stack2, CYGNUM_UITRON_STACK_SIZE ), \

CYG_UIT_TASK( "t3", 3, task3, &stack3, CYGNUM_UITRON_STACK_SIZE ), \

CYG_UIT_TASK( "t4", 4, task4, &stack4, CYGNUM_UITRON_STACK_SIZE )

Note that

CYGNUM_UITRON_STACK_SIZE

is used to control the size of the stack objects themselves, and to tell the

system what size stack is being provided.

Suppose instead stack sizes of 2000, 1000, 800 and 800 were required: this could be achieved by using the GUI
config tool to edit these options, or editting the

.ecc

file to get these results in

pkgconf/uitron.h

:

#define CYGDAT_UITRON_TASK_EXTERNS \

extern "C" void task1( unsigned int ); \

extern "C" void task2( unsigned int ); \

extern "C" void task3( unsigned int ); \

extern "C" void task4( unsigned int ); \

static char stack1[ 2000 ], \

stack2[ 1000 ], \

stack3[

800 ], \

stack4[

800 ];

#define CYGDAT_UITRON_TASK_INITIALIZERS \

CYG_UIT_TASK( "t1", 1, task1, &stack1, sizeof( stack1 ) ), \

CYG_UIT_TASK( "t2", 2, task2, &stack2, sizeof( stack2 ) ), \

CYG_UIT_TASK( "t3", 3, task3, &stack3, sizeof( stack3 ) ), \

CYG_UIT_TASK( "t4", 4, task4, &stack4, sizeof( stack4 ) )

Note that the sizeof() operator has been used to tell the system what size stacks are provided, rather than quoting a
number (which is difficult for maintenance) or the symbol

CYGNUM_UITRON_STACK_SIZE

(which is wrong).

We recommend using (if available in your release) the stacksize symbols provided in the architectural HAL for your
target, called

CYGNUM_HAL_STACK_SIZE_TYPICAL

and

CYGNUM_HAL_STACK_SIZE_MINIMUM

. So a better (more

portable) version of the above might be:

#define CYGDAT_UITRON_TASK_EXTERNS \

extern "C" void task1( unsigned int ); \

extern "C" void task2( unsigned int ); \

384

Advertising