Back to home page

LXR

 
 

    


File indexing completed on 2025-05-11 08:24:35

0001 /* SPDX-License-Identifier: BSD-2-Clause */
0002 
0003 /*  Test_task
0004  *
0005  *  This task continuously sends an event to its counterpart on the
0006  *  other node, and then waits for it to send an event.  The copy
0007  *  running on node one send the first event.
0008  *
0009  *  Input parameters:
0010  *    argument - task argument
0011  *
0012  *  Output parameters:  NONE
0013  *
0014  *  COPYRIGHT (c) 1989-2009.
0015  *  On-Line Applications Research Corporation (OAR).
0016  *
0017  * Redistribution and use in source and binary forms, with or without
0018  * modification, are permitted provided that the following conditions
0019  * are met:
0020  * 1. Redistributions of source code must retain the above copyright
0021  *    notice, this list of conditions and the following disclaimer.
0022  * 2. Redistributions in binary form must reproduce the above copyright
0023  *    notice, this list of conditions and the following disclaimer in the
0024  *    documentation and/or other materials provided with the distribution.
0025  *
0026  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
0027  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
0028  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
0029  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
0030  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
0031  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
0032  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
0033  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
0034  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
0035  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
0036  * POSSIBILITY OF SUCH DAMAGE.
0037  */
0038 
0039 #ifdef HAVE_CONFIG_H
0040 #include "config.h"
0041 #endif
0042 
0043 #include "system.h"
0044 
0045 #define DOT_COUNT 100
0046 
0047 static rtems_timer_service_routine Stop_Test_TSR(
0048   rtems_id  ignored_id,
0049   void     *ignored_address
0050 )
0051 {
0052   Stop_Test = true;
0053 }
0054 
0055 rtems_task Test_task(
0056   rtems_task_argument argument
0057 )
0058 {
0059   rtems_status_code status;
0060   uint32_t    count;
0061   uint32_t    remote_node;
0062   rtems_id          remote_tid;
0063   rtems_event_set   event_out;
0064 
0065   Stop_Test = false;
0066 
0067   remote_node = (rtems_object_get_local_node() == 1) ? 2 : 1;
0068   puts_nocr( "Remote task's name is : " );
0069   put_name( Task_name[ remote_node ], TRUE );
0070 
0071   puts( "Getting TID of remote task" );
0072   do {
0073     status = rtems_task_ident(
0074       Task_name[ remote_node ],
0075       RTEMS_SEARCH_ALL_NODES,
0076       &remote_tid
0077     );
0078   } while ( !rtems_is_status_successful( status ) );
0079 
0080   if ( rtems_object_get_local_node() == 1 ) {
0081     puts( "Sending first event to remote task" );
0082     status = rtems_event_send( remote_tid, RTEMS_EVENT_16 );
0083     directive_failed( status, "rtems_event_send" );
0084   }
0085 
0086   status = rtems_timer_fire_after(
0087     Timer_id[ 1 ],
0088     5 * rtems_clock_get_ticks_per_second(),
0089     Stop_Test_TSR,
0090     NULL
0091   );
0092   directive_failed( status, "rtems_timer_fire_after" );
0093 
0094   while ( true ) {
0095     for ( count=DOT_COUNT ; count && (Stop_Test == false) ; count-- ) {
0096       status = rtems_event_receive(
0097         RTEMS_EVENT_16,
0098         RTEMS_DEFAULT_OPTIONS,
0099         rtems_clock_get_ticks_per_second(),
0100         &event_out
0101       );
0102       if ( status == RTEMS_TIMEOUT ) {
0103         printf("\nTA1 - RTEMS_TIMEOUT .. probably OK if the other node exits");
0104         Stop_Test = true;
0105         break;
0106       } else
0107         directive_failed( status, "rtems_event_receive" );
0108 
0109       status = rtems_event_send( remote_tid, RTEMS_EVENT_16 );
0110       directive_failed( status, "rtems_event_send" );
0111     }
0112     if ( Stop_Test )
0113        break;
0114     put_dot('.');
0115   }
0116 
0117   /*
0118    * Wait a bit before shutting down so we don't screw up the other node
0119    * when our MPCI shuts down
0120    */
0121 
0122   rtems_task_wake_after(10);
0123 
0124   puts( "\n*** END OF TEST 7 ***" );
0125   rtems_test_exit( 0 );
0126 }