File indexing completed on 2025-05-11 08:24:51
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051 #ifdef HAVE_CONFIG_H
0052 #include "config.h"
0053 #endif
0054
0055 #include <rtems.h>
0056
0057 #include "tx-support.h"
0058
0059 #include <rtems/test.h>
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069 typedef enum {
0070 RtemsMessageReqBroadcast_Pre_SendBuffer_Valid,
0071 RtemsMessageReqBroadcast_Pre_SendBuffer_Null,
0072 RtemsMessageReqBroadcast_Pre_SendBuffer_NA
0073 } RtemsMessageReqBroadcast_Pre_SendBuffer;
0074
0075 typedef enum {
0076 RtemsMessageReqBroadcast_Pre_Count_Valid,
0077 RtemsMessageReqBroadcast_Pre_Count_Null,
0078 RtemsMessageReqBroadcast_Pre_Count_NA
0079 } RtemsMessageReqBroadcast_Pre_Count;
0080
0081 typedef enum {
0082 RtemsMessageReqBroadcast_Pre_Id_Valid,
0083 RtemsMessageReqBroadcast_Pre_Id_Invalid,
0084 RtemsMessageReqBroadcast_Pre_Id_NA
0085 } RtemsMessageReqBroadcast_Pre_Id;
0086
0087 typedef enum {
0088 RtemsMessageReqBroadcast_Pre_MsgSize_Zero,
0089 RtemsMessageReqBroadcast_Pre_MsgSize_SomeSize,
0090 RtemsMessageReqBroadcast_Pre_MsgSize_MaxSize,
0091 RtemsMessageReqBroadcast_Pre_MsgSize_TooLarge,
0092 RtemsMessageReqBroadcast_Pre_MsgSize_NA
0093 } RtemsMessageReqBroadcast_Pre_MsgSize;
0094
0095 typedef enum {
0096 RtemsMessageReqBroadcast_Pre_MsgQueue_Empty,
0097 RtemsMessageReqBroadcast_Pre_MsgQueue_Several,
0098 RtemsMessageReqBroadcast_Pre_MsgQueue_NA
0099 } RtemsMessageReqBroadcast_Pre_MsgQueue;
0100
0101 typedef enum {
0102 RtemsMessageReqBroadcast_Pre_Receivers_Waiting,
0103 RtemsMessageReqBroadcast_Pre_Receivers_None,
0104 RtemsMessageReqBroadcast_Pre_Receivers_NA
0105 } RtemsMessageReqBroadcast_Pre_Receivers;
0106
0107 typedef enum {
0108 RtemsMessageReqBroadcast_Pre_Storage_Nop,
0109 RtemsMessageReqBroadcast_Pre_Storage_NA
0110 } RtemsMessageReqBroadcast_Pre_Storage;
0111
0112 typedef enum {
0113 RtemsMessageReqBroadcast_Post_Status_Ok,
0114 RtemsMessageReqBroadcast_Post_Status_InvId,
0115 RtemsMessageReqBroadcast_Post_Status_InvAddr,
0116 RtemsMessageReqBroadcast_Post_Status_InvSize,
0117 RtemsMessageReqBroadcast_Post_Status_NA
0118 } RtemsMessageReqBroadcast_Post_Status;
0119
0120 typedef enum {
0121 RtemsMessageReqBroadcast_Post_Count_Zero,
0122 RtemsMessageReqBroadcast_Post_Count_Set,
0123 RtemsMessageReqBroadcast_Post_Count_Nop,
0124 RtemsMessageReqBroadcast_Post_Count_NA
0125 } RtemsMessageReqBroadcast_Post_Count;
0126
0127 typedef enum {
0128 RtemsMessageReqBroadcast_Post_MsgQueue_Nop,
0129 RtemsMessageReqBroadcast_Post_MsgQueue_NA
0130 } RtemsMessageReqBroadcast_Post_MsgQueue;
0131
0132 typedef enum {
0133 RtemsMessageReqBroadcast_Post_Receivers_Unblocked,
0134 RtemsMessageReqBroadcast_Post_Receivers_Nop,
0135 RtemsMessageReqBroadcast_Post_Receivers_NA
0136 } RtemsMessageReqBroadcast_Post_Receivers;
0137
0138 typedef enum {
0139 RtemsMessageReqBroadcast_Post_RecSize_Message,
0140 RtemsMessageReqBroadcast_Post_RecSize_Nop,
0141 RtemsMessageReqBroadcast_Post_RecSize_NA
0142 } RtemsMessageReqBroadcast_Post_RecSize;
0143
0144 typedef enum {
0145 RtemsMessageReqBroadcast_Post_RecBuffer_Message,
0146 RtemsMessageReqBroadcast_Post_RecBuffer_Nop,
0147 RtemsMessageReqBroadcast_Post_RecBuffer_NA
0148 } RtemsMessageReqBroadcast_Post_RecBuffer;
0149
0150 typedef struct {
0151 uint32_t Skip : 1;
0152 uint32_t Pre_SendBuffer_NA : 1;
0153 uint32_t Pre_Count_NA : 1;
0154 uint32_t Pre_Id_NA : 1;
0155 uint32_t Pre_MsgSize_NA : 1;
0156 uint32_t Pre_MsgQueue_NA : 1;
0157 uint32_t Pre_Receivers_NA : 1;
0158 uint32_t Pre_Storage_NA : 1;
0159 uint32_t Post_Status : 3;
0160 uint32_t Post_Count : 2;
0161 uint32_t Post_MsgQueue : 1;
0162 uint32_t Post_Receivers : 2;
0163 uint32_t Post_RecSize : 2;
0164 uint32_t Post_RecBuffer : 2;
0165 } RtemsMessageReqBroadcast_Entry;
0166
0167 #define MAXIMUM_PENDING_MESSAGES 3
0168 #define MAXIMUM_MESSAGE_SIZE 5
0169 #define NUMBER_OF_WORKERS 3
0170
0171
0172
0173
0174 typedef struct {
0175
0176
0177
0178 rtems_id message_queue_id;
0179
0180
0181
0182
0183 RTEMS_MESSAGE_QUEUE_BUFFER( MAXIMUM_MESSAGE_SIZE )
0184 storage_area[ MAXIMUM_PENDING_MESSAGES ];
0185
0186
0187
0188
0189 uint8_t receive_buffer[ NUMBER_OF_WORKERS ][ MAXIMUM_MESSAGE_SIZE ];
0190
0191
0192
0193
0194 size_t receive_size[ NUMBER_OF_WORKERS ];
0195
0196
0197
0198
0199 rtems_status_code receive_status[ NUMBER_OF_WORKERS ];
0200
0201
0202
0203
0204 rtems_id id_param;
0205
0206
0207
0208
0209 const void *buffer_param;
0210
0211
0212
0213
0214 size_t size_param;
0215
0216
0217
0218
0219 uint32_t *count_param;
0220
0221
0222
0223
0224 rtems_status_code status;
0225
0226
0227
0228
0229
0230 uint32_t count;
0231
0232
0233
0234
0235 rtems_id worker_id[ NUMBER_OF_WORKERS ];
0236
0237
0238
0239
0240
0241 void (*check_msgq_unchanged)( void *ctx_in );
0242
0243 struct {
0244
0245
0246
0247 size_t pcs[ 7 ];
0248
0249
0250
0251
0252 bool in_action_loop;
0253
0254
0255
0256
0257 size_t index;
0258
0259
0260
0261
0262 RtemsMessageReqBroadcast_Entry entry;
0263
0264
0265
0266
0267
0268 bool skip;
0269 } Map;
0270 } RtemsMessageReqBroadcast_Context;
0271
0272 static RtemsMessageReqBroadcast_Context
0273 RtemsMessageReqBroadcast_Instance;
0274
0275 static const char * const RtemsMessageReqBroadcast_PreDesc_SendBuffer[] = {
0276 "Valid",
0277 "Null",
0278 "NA"
0279 };
0280
0281 static const char * const RtemsMessageReqBroadcast_PreDesc_Count[] = {
0282 "Valid",
0283 "Null",
0284 "NA"
0285 };
0286
0287 static const char * const RtemsMessageReqBroadcast_PreDesc_Id[] = {
0288 "Valid",
0289 "Invalid",
0290 "NA"
0291 };
0292
0293 static const char * const RtemsMessageReqBroadcast_PreDesc_MsgSize[] = {
0294 "Zero",
0295 "SomeSize",
0296 "MaxSize",
0297 "TooLarge",
0298 "NA"
0299 };
0300
0301 static const char * const RtemsMessageReqBroadcast_PreDesc_MsgQueue[] = {
0302 "Empty",
0303 "Several",
0304 "NA"
0305 };
0306
0307 static const char * const RtemsMessageReqBroadcast_PreDesc_Receivers[] = {
0308 "Waiting",
0309 "None",
0310 "NA"
0311 };
0312
0313 static const char * const RtemsMessageReqBroadcast_PreDesc_Storage[] = {
0314 "Nop",
0315 "NA"
0316 };
0317
0318 static const char * const * const RtemsMessageReqBroadcast_PreDesc[] = {
0319 RtemsMessageReqBroadcast_PreDesc_SendBuffer,
0320 RtemsMessageReqBroadcast_PreDesc_Count,
0321 RtemsMessageReqBroadcast_PreDesc_Id,
0322 RtemsMessageReqBroadcast_PreDesc_MsgSize,
0323 RtemsMessageReqBroadcast_PreDesc_MsgQueue,
0324 RtemsMessageReqBroadcast_PreDesc_Receivers,
0325 RtemsMessageReqBroadcast_PreDesc_Storage,
0326 NULL
0327 };
0328
0329 typedef RtemsMessageReqBroadcast_Context Context;
0330 static const rtems_interval TIMEOUT_TICKS = 1;
0331 static const rtems_event_set EVENT_RECEIVE = RTEMS_EVENT_17;
0332 static const uint8_t message[ MAXIMUM_MESSAGE_SIZE ] =
0333 { 13, 42, 99, 222, 101 };
0334 static const uint8_t queued_message[] = { 200, 201, 202 };
0335
0336 static void Receive( Context *ctx, size_t worker_index )
0337 {
0338 ctx->receive_status[worker_index] = rtems_message_queue_receive(
0339 ctx->message_queue_id,
0340 ctx->receive_buffer[worker_index],
0341 &ctx->receive_size[worker_index],
0342 RTEMS_WAIT,
0343 TIMEOUT_TICKS
0344 );
0345 }
0346
0347 static void WorkerTask( rtems_task_argument argument )
0348 {
0349 static size_t worker_number = 0;
0350 size_t worker_index = worker_number++;
0351 Context *ctx = (Context *) argument;
0352
0353 while ( true ) {
0354 ReceiveAnyEvents();
0355 Receive( ctx, worker_index );
0356 }
0357 }
0358
0359 static void CheckForNoMessage(
0360 Context *ctx,
0361 rtems_status_code status,
0362 uint8_t *message_buffer,
0363 size_t message_size
0364 )
0365 {
0366 (void) ctx;
0367 (void) message_buffer;
0368 (void) message_size;
0369 T_rsc( status, RTEMS_UNSATISFIED );
0370 }
0371
0372 static void CheckForMessage(
0373 Context *ctx,
0374 rtems_status_code status,
0375 uint8_t *message_buffer,
0376 size_t message_size
0377 )
0378 {
0379 T_rsc_success( status );
0380 T_eq_u32( message_size, ctx->size_param );
0381 T_eq_mem( message_buffer, message, ctx->size_param );
0382 }
0383
0384 static void CheckForQueuedMessage(
0385 Context *ctx,
0386 rtems_status_code status,
0387 uint8_t *message_buffer,
0388 size_t message_size
0389 )
0390 {
0391 (void) ctx;
0392 T_rsc_success( status );
0393 T_eq_u32( message_size, sizeof( queued_message ) );
0394 T_eq_mem( message_buffer, queued_message, sizeof( queued_message ) );
0395 }
0396
0397 static void PopMessage(
0398 Context *ctx,
0399 void (*check_fn)(
0400 Context *ctx,
0401 rtems_status_code status,
0402 uint8_t *message_buffer,
0403 size_t message_size
0404 )
0405 )
0406 {
0407 rtems_status_code status;
0408 uint8_t message_buffer[ MAXIMUM_MESSAGE_SIZE ];
0409 size_t message_size;
0410
0411 status = rtems_message_queue_receive(
0412 ctx->message_queue_id,
0413 &message_buffer,
0414 &message_size,
0415 RTEMS_LOCAL | RTEMS_NO_WAIT,
0416 RTEMS_NO_TIMEOUT
0417 );
0418
0419 check_fn( ctx, status, message_buffer, message_size );
0420 }
0421
0422 static void CheckForNoMessageInQueue( void *ctx_in )
0423 {
0424 Context *ctx = ctx_in;
0425 PopMessage( ctx, CheckForNoMessage );
0426 }
0427
0428 static void CheckForSeveralMessagesInQueue( void *ctx_in )
0429 {
0430 Context *ctx = ctx_in;
0431 PopMessage( ctx, CheckForQueuedMessage );
0432 PopMessage( ctx, CheckForQueuedMessage );
0433 PopMessage( ctx, CheckForNoMessage );
0434 }
0435
0436 static void SendMsg( Context *ctx )
0437 {
0438 rtems_status_code status;
0439
0440 status = rtems_message_queue_send(
0441 ctx->message_queue_id,
0442 queued_message,
0443 sizeof( queued_message )
0444 );
0445 T_rsc_success( status );
0446 }
0447
0448 static void RtemsMessageReqBroadcast_Pre_SendBuffer_Prepare(
0449 RtemsMessageReqBroadcast_Context *ctx,
0450 RtemsMessageReqBroadcast_Pre_SendBuffer state
0451 )
0452 {
0453 switch ( state ) {
0454 case RtemsMessageReqBroadcast_Pre_SendBuffer_Valid: {
0455
0456
0457
0458
0459 ctx->buffer_param = &message;
0460 break;
0461 }
0462
0463 case RtemsMessageReqBroadcast_Pre_SendBuffer_Null: {
0464
0465
0466
0467 ctx->buffer_param = NULL;
0468 break;
0469 }
0470
0471 case RtemsMessageReqBroadcast_Pre_SendBuffer_NA:
0472 break;
0473 }
0474 }
0475
0476 static void RtemsMessageReqBroadcast_Pre_Count_Prepare(
0477 RtemsMessageReqBroadcast_Context *ctx,
0478 RtemsMessageReqBroadcast_Pre_Count state
0479 )
0480 {
0481 switch ( state ) {
0482 case RtemsMessageReqBroadcast_Pre_Count_Valid: {
0483
0484
0485
0486 ctx->count_param = &ctx->count;
0487 break;
0488 }
0489
0490 case RtemsMessageReqBroadcast_Pre_Count_Null: {
0491
0492
0493
0494 ctx->count_param = NULL;
0495 break;
0496 }
0497
0498 case RtemsMessageReqBroadcast_Pre_Count_NA:
0499 break;
0500 }
0501 }
0502
0503 static void RtemsMessageReqBroadcast_Pre_Id_Prepare(
0504 RtemsMessageReqBroadcast_Context *ctx,
0505 RtemsMessageReqBroadcast_Pre_Id state
0506 )
0507 {
0508 switch ( state ) {
0509 case RtemsMessageReqBroadcast_Pre_Id_Valid: {
0510
0511
0512
0513 ctx->id_param = ctx->message_queue_id;
0514 break;
0515 }
0516
0517 case RtemsMessageReqBroadcast_Pre_Id_Invalid: {
0518
0519
0520
0521 ctx->id_param = RTEMS_ID_NONE;
0522 break;
0523 }
0524
0525 case RtemsMessageReqBroadcast_Pre_Id_NA:
0526 break;
0527 }
0528 }
0529
0530 static void RtemsMessageReqBroadcast_Pre_MsgSize_Prepare(
0531 RtemsMessageReqBroadcast_Context *ctx,
0532 RtemsMessageReqBroadcast_Pre_MsgSize state
0533 )
0534 {
0535 switch ( state ) {
0536 case RtemsMessageReqBroadcast_Pre_MsgSize_Zero: {
0537
0538
0539
0540 ctx->size_param = 0;
0541 break;
0542 }
0543
0544 case RtemsMessageReqBroadcast_Pre_MsgSize_SomeSize: {
0545
0546
0547
0548
0549 ctx->size_param = MAXIMUM_MESSAGE_SIZE / 2 + 1;
0550 break;
0551 }
0552
0553 case RtemsMessageReqBroadcast_Pre_MsgSize_MaxSize: {
0554
0555
0556
0557 ctx->size_param = MAXIMUM_MESSAGE_SIZE;
0558 break;
0559 }
0560
0561 case RtemsMessageReqBroadcast_Pre_MsgSize_TooLarge: {
0562
0563
0564
0565
0566 ctx->size_param = MAXIMUM_MESSAGE_SIZE + 1;
0567 break;
0568 }
0569
0570 case RtemsMessageReqBroadcast_Pre_MsgSize_NA:
0571 break;
0572 }
0573 }
0574
0575 static void RtemsMessageReqBroadcast_Pre_MsgQueue_Prepare(
0576 RtemsMessageReqBroadcast_Context *ctx,
0577 RtemsMessageReqBroadcast_Pre_MsgQueue state
0578 )
0579 {
0580 switch ( state ) {
0581 case RtemsMessageReqBroadcast_Pre_MsgQueue_Empty: {
0582
0583
0584
0585
0586 ctx->check_msgq_unchanged = CheckForNoMessageInQueue;
0587 break;
0588 }
0589
0590 case RtemsMessageReqBroadcast_Pre_MsgQueue_Several: {
0591
0592
0593
0594 SendMsg( ctx );
0595 SendMsg( ctx );
0596 ctx->check_msgq_unchanged = CheckForSeveralMessagesInQueue;
0597 break;
0598 }
0599
0600 case RtemsMessageReqBroadcast_Pre_MsgQueue_NA:
0601 break;
0602 }
0603 }
0604
0605 static void RtemsMessageReqBroadcast_Pre_Receivers_Prepare(
0606 RtemsMessageReqBroadcast_Context *ctx,
0607 RtemsMessageReqBroadcast_Pre_Receivers state
0608 )
0609 {
0610 switch ( state ) {
0611 case RtemsMessageReqBroadcast_Pre_Receivers_Waiting: {
0612
0613
0614
0615 size_t i;
0616 for ( i = 0; i < NUMBER_OF_WORKERS; ++i ) {
0617 SendEvents( ctx->worker_id[i], EVENT_RECEIVE );
0618 }
0619 break;
0620 }
0621
0622 case RtemsMessageReqBroadcast_Pre_Receivers_None: {
0623
0624
0625
0626
0627 break;
0628 }
0629
0630 case RtemsMessageReqBroadcast_Pre_Receivers_NA:
0631 break;
0632 }
0633 }
0634
0635 static void RtemsMessageReqBroadcast_Pre_Storage_Prepare(
0636 RtemsMessageReqBroadcast_Context *ctx,
0637 RtemsMessageReqBroadcast_Pre_Storage state
0638 )
0639 {
0640 switch ( state ) {
0641 case RtemsMessageReqBroadcast_Pre_Storage_Nop: {
0642
0643
0644
0645
0646
0647
0648
0649 break;
0650 }
0651
0652 case RtemsMessageReqBroadcast_Pre_Storage_NA:
0653 break;
0654 }
0655 }
0656
0657 static void RtemsMessageReqBroadcast_Post_Status_Check(
0658 RtemsMessageReqBroadcast_Context *ctx,
0659 RtemsMessageReqBroadcast_Post_Status state
0660 )
0661 {
0662 switch ( state ) {
0663 case RtemsMessageReqBroadcast_Post_Status_Ok: {
0664
0665
0666
0667
0668 T_rsc_success( ctx->status );
0669 break;
0670 }
0671
0672 case RtemsMessageReqBroadcast_Post_Status_InvId: {
0673
0674
0675
0676
0677 T_rsc( ctx->status, RTEMS_INVALID_ID );
0678 break;
0679 }
0680
0681 case RtemsMessageReqBroadcast_Post_Status_InvAddr: {
0682
0683
0684
0685
0686 T_rsc( ctx->status, RTEMS_INVALID_ADDRESS );
0687 break;
0688 }
0689
0690 case RtemsMessageReqBroadcast_Post_Status_InvSize: {
0691
0692
0693
0694
0695 T_rsc( ctx->status, RTEMS_INVALID_SIZE );
0696 break;
0697 }
0698
0699 case RtemsMessageReqBroadcast_Post_Status_NA:
0700 break;
0701 }
0702 }
0703
0704 static void RtemsMessageReqBroadcast_Post_Count_Check(
0705 RtemsMessageReqBroadcast_Context *ctx,
0706 RtemsMessageReqBroadcast_Post_Count state
0707 )
0708 {
0709 switch ( state ) {
0710 case RtemsMessageReqBroadcast_Post_Count_Zero: {
0711
0712
0713
0714
0715 T_eq_u32( ctx->count, 0 );
0716 break;
0717 }
0718
0719 case RtemsMessageReqBroadcast_Post_Count_Set: {
0720
0721
0722
0723
0724
0725
0726 T_eq_u32( ctx->count, NUMBER_OF_WORKERS );
0727 break;
0728 }
0729
0730 case RtemsMessageReqBroadcast_Post_Count_Nop: {
0731
0732
0733
0734
0735
0736 T_eq_u32( ctx->count, UINT8_MAX );
0737 break;
0738 }
0739
0740 case RtemsMessageReqBroadcast_Post_Count_NA:
0741 break;
0742 }
0743 }
0744
0745 static void RtemsMessageReqBroadcast_Post_MsgQueue_Check(
0746 RtemsMessageReqBroadcast_Context *ctx,
0747 RtemsMessageReqBroadcast_Post_MsgQueue state
0748 )
0749 {
0750 switch ( state ) {
0751 case RtemsMessageReqBroadcast_Post_MsgQueue_Nop: {
0752
0753
0754
0755
0756
0757 ctx->check_msgq_unchanged( ctx );
0758 break;
0759 }
0760
0761 case RtemsMessageReqBroadcast_Post_MsgQueue_NA:
0762 break;
0763 }
0764 }
0765
0766 static void RtemsMessageReqBroadcast_Post_Receivers_Check(
0767 RtemsMessageReqBroadcast_Context *ctx,
0768 RtemsMessageReqBroadcast_Post_Receivers state
0769 )
0770 {
0771 size_t i;
0772
0773 switch ( state ) {
0774 case RtemsMessageReqBroadcast_Post_Receivers_Unblocked: {
0775
0776
0777
0778
0779
0780
0781
0782
0783
0784
0785
0786 for ( i = 0; i < NUMBER_OF_WORKERS; ++i ) {
0787 T_rsc_success( ctx->receive_status[i] );
0788 }
0789 break;
0790 }
0791
0792 case RtemsMessageReqBroadcast_Post_Receivers_Nop: {
0793
0794
0795
0796
0797 for ( i = 0; i < NUMBER_OF_WORKERS; ++i ) {
0798 T_rsc( ctx->receive_status[i], RTEMS_TIMEOUT );
0799 }
0800 break;
0801 }
0802
0803 case RtemsMessageReqBroadcast_Post_Receivers_NA:
0804 break;
0805 }
0806 }
0807
0808 static void RtemsMessageReqBroadcast_Post_RecSize_Check(
0809 RtemsMessageReqBroadcast_Context *ctx,
0810 RtemsMessageReqBroadcast_Post_RecSize state
0811 )
0812 {
0813 size_t i;
0814
0815 switch ( state ) {
0816 case RtemsMessageReqBroadcast_Post_RecSize_Message: {
0817
0818
0819
0820
0821
0822
0823
0824
0825 for ( i = 0; i < NUMBER_OF_WORKERS; ++i ) {
0826 CheckForMessage(
0827 ctx,
0828 ctx->receive_status[i],
0829 ctx->receive_buffer[i],
0830 ctx->receive_size[i]
0831 );
0832 }
0833 break;
0834 }
0835
0836 case RtemsMessageReqBroadcast_Post_RecSize_Nop: {
0837
0838
0839
0840
0841
0842 for ( i = 0; i < NUMBER_OF_WORKERS; ++i ) {
0843 T_eq_sz( ctx->receive_size[i], SIZE_MAX );
0844 }
0845 break;
0846 }
0847
0848 case RtemsMessageReqBroadcast_Post_RecSize_NA:
0849 break;
0850 }
0851 }
0852
0853 static void RtemsMessageReqBroadcast_Post_RecBuffer_Check(
0854 RtemsMessageReqBroadcast_Context *ctx,
0855 RtemsMessageReqBroadcast_Post_RecBuffer state
0856 )
0857 {
0858 size_t w, i;
0859
0860 switch ( state ) {
0861 case RtemsMessageReqBroadcast_Post_RecBuffer_Message: {
0862
0863
0864
0865
0866
0867
0868
0869
0870
0871 for ( i = 0; i < NUMBER_OF_WORKERS; ++i ) {
0872 CheckForMessage(
0873 ctx,
0874 ctx->receive_status[i],
0875 ctx->receive_buffer[i],
0876 ctx->receive_size[i]
0877 );
0878 }
0879 break;
0880 }
0881
0882 case RtemsMessageReqBroadcast_Post_RecBuffer_Nop: {
0883
0884
0885
0886
0887
0888 for ( w = 0; w < NUMBER_OF_WORKERS; ++w ) {
0889 for ( i = 0; i < MAXIMUM_MESSAGE_SIZE; ++i ) {
0890 T_eq_u8( ctx->receive_buffer[w][i], UINT8_MAX );
0891 }
0892 }
0893 break;
0894 }
0895
0896 case RtemsMessageReqBroadcast_Post_RecBuffer_NA:
0897 break;
0898 }
0899 }
0900
0901 static void RtemsMessageReqBroadcast_Setup(
0902 RtemsMessageReqBroadcast_Context *ctx
0903 )
0904 {
0905 size_t i;
0906 SetSelfPriority( PRIO_NORMAL );
0907
0908 for ( i = 0; i < NUMBER_OF_WORKERS; ++i ) {
0909 ctx->worker_id[i] = CreateTask( "WORK", PRIO_HIGH );
0910 StartTask( ctx->worker_id[i], WorkerTask, ctx );
0911 }
0912 }
0913
0914 static void RtemsMessageReqBroadcast_Setup_Wrap( void *arg )
0915 {
0916 RtemsMessageReqBroadcast_Context *ctx;
0917
0918 ctx = arg;
0919 ctx->Map.in_action_loop = false;
0920 RtemsMessageReqBroadcast_Setup( ctx );
0921 }
0922
0923 static void RtemsMessageReqBroadcast_Teardown(
0924 RtemsMessageReqBroadcast_Context *ctx
0925 )
0926 {
0927 size_t i;
0928
0929 for ( i = 0; i < NUMBER_OF_WORKERS; ++i ) {
0930 DeleteTask( ctx->worker_id[i] );
0931 }
0932 RestoreRunnerPriority();
0933 }
0934
0935 static void RtemsMessageReqBroadcast_Teardown_Wrap( void *arg )
0936 {
0937 RtemsMessageReqBroadcast_Context *ctx;
0938
0939 ctx = arg;
0940 ctx->Map.in_action_loop = false;
0941 RtemsMessageReqBroadcast_Teardown( ctx );
0942 }
0943
0944 static void RtemsMessageReqBroadcast_Prepare(
0945 RtemsMessageReqBroadcast_Context *ctx
0946 )
0947 {
0948 rtems_status_code status;
0949 size_t i;
0950
0951 rtems_message_queue_config config = {
0952 .name = rtems_build_name( 'M', 'S', 'G', 'Q' ),
0953 .maximum_pending_messages = MAXIMUM_PENDING_MESSAGES,
0954 .maximum_message_size = MAXIMUM_MESSAGE_SIZE,
0955 .storage_area = ctx->storage_area,
0956 .storage_size = sizeof( ctx->storage_area ),
0957 .storage_free = NULL,
0958 .attributes = RTEMS_DEFAULT_ATTRIBUTES
0959 };
0960
0961 status = rtems_message_queue_construct(
0962 &config,
0963 &ctx->message_queue_id
0964 );
0965 T_rsc_success( status );
0966
0967 ctx->count = UINT8_MAX;
0968 for ( i = 0; i < NUMBER_OF_WORKERS; ++i ) {
0969 ctx->receive_size[i] = SIZE_MAX;
0970 memset( ctx->receive_buffer[i], UINT8_MAX, MAXIMUM_MESSAGE_SIZE );
0971 }
0972 }
0973
0974 static void RtemsMessageReqBroadcast_Action(
0975 RtemsMessageReqBroadcast_Context *ctx
0976 )
0977 {
0978 ctx->status = rtems_message_queue_broadcast(
0979 ctx->id_param,
0980 ctx->buffer_param,
0981 ctx->size_param,
0982 ctx->count_param
0983 );
0984
0985 FinalClockTick();
0986 }
0987
0988 static void RtemsMessageReqBroadcast_Cleanup(
0989 RtemsMessageReqBroadcast_Context *ctx
0990 )
0991 {
0992 T_rsc_success( rtems_message_queue_delete( ctx->message_queue_id ) );
0993 }
0994
0995 static const RtemsMessageReqBroadcast_Entry
0996 RtemsMessageReqBroadcast_Entries[] = {
0997 { 0, 0, 0, 0, 0, 0, 0, 0, RtemsMessageReqBroadcast_Post_Status_InvAddr,
0998 RtemsMessageReqBroadcast_Post_Count_Nop,
0999 RtemsMessageReqBroadcast_Post_MsgQueue_Nop,
1000 RtemsMessageReqBroadcast_Post_Receivers_NA,
1001 RtemsMessageReqBroadcast_Post_RecSize_NA,
1002 RtemsMessageReqBroadcast_Post_RecBuffer_NA },
1003 { 1, 0, 0, 0, 0, 0, 0, 0, RtemsMessageReqBroadcast_Post_Status_NA,
1004 RtemsMessageReqBroadcast_Post_Count_NA,
1005 RtemsMessageReqBroadcast_Post_MsgQueue_NA,
1006 RtemsMessageReqBroadcast_Post_Receivers_NA,
1007 RtemsMessageReqBroadcast_Post_RecSize_NA,
1008 RtemsMessageReqBroadcast_Post_RecBuffer_NA },
1009 { 0, 0, 0, 0, 0, 0, 0, 0, RtemsMessageReqBroadcast_Post_Status_InvAddr,
1010 RtemsMessageReqBroadcast_Post_Count_Nop,
1011 RtemsMessageReqBroadcast_Post_MsgQueue_Nop,
1012 RtemsMessageReqBroadcast_Post_Receivers_Nop,
1013 RtemsMessageReqBroadcast_Post_RecSize_Nop,
1014 RtemsMessageReqBroadcast_Post_RecBuffer_Nop },
1015 { 0, 0, 0, 0, 0, 0, 0, 0, RtemsMessageReqBroadcast_Post_Status_InvId,
1016 RtemsMessageReqBroadcast_Post_Count_Nop,
1017 RtemsMessageReqBroadcast_Post_MsgQueue_Nop,
1018 RtemsMessageReqBroadcast_Post_Receivers_NA,
1019 RtemsMessageReqBroadcast_Post_RecSize_NA,
1020 RtemsMessageReqBroadcast_Post_RecBuffer_NA },
1021 { 0, 0, 0, 0, 0, 0, 0, 0, RtemsMessageReqBroadcast_Post_Status_Ok,
1022 RtemsMessageReqBroadcast_Post_Count_Zero,
1023 RtemsMessageReqBroadcast_Post_MsgQueue_Nop,
1024 RtemsMessageReqBroadcast_Post_Receivers_NA,
1025 RtemsMessageReqBroadcast_Post_RecSize_NA,
1026 RtemsMessageReqBroadcast_Post_RecBuffer_NA },
1027 { 0, 0, 0, 0, 0, 0, 0, 0, RtemsMessageReqBroadcast_Post_Status_InvId,
1028 RtemsMessageReqBroadcast_Post_Count_Nop,
1029 RtemsMessageReqBroadcast_Post_MsgQueue_Nop,
1030 RtemsMessageReqBroadcast_Post_Receivers_Nop,
1031 RtemsMessageReqBroadcast_Post_RecSize_Nop,
1032 RtemsMessageReqBroadcast_Post_RecBuffer_Nop },
1033 { 0, 0, 0, 0, 0, 0, 0, 0, RtemsMessageReqBroadcast_Post_Status_Ok,
1034 RtemsMessageReqBroadcast_Post_Count_Set,
1035 RtemsMessageReqBroadcast_Post_MsgQueue_Nop,
1036 RtemsMessageReqBroadcast_Post_Receivers_Unblocked,
1037 RtemsMessageReqBroadcast_Post_RecSize_Message,
1038 RtemsMessageReqBroadcast_Post_RecBuffer_Message },
1039 { 0, 0, 0, 0, 0, 0, 0, 0, RtemsMessageReqBroadcast_Post_Status_InvSize,
1040 RtemsMessageReqBroadcast_Post_Count_Nop,
1041 RtemsMessageReqBroadcast_Post_MsgQueue_Nop,
1042 RtemsMessageReqBroadcast_Post_Receivers_NA,
1043 RtemsMessageReqBroadcast_Post_RecSize_NA,
1044 RtemsMessageReqBroadcast_Post_RecBuffer_NA },
1045 { 0, 0, 0, 0, 0, 0, 0, 0, RtemsMessageReqBroadcast_Post_Status_InvSize,
1046 RtemsMessageReqBroadcast_Post_Count_Nop,
1047 RtemsMessageReqBroadcast_Post_MsgQueue_Nop,
1048 RtemsMessageReqBroadcast_Post_Receivers_Nop,
1049 RtemsMessageReqBroadcast_Post_RecSize_Nop,
1050 RtemsMessageReqBroadcast_Post_RecBuffer_Nop }
1051 };
1052
1053 static const uint8_t
1054 RtemsMessageReqBroadcast_Map[] = {
1055 6, 4, 1, 4, 6, 4, 1, 4, 6, 4, 1, 4, 8, 7, 1, 7, 5, 3, 1, 3, 5, 3, 1, 3, 5, 3,
1056 1, 3, 5, 3, 1, 3, 2, 0, 1, 0, 2, 0, 1, 0, 2, 0, 1, 0, 2, 0, 1, 0, 2, 0, 1, 0,
1057 2, 0, 1, 0, 2, 0, 1, 0, 2, 0, 1, 0, 2, 0, 1, 0, 2, 0, 1, 0, 2, 0, 1, 0, 2, 0,
1058 1, 0, 2, 0, 1, 0, 2, 0, 1, 0, 2, 0, 1, 0, 2, 0, 1, 0, 2, 0, 1, 0, 2, 0, 1, 0,
1059 2, 0, 1, 0, 2, 0, 1, 0, 2, 0, 1, 0, 2, 0, 1, 0, 2, 0, 1, 0, 2, 0, 1, 0
1060 };
1061
1062 static size_t RtemsMessageReqBroadcast_Scope( void *arg, char *buf, size_t n )
1063 {
1064 RtemsMessageReqBroadcast_Context *ctx;
1065
1066 ctx = arg;
1067
1068 if ( ctx->Map.in_action_loop ) {
1069 return T_get_scope(
1070 RtemsMessageReqBroadcast_PreDesc,
1071 buf,
1072 n,
1073 ctx->Map.pcs
1074 );
1075 }
1076
1077 return 0;
1078 }
1079
1080 static T_fixture RtemsMessageReqBroadcast_Fixture = {
1081 .setup = RtemsMessageReqBroadcast_Setup_Wrap,
1082 .stop = NULL,
1083 .teardown = RtemsMessageReqBroadcast_Teardown_Wrap,
1084 .scope = RtemsMessageReqBroadcast_Scope,
1085 .initial_context = &RtemsMessageReqBroadcast_Instance
1086 };
1087
1088 static inline RtemsMessageReqBroadcast_Entry RtemsMessageReqBroadcast_PopEntry(
1089 RtemsMessageReqBroadcast_Context *ctx
1090 )
1091 {
1092 size_t index;
1093
1094 index = ctx->Map.index;
1095 ctx->Map.index = index + 1;
1096 return RtemsMessageReqBroadcast_Entries[
1097 RtemsMessageReqBroadcast_Map[ index ]
1098 ];
1099 }
1100
1101 static void RtemsMessageReqBroadcast_TestVariant(
1102 RtemsMessageReqBroadcast_Context *ctx
1103 )
1104 {
1105 RtemsMessageReqBroadcast_Pre_SendBuffer_Prepare( ctx, ctx->Map.pcs[ 0 ] );
1106 RtemsMessageReqBroadcast_Pre_Count_Prepare( ctx, ctx->Map.pcs[ 1 ] );
1107 RtemsMessageReqBroadcast_Pre_Id_Prepare( ctx, ctx->Map.pcs[ 2 ] );
1108 RtemsMessageReqBroadcast_Pre_MsgSize_Prepare( ctx, ctx->Map.pcs[ 3 ] );
1109 RtemsMessageReqBroadcast_Pre_MsgQueue_Prepare( ctx, ctx->Map.pcs[ 4 ] );
1110 RtemsMessageReqBroadcast_Pre_Receivers_Prepare( ctx, ctx->Map.pcs[ 5 ] );
1111 RtemsMessageReqBroadcast_Pre_Storage_Prepare( ctx, ctx->Map.pcs[ 6 ] );
1112 RtemsMessageReqBroadcast_Action( ctx );
1113 RtemsMessageReqBroadcast_Post_Status_Check(
1114 ctx,
1115 ctx->Map.entry.Post_Status
1116 );
1117 RtemsMessageReqBroadcast_Post_Count_Check( ctx, ctx->Map.entry.Post_Count );
1118 RtemsMessageReqBroadcast_Post_MsgQueue_Check(
1119 ctx,
1120 ctx->Map.entry.Post_MsgQueue
1121 );
1122 RtemsMessageReqBroadcast_Post_Receivers_Check(
1123 ctx,
1124 ctx->Map.entry.Post_Receivers
1125 );
1126 RtemsMessageReqBroadcast_Post_RecSize_Check(
1127 ctx,
1128 ctx->Map.entry.Post_RecSize
1129 );
1130 RtemsMessageReqBroadcast_Post_RecBuffer_Check(
1131 ctx,
1132 ctx->Map.entry.Post_RecBuffer
1133 );
1134 }
1135
1136
1137
1138
1139 T_TEST_CASE_FIXTURE(
1140 RtemsMessageReqBroadcast,
1141 &RtemsMessageReqBroadcast_Fixture
1142 )
1143 {
1144 RtemsMessageReqBroadcast_Context *ctx;
1145
1146 ctx = T_fixture_context();
1147 ctx->Map.in_action_loop = true;
1148 ctx->Map.index = 0;
1149
1150 for (
1151 ctx->Map.pcs[ 0 ] = RtemsMessageReqBroadcast_Pre_SendBuffer_Valid;
1152 ctx->Map.pcs[ 0 ] < RtemsMessageReqBroadcast_Pre_SendBuffer_NA;
1153 ++ctx->Map.pcs[ 0 ]
1154 ) {
1155 for (
1156 ctx->Map.pcs[ 1 ] = RtemsMessageReqBroadcast_Pre_Count_Valid;
1157 ctx->Map.pcs[ 1 ] < RtemsMessageReqBroadcast_Pre_Count_NA;
1158 ++ctx->Map.pcs[ 1 ]
1159 ) {
1160 for (
1161 ctx->Map.pcs[ 2 ] = RtemsMessageReqBroadcast_Pre_Id_Valid;
1162 ctx->Map.pcs[ 2 ] < RtemsMessageReqBroadcast_Pre_Id_NA;
1163 ++ctx->Map.pcs[ 2 ]
1164 ) {
1165 for (
1166 ctx->Map.pcs[ 3 ] = RtemsMessageReqBroadcast_Pre_MsgSize_Zero;
1167 ctx->Map.pcs[ 3 ] < RtemsMessageReqBroadcast_Pre_MsgSize_NA;
1168 ++ctx->Map.pcs[ 3 ]
1169 ) {
1170 for (
1171 ctx->Map.pcs[ 4 ] = RtemsMessageReqBroadcast_Pre_MsgQueue_Empty;
1172 ctx->Map.pcs[ 4 ] < RtemsMessageReqBroadcast_Pre_MsgQueue_NA;
1173 ++ctx->Map.pcs[ 4 ]
1174 ) {
1175 for (
1176 ctx->Map.pcs[ 5 ] = RtemsMessageReqBroadcast_Pre_Receivers_Waiting;
1177 ctx->Map.pcs[ 5 ] < RtemsMessageReqBroadcast_Pre_Receivers_NA;
1178 ++ctx->Map.pcs[ 5 ]
1179 ) {
1180 for (
1181 ctx->Map.pcs[ 6 ] = RtemsMessageReqBroadcast_Pre_Storage_Nop;
1182 ctx->Map.pcs[ 6 ] < RtemsMessageReqBroadcast_Pre_Storage_NA;
1183 ++ctx->Map.pcs[ 6 ]
1184 ) {
1185 ctx->Map.entry = RtemsMessageReqBroadcast_PopEntry( ctx );
1186
1187 if ( ctx->Map.entry.Skip ) {
1188 continue;
1189 }
1190
1191 RtemsMessageReqBroadcast_Prepare( ctx );
1192 RtemsMessageReqBroadcast_TestVariant( ctx );
1193 RtemsMessageReqBroadcast_Cleanup( ctx );
1194 }
1195 }
1196 }
1197 }
1198 }
1199 }
1200 }
1201 }
1202
1203