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 #ifdef HAVE_CONFIG_H
0030 #include "config.h"
0031 #endif
0032 
0033 #include <rtems/btimer.h>
0034 
0035 #define CONFIGURE_INIT
0036 #include "system.h"
0037 
0038 const char rtems_test_name[] = "TIME TEST 5";
0039 
0040 rtems_id   Task_id[OPERATION_COUNT+1];
0041 uint32_t   Task_index;
0042 
0043 rtems_task High_task(
0044   rtems_task_argument argument
0045 );
0046 
0047 rtems_task Middle_tasks(
0048   rtems_task_argument argument
0049 );
0050 
0051 rtems_task Low_task(
0052   rtems_task_argument argument
0053 );
0054 
0055 extern void test_init(void);
0056 
0057 int operation_count = OPERATION_COUNT;
0058 
0059 rtems_task Init(
0060   rtems_task_argument argument
0061 )
0062 {
0063   Print_Warning();
0064 
0065   TEST_BEGIN();
0066 
0067   test_init();
0068 
0069   rtems_task_exit();
0070 }
0071 
0072 void test_init(void)
0073 {
0074   rtems_status_code   status;
0075   rtems_task_entry    task_entry;
0076   rtems_task_priority priority;
0077   uint32_t      index;
0078 
0079   priority = RTEMS_MAXIMUM_PRIORITY - 1;
0080 
0081   if ( OPERATION_COUNT > RTEMS_MAXIMUM_PRIORITY - 2 )
0082     operation_count =  RTEMS_MAXIMUM_PRIORITY - 2;
0083 
0084   for( index = 0; index <= operation_count ; index++ ) {
0085 
0086     status = rtems_task_create(
0087       rtems_build_name( 'T', 'I', 'M', 'E' ),
0088       priority,
0089       RTEMS_MINIMUM_STACK_SIZE,
0090       RTEMS_DEFAULT_MODES,
0091       RTEMS_DEFAULT_ATTRIBUTES,
0092       &Task_id[ index ]
0093     );
0094     directive_failed( status, "rtems_task_create loop" );
0095 
0096     priority--;
0097 
0098     if ( index==0 )                    task_entry = Low_task;
0099     else if ( index==operation_count ) task_entry = High_task;
0100     else                               task_entry = Middle_tasks;
0101 
0102     status = rtems_task_start( Task_id[ index ], task_entry, 0 );
0103     directive_failed( status, "rtems_task_start loop" );
0104   }
0105 }
0106 
0107 rtems_task High_task(
0108   rtems_task_argument argument
0109 )
0110 {
0111   benchmark_timer_initialize();
0112 
0113   (void) rtems_task_suspend( RTEMS_SELF );
0114 
0115   end_time = benchmark_timer_read();
0116 
0117   put_time(
0118     "rtems_task_resume: task readied preempts caller",
0119     end_time,
0120     operation_count,
0121     0,
0122     0
0123   );
0124 
0125   TEST_END();
0126   rtems_test_exit( 0 );
0127 }
0128 
0129 rtems_task Middle_tasks(
0130   rtems_task_argument argument
0131 )
0132 {
0133   (void) rtems_task_suspend( RTEMS_SELF );
0134 
0135   Task_index++;
0136   (void) rtems_task_resume( Task_id[ Task_index ] );
0137 }
0138 
0139 rtems_task Low_task(
0140   rtems_task_argument argument
0141 )
0142 {
0143 
0144   end_time = benchmark_timer_read();
0145 
0146   put_time(
0147     "rtems_task_suspend: calling task",
0148     end_time,
0149     operation_count,
0150     0,
0151     0
0152   );
0153 
0154   Task_index = 1;
0155   benchmark_timer_initialize();
0156   (void) rtems_task_resume( Task_id[ Task_index ] );
0157 }