From 4a4f41ed642cd5d9f4056b12d86bbf80e8da983a Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Wed, 23 Sep 2020 16:47:58 +0200 Subject: rtems: Add rtems_message_queue_construct() In contrast to message queues created by rtems_message_queue_create(), the message queues constructed by this directive use a user-provided message buffer storage area. Add RTEMS_MESSAGE_QUEUE_BUFFER() to define a message buffer type for message buffer storage areas. Update #4007. --- testsuites/mptests/mp09/initimpl.h | 26 +++++++++++++++++++++++++- testsuites/mptests/mp09/system.h | 17 ++++++++++------- testsuites/mptests/mp09/task1.c | 16 ++++++++++++++++ 3 files changed, 51 insertions(+), 8 deletions(-) (limited to 'testsuites/mptests') diff --git a/testsuites/mptests/mp09/initimpl.h b/testsuites/mptests/mp09/initimpl.h index ff18c514a2..c7377f319a 100644 --- a/testsuites/mptests/mp09/initimpl.h +++ b/testsuites/mptests/mp09/initimpl.h @@ -26,6 +26,23 @@ #define CONFIGURE_INIT #include "system.h" +#if CONFIGURE_MP_NODE_NUMBER == 1 + +#define MESSAGE_SIZE 1 + +static RTEMS_MESSAGE_QUEUE_BUFFER( MESSAGE_SIZE ) buffers[ 1 ]; + +static const rtems_message_queue_config config = { + .name = rtems_build_name( 'M', 'S', 'G', '2' ), + .maximum_pending_messages = RTEMS_ARRAY_SIZE( buffers ), + .maximum_message_size = MESSAGE_SIZE, + .storage_area = buffers, + .storage_size = sizeof( buffers ), + .attributes = RTEMS_GLOBAL +}; + +#endif + rtems_task Init( rtems_task_argument argument ) @@ -40,10 +57,17 @@ rtems_task Init( Task_name[ 1 ] = rtems_build_name( '1', '1', '1', ' ' ); Task_name[ 2 ] = rtems_build_name( '2', '2', '2', ' ' ); - Queue_name[ 1 ] = rtems_build_name( 'M', 'S', 'G', ' ' ); + Queue_name[ 1 ] = rtems_build_name( 'M', 'S', 'G', '1' ); + Queue_name[ 2 ] = rtems_build_name( 'M', 'S', 'G', '2' ); if ( rtems_object_get_local_node() == 1 ) { puts( "Creating Message Queue (Global)" ); + +#if CONFIGURE_MP_NODE_NUMBER == 1 + status = rtems_message_queue_construct( &config, &Queue_id[ 2 ] ); + directive_failed( status, "rtems_message_queue_construct" ); +#endif + status = rtems_message_queue_create( Queue_name[ 1 ], 3, diff --git a/testsuites/mptests/mp09/system.h b/testsuites/mptests/mp09/system.h index 4fdddc4fc4..9ecea2d971 100644 --- a/testsuites/mptests/mp09/system.h +++ b/testsuites/mptests/mp09/system.h @@ -34,11 +34,14 @@ void Send_messages( void ); #define CONFIGURE_APPLICATION_NEEDS_SIMPLE_CONSOLE_DRIVER #define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER -#define CONFIGURE_MAXIMUM_TASKS 2 -#define CONFIGURE_MAXIMUM_TIMERS 1 -#define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 1 -#define CONFIGURE_MESSAGE_BUFFER_MEMORY \ - CONFIGURE_MESSAGE_BUFFERS_FOR_QUEUE( 3, 16 ) +#define CONFIGURE_MAXIMUM_TASKS 2 +#define CONFIGURE_MAXIMUM_TIMER 1 + +#if CONFIGURE_MP_NODE_NUMBER == 1 + #define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 2 + #define CONFIGURE_MESSAGE_BUFFER_MEMORY \ + CONFIGURE_MESSAGE_BUFFERS_FOR_QUEUE( 3, 16 ) +#endif #define CONFIGURE_RTEMS_INIT_TASKS_TABLE @@ -49,8 +52,8 @@ void Send_messages( void ); TEST_EXTERN rtems_id Task_id[ 4 ]; /* array of task ids */ TEST_EXTERN rtems_name Task_name[ 4 ]; /* array of task names */ -TEST_EXTERN rtems_id Queue_id[ 2 ]; /* array of message queue ids */ -TEST_EXTERN rtems_name Queue_name[ 2 ]; /* array of message queue names */ +TEST_EXTERN rtems_id Queue_id[ 3 ]; /* array of message queue ids */ +TEST_EXTERN rtems_name Queue_name[ 3 ]; /* array of message queue names */ extern char buffer1[16]; extern char buffer2[16]; diff --git a/testsuites/mptests/mp09/task1.c b/testsuites/mptests/mp09/task1.c index dc78552994..b929a6e01b 100644 --- a/testsuites/mptests/mp09/task1.c +++ b/testsuites/mptests/mp09/task1.c @@ -49,7 +49,20 @@ rtems_task Test_task( ); } while ( !rtems_is_status_successful( status ) ); + status = rtems_message_queue_ident( + Queue_name[ 2 ], + RTEMS_SEARCH_ALL_NODES, + &Queue_id[ 2 ] + ); + directive_failed( status, "rtems_message_queue_ident" ); + if ( rtems_object_get_local_node() == 2 ) { + status = rtems_message_queue_delete( Queue_id[ 2 ] ); + fatal_directive_status( + status, + RTEMS_ILLEGAL_ON_REMOTE_OBJECT, + "rtems_message_queue_delete" + ); status = rtems_message_queue_delete( Queue_id[ 1 ] ); fatal_directive_status( status, @@ -103,6 +116,9 @@ rtems_task Test_task( puts( "Deleting Message queue" ); status = rtems_message_queue_delete( Queue_id[ 1 ] ); directive_failed( status, "rtems_message_queue_delete" ); + + status = rtems_message_queue_delete( Queue_id[ 2 ] ); + directive_failed( status, "rtems_message_queue_delete" ); } puts( "*** END OF TEST 9 ***" ); -- cgit v1.2.3