From 6942e5f99171d1cb38c2c573aba8cb9212d7efd8 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Thu, 9 Apr 2020 12:12:13 +0200 Subject: rtems: Add rtems_task_construct() In contrast to rtems_task_create() this function constructs a task with a user-provided task storage area. The new directive uses a configuration structure instead of individual parameters. Add RTEMS_TASK_STORAGE_SIZE() to calculate the recommended size of a task storage area based on the task attributes and the size dedicated to the task stack and thread-local storage. This macro may allow future extensions without breaking the API. Add application configuration option CONFIGURE_MINIMUM_TASKS_WITH_USER_PROVIDED_STORAGE to adjust RTEMS Workspace size estimate. Update #3959. --- testsuites/sptests/sp01/init.c | 24 +++++++++++++++--------- testsuites/sptests/sp01/sp01.doc | 1 + testsuites/sptests/sp01/system.h | 3 ++- 3 files changed, 18 insertions(+), 10 deletions(-) (limited to 'testsuites/sptests') diff --git a/testsuites/sptests/sp01/init.c b/testsuites/sptests/sp01/init.c index 2719c84fc8..e0072a615c 100644 --- a/testsuites/sptests/sp01/init.c +++ b/testsuites/sptests/sp01/init.c @@ -16,6 +16,19 @@ const char rtems_test_name[] = "SP 1"; +RTEMS_ALIGNED( RTEMS_TASK_STORAGE_ALIGNMENT ) static char Task_1_storage[ + RTEMS_TASK_STORAGE_SIZE( 2 * RTEMS_MINIMUM_STACK_SIZE, RTEMS_FLOATING_POINT ) +]; + +static const rtems_task_config Task_1_config = { + .name = rtems_build_name( 'T', 'A', '1', ' ' ), + .initial_priority = 1, + .storage_area = Task_1_storage, + .storage_size = sizeof( Task_1_storage ), + .initial_modes = RTEMS_DEFAULT_MODES, + .attributes = RTEMS_FLOATING_POINT +}; + rtems_task Init( rtems_task_argument argument ) @@ -30,15 +43,8 @@ rtems_task Init( status = rtems_clock_set( &time ); directive_failed( status, "rtems_clock_set" ); - status = rtems_task_create( - rtems_build_name( 'T', 'A', '1', ' ' ), - 1, - RTEMS_MINIMUM_STACK_SIZE * 2, - RTEMS_DEFAULT_MODES, - RTEMS_DEFAULT_ATTRIBUTES, - &id - ); - directive_failed( status, "rtems_task_create of TA1" ); + status = rtems_task_construct( &Task_1_config, &id ); + directive_failed( status, "rtems_task_construct of TA1" ); status = rtems_task_start( id, Task_1_through_3, 1 ); directive_failed( status, "rtems_task_start of TA1" ); diff --git a/testsuites/sptests/sp01/sp01.doc b/testsuites/sptests/sp01/sp01.doc index d7d9f5d902..43c8ee0116 100644 --- a/testsuites/sptests/sp01/sp01.doc +++ b/testsuites/sptests/sp01/sp01.doc @@ -9,6 +9,7 @@ test name: sp01 directives: + rtems_task_construct rtems_task_create rtems_task_start rtems_task_wake_after diff --git a/testsuites/sptests/sp01/system.h b/testsuites/sptests/sp01/system.h index bde5328aa9..d7990aeca8 100644 --- a/testsuites/sptests/sp01/system.h +++ b/testsuites/sptests/sp01/system.h @@ -28,8 +28,9 @@ rtems_task Task_1_through_3( #define CONFIGURE_RTEMS_INIT_TASKS_TABLE -#define CONFIGURE_EXTRA_TASK_STACKS (4 * RTEMS_MINIMUM_STACK_SIZE) +#define CONFIGURE_EXTRA_TASK_STACKS (3 * RTEMS_MINIMUM_STACK_SIZE) #define CONFIGURE_MAXIMUM_TASKS 4 +#define CONFIGURE_MINIMUM_TASKS_WITH_USER_PROVIDED_STORAGE 1 #include -- cgit v1.2.3