mirror of
https://gitlab.rtems.org/rtems/rtos/rtems.git
synced 2026-08-24 20:29:05 +08:00
Notepads where a feature of RTEMS' tasks that simply functioned in the same way as POSIX keys or threaded local storage (TLS). They were introduced well before per task variables, which are also deprecated, and were barely used in favor of their POSIX alternatives. In addition to their scarce usage, Notepads took up unnecessary memory. For each task: - 16 32-bit integers were allocated. - A total of 64 bytes per task per thread. This is especially critical in low memory and safety-critical applications. They are also defined as uint32_t, and therefore are not guaranteed to hold a pointer. Lastly, they are not portable solutions for SMP and uniprocessor systems, like POSIX keys and TLS. updates #2493.
216 lines
6.5 KiB
C
216 lines
6.5 KiB
C
/*
|
|
* COPYRIGHT (c) 1989-2009.
|
|
* 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.rtems.org/license/LICENSE.
|
|
*/
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
#include "config.h"
|
|
#endif
|
|
|
|
#define CONFIGURE_INIT
|
|
#include "system.h"
|
|
|
|
const char rtems_test_name[] = "SP 7";
|
|
|
|
static void Task_harmless_extension_one(
|
|
rtems_tcb *unused_one
|
|
)
|
|
{
|
|
/* Do nothing */
|
|
}
|
|
|
|
static void Task_harmless_extension_two(
|
|
rtems_tcb *unused_one,
|
|
rtems_tcb *unused_two
|
|
)
|
|
{
|
|
/* Do nothing */
|
|
}
|
|
|
|
static bool Task_harmless_extension_true_two(
|
|
rtems_tcb *unused_one,
|
|
rtems_tcb *unused_two
|
|
)
|
|
{
|
|
return true;
|
|
}
|
|
|
|
static const rtems_extensions_table Harmless_extensions = {
|
|
Task_harmless_extension_true_two,
|
|
Task_harmless_extension_two,
|
|
Task_harmless_extension_two,
|
|
Task_harmless_extension_two,
|
|
Task_harmless_extension_two,
|
|
Task_harmless_extension_one,
|
|
Task_harmless_extension_one,
|
|
NULL
|
|
};
|
|
|
|
rtems_extensions_table Extensions = {
|
|
Task_create_extension, /* task create user extension */
|
|
Task_start_extension, /* task start user extension */
|
|
Task_restart_extension, /* task restart user extension */
|
|
Task_delete_extension, /* task delete user extension */
|
|
NULL, /* task switch user extension */
|
|
NULL, /* begin user extension */
|
|
Task_exit_extension, /* task exitted user extension */
|
|
NULL /* fatal error extension */
|
|
};
|
|
|
|
rtems_task Init(
|
|
rtems_task_argument argument
|
|
)
|
|
{
|
|
rtems_status_code status;
|
|
rtems_id id;
|
|
|
|
TEST_BEGIN();
|
|
|
|
Extension_name[ 1 ] = rtems_build_name( 'E', 'X', 'T', '1' );
|
|
Extension_name[ 2 ] = rtems_build_name( 'E', 'X', 'T', '2' );
|
|
|
|
puts ( "rtems_extension_create - bad id pointer -- RTEMS_INVALID_ADDRESS" );
|
|
status = rtems_extension_create( 0xa5a5a5a5, &Extensions, NULL );
|
|
fatal_directive_status(
|
|
status, RTEMS_INVALID_ADDRESS, "rtems_extension_create" );
|
|
|
|
puts ( "rtems_extension_create - bad name -- RTEMS_INVALID_NAME" );
|
|
status = rtems_extension_create( 0, &Extensions, &id );
|
|
fatal_directive_status(
|
|
status, RTEMS_INVALID_NAME, "rtems_extension_create #1" );
|
|
|
|
puts( "rtems_extension_create - first one -- OK" );
|
|
status = rtems_extension_create(
|
|
Extension_name[ 1 ],
|
|
&Extensions,
|
|
&Extension_id[ 1 ]
|
|
);
|
|
directive_failed( status, "rtems_extension_create" );
|
|
|
|
puts( "rtems_extension_create - second one-- OK" );
|
|
status = rtems_extension_create(
|
|
Extension_name[ 2 ],
|
|
&Extensions,
|
|
&Extension_id[ 2 ]
|
|
);
|
|
directive_failed( status, "rtems_extension_create #2" );
|
|
|
|
puts ( "rtems_extension_create -- RTEMS_TOO_MANY" );
|
|
status = rtems_extension_create( 0xa5a5a5a5, &Extensions, &id );
|
|
fatal_directive_status( status, RTEMS_TOO_MANY, "rtems_extension_create" );
|
|
|
|
puts( "rtems_extension_delete - second one -- OK" );
|
|
status = rtems_extension_delete( Extension_id[ 2 ] );
|
|
directive_failed( status, "rtems_extension_delete #2" );
|
|
|
|
puts( "rtems_extension_delete - second one again -- RTEMS_INVALID_ID" );
|
|
status = rtems_extension_delete( Extension_id[ 2 ] );
|
|
fatal_directive_status(
|
|
status,
|
|
RTEMS_INVALID_ID,
|
|
"rtems_extension_delete #2 bad"
|
|
);
|
|
|
|
puts ( "rtems_extension_ident -- OK" );
|
|
status = rtems_extension_ident( Extension_name[1], &id );
|
|
directive_failed( status, "rtems_extension_ident" );
|
|
|
|
puts ( "rtems_extension_ident - bad name -- RTEMS_INVALID_NAME" );
|
|
status = rtems_extension_ident( Extension_name[2], &id );
|
|
fatal_directive_status( status, RTEMS_INVALID_NAME, "rtems_extension_ident" );
|
|
|
|
puts ( "rtems_extension_ident - bad name -- RTEMS_INVALID_ADDRESS" );
|
|
status = rtems_extension_ident( Extension_name[2], NULL );
|
|
fatal_directive_status(
|
|
status,
|
|
RTEMS_INVALID_ADDRESS,
|
|
"rtems_extension_ident"
|
|
);
|
|
|
|
puts( "rtems_extension_create - harmless -- OK" );
|
|
status = rtems_extension_create(
|
|
Extension_name[ 2 ],
|
|
&Harmless_extensions,
|
|
&Extension_id[ 2 ]
|
|
);
|
|
directive_failed( status, "rtems_extension_create #3" );
|
|
|
|
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', ' ' );
|
|
Task_name[ 4 ] = rtems_build_name( 'T', 'A', '4', ' ' );
|
|
|
|
status = rtems_task_create(
|
|
Task_name[ 1 ],
|
|
4,
|
|
RTEMS_MINIMUM_STACK_SIZE * 2,
|
|
RTEMS_DEFAULT_MODES,
|
|
RTEMS_DEFAULT_ATTRIBUTES,
|
|
&Task_id[ 1 ]
|
|
);
|
|
directive_failed( status, "rtems_task_create of TA1" );
|
|
assert_extension_counts( &Task_created[ 0 ], 0x2 );
|
|
|
|
status = rtems_task_create(
|
|
Task_name[ 2 ],
|
|
4,
|
|
RTEMS_MINIMUM_STACK_SIZE * 2,
|
|
RTEMS_DEFAULT_MODES,
|
|
RTEMS_DEFAULT_ATTRIBUTES,
|
|
&Task_id[ 2 ]
|
|
);
|
|
directive_failed( status, "rtems_task_create of TA2" );
|
|
assert_extension_counts( &Task_created[ 0 ], 0x2 | 0x4 );
|
|
|
|
#define TA3_PRIORITY (RTEMS_MAXIMUM_PRIORITY - 4u)
|
|
status = rtems_task_create(
|
|
Task_name[ 3 ],
|
|
TA3_PRIORITY,
|
|
RTEMS_MINIMUM_STACK_SIZE * 2,
|
|
RTEMS_DEFAULT_MODES,
|
|
RTEMS_DEFAULT_ATTRIBUTES,
|
|
&Task_id[ 3 ]
|
|
);
|
|
directive_failed( status, "rtems_task_create of TA3" );
|
|
assert_extension_counts( &Task_created[ 0 ], 0x2 | 0x4 | 0x8 );
|
|
|
|
#define TA4_PRIORITY (RTEMS_MAXIMUM_PRIORITY - 1u)
|
|
status = rtems_task_create(
|
|
Task_name[ 4 ],
|
|
TA4_PRIORITY,
|
|
RTEMS_MINIMUM_STACK_SIZE * 2,
|
|
RTEMS_DEFAULT_MODES,
|
|
RTEMS_DEFAULT_ATTRIBUTES,
|
|
&Task_id[ 4 ]
|
|
);
|
|
directive_failed( status, "rtems_task_create of TA4" );
|
|
assert_extension_counts( &Task_created[ 0 ], 0x2 | 0x4 | 0x8 | 0x10 );
|
|
|
|
status = rtems_task_start( Task_id[ 1 ], Task_1, 0 );
|
|
directive_failed( status, "rtems_task_start of TA1" );
|
|
assert_extension_counts( &Task_started[ 0 ], 0x2 );
|
|
|
|
status = rtems_task_start( Task_id[ 2 ], Task_2, 0 );
|
|
directive_failed( status, "rtems_task_start of TA2" );
|
|
assert_extension_counts( &Task_started[ 0 ], 0x2 | 0x4 );
|
|
|
|
status = rtems_task_start( Task_id[ 3 ], Task_3, 0 );
|
|
directive_failed( status, "rtems_task_start of TA3" );
|
|
assert_extension_counts( &Task_started[ 0 ], 0x2 | 0x4 | 0x8 );
|
|
|
|
status = rtems_task_start( Task_id[ 4 ], Task_4, 0 );
|
|
directive_failed( status, "rtems_task_start of TA4" );
|
|
assert_extension_counts( &Task_started[ 0 ], 0x2 | 0x4 | 0x8 | 0x10 );
|
|
|
|
status = rtems_task_restart( Task_id[ 2 ], 0 );
|
|
directive_failed( status, "rtems_task_restart of TA3" );
|
|
assert_extension_counts( &Task_restarted[ 0 ], 0x0 );
|
|
|
|
status = rtems_task_delete( RTEMS_SELF );
|
|
directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
|
|
}
|