Back to home page

LXR

 
 

    


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

0001 /* SPDX-License-Identifier: BSD-2-Clause */
0002 
0003 /*
0004  *  COPYRIGHT (c) 1989-2013.
0005  *  On-Line Applications Research Corporation (OAR).
0006  *
0007  * Redistribution and use in source and binary forms, with or without
0008  * modification, are permitted provided that the following conditions
0009  * are met:
0010  * 1. Redistributions of source code must retain the above copyright
0011  *    notice, this list of conditions and the following disclaimer.
0012  * 2. Redistributions in binary form must reproduce the above copyright
0013  *    notice, this list of conditions and the following disclaimer in the
0014  *    documentation and/or other materials provided with the distribution.
0015  *
0016  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
0017  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
0018  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
0019  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
0020  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
0021  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
0022  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
0023  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
0024  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
0025  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
0026  * POSSIBILITY OF SUCH DAMAGE.
0027  */
0028 
0029 #if !defined(OPERATION_COUNT)
0030 #define OPERATION_COUNT 100
0031 #endif
0032 
0033 #ifdef HAVE_CONFIG_H
0034 #include "config.h"
0035 #endif
0036 
0037 #include <rtems/btimer.h>
0038 
0039 #define CONFIGURE_INIT
0040 #include "system.h"
0041 
0042 const char rtems_test_name[] = "TIME TEST 7";
0043 
0044 rtems_id Task_id[ OPERATION_COUNT+1 ], task_index;
0045 
0046 rtems_task High_task(
0047   rtems_task_argument argument
0048 );
0049 
0050 rtems_task Middle_tasks(
0051   rtems_task_argument argument
0052 );
0053 
0054 rtems_task Low_task(
0055   rtems_task_argument argument
0056 );
0057 
0058 void test_init(void);
0059 
0060 int operation_count = OPERATION_COUNT;
0061 
0062 rtems_task Init(
0063   rtems_task_argument argument
0064 )
0065 {
0066   Print_Warning();
0067 
0068   TEST_BEGIN();
0069 
0070   test_init();
0071 
0072   rtems_task_exit();
0073 }
0074 
0075 void test_init(void)
0076 {
0077   rtems_status_code   status;
0078   rtems_task_priority priority;
0079   rtems_task_entry    task_entry;
0080   int                 index;
0081 
0082   priority = RTEMS_MAXIMUM_PRIORITY - 1u;
0083 
0084   if ( OPERATION_COUNT > RTEMS_MAXIMUM_PRIORITY - 2u )
0085     operation_count =  (int) (RTEMS_MAXIMUM_PRIORITY - 2u);
0086 
0087   for( index=0 ; index <= operation_count ; index++ ) {
0088     status = rtems_task_create(
0089       rtems_build_name( 'T', 'I', 'M', 'E' ),
0090       priority,
0091       RTEMS_MINIMUM_STACK_SIZE,
0092       RTEMS_DEFAULT_MODES,
0093       RTEMS_DEFAULT_ATTRIBUTES,
0094       &Task_id[index]
0095     );
0096     directive_failed( status, "rtems_task_create" );
0097     priority--;
0098 
0099     if      ( index == 0 )               task_entry = Low_task;
0100     else if ( index == operation_count ) task_entry = High_task;
0101     else                                 task_entry = Middle_tasks;
0102 
0103     status = rtems_task_start( Task_id[index], task_entry, 0 );
0104     directive_failed( status, "rtems_task_start" );
0105   }
0106 }
0107 
0108 rtems_task High_task(
0109   rtems_task_argument argument
0110 )
0111 {
0112   if ( argument != 0 ) {
0113     end_time = benchmark_timer_read();
0114 
0115     put_time(
0116       "rtems_task_restart: suspended task preempts caller",
0117       end_time,
0118       operation_count,
0119       0,
0120       0
0121     );
0122   } else
0123     (void) rtems_task_suspend( RTEMS_SELF );
0124 
0125   TEST_END();
0126   rtems_test_exit( 0 );
0127 }
0128 
0129 rtems_task Middle_tasks(
0130   rtems_task_argument argument
0131 )
0132 {
0133   task_index++;
0134 
0135   if ( argument != 0 )
0136     (void) rtems_task_restart( Task_id[ task_index ], 0xffffffff );
0137   else
0138     (void) rtems_task_suspend( RTEMS_SELF );
0139 }
0140 
0141 rtems_task Low_task(
0142   rtems_task_argument argument
0143 )
0144 {
0145   task_index = 1;
0146 
0147   benchmark_timer_initialize();
0148   (void) rtems_task_restart( Task_id[ task_index ], 0xffffffff );
0149 }