Back to home page

LXR

 
 

    


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

0001 /* SPDX-License-Identifier: BSD-2-Clause */
0002 
0003 /**
0004  * @file
0005  *
0006  * @ingroup RtemsCpuuseValCpuuse
0007  */
0008 
0009 /*
0010  * Copyright (C) 2021 embedded brains GmbH & Co. KG
0011  *
0012  * Redistribution and use in source and binary forms, with or without
0013  * modification, are permitted provided that the following conditions
0014  * are met:
0015  * 1. Redistributions of source code must retain the above copyright
0016  *    notice, this list of conditions and the following disclaimer.
0017  * 2. Redistributions in binary form must reproduce the above copyright
0018  *    notice, this list of conditions and the following disclaimer in the
0019  *    documentation and/or other materials provided with the distribution.
0020  *
0021  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
0022  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
0023  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
0024  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
0025  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
0026  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
0027  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
0028  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
0029  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
0030  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
0031  * POSSIBILITY OF SUCH DAMAGE.
0032  */
0033 
0034 /*
0035  * This file is part of the RTEMS quality process and was automatically
0036  * generated.  If you find something that needs to be fixed or
0037  * worded better please post a report or patch to an RTEMS mailing list
0038  * or raise a bug report:
0039  *
0040  * https://www.rtems.org/bugs.html
0041  *
0042  * For information on updating and regenerating please refer to the How-To
0043  * section in the Software Requirements Engineering chapter of the
0044  * RTEMS Software Engineering manual.  The manual is provided as a part of
0045  * a release.  For development sources please refer to the online
0046  * documentation at:
0047  *
0048  * https://docs.rtems.org
0049  */
0050 
0051 #ifdef HAVE_CONFIG_H
0052 #include "config.h"
0053 #endif
0054 
0055 #include <rtems/cpuuse.h>
0056 #include <rtems/score/threadimpl.h>
0057 
0058 #include "tx-support.h"
0059 
0060 #include <rtems/test.h>
0061 
0062 /**
0063  * @defgroup RtemsCpuuseValCpuuse spec:/rtems/cpuuse/val/cpuuse
0064  *
0065  * @ingroup TestsuitesValidationNoClock0
0066  *
0067  * @brief Tests the CPU usage reporting and reset.
0068  *
0069  * This test case performs the following actions:
0070  *
0071  * - Create a worker thread.  Generate some CPU usage.
0072  *
0073  *   - Check that we have a non-zero CPU usage.  Reset the CPU usage.  Check
0074  *     that it was cleared to zero.
0075  *
0076  *   - Clean up all used resources.
0077  *
0078  * @{
0079  */
0080 
0081 static void Worker( rtems_task_argument arg )
0082 {
0083   (void) arg;
0084 
0085   while ( true ) {
0086     Yield();
0087   }
0088 }
0089 
0090 /**
0091  * @brief Create a worker thread.  Generate some CPU usage.
0092  */
0093 static void RtemsCpuuseValCpuuse_Action_0( void )
0094 {
0095   rtems_id          id;
0096   Thread_Control   *self;
0097   Thread_Control   *other;
0098   Timestamp_Control cpu_usage_self;
0099   Timestamp_Control cpu_usage_other;
0100   uint32_t          idle_tasks;
0101   uint32_t          cpu_index;
0102 
0103   idle_tasks = 0;
0104 
0105   for ( cpu_index = 0; cpu_index < rtems_scheduler_get_processor_maximum(); ++cpu_index ) {
0106     rtems_status_code sc;
0107     rtems_id          unused;
0108 
0109     sc = rtems_scheduler_ident_by_processor( cpu_index, &unused );
0110 
0111     if ( sc == RTEMS_SUCCESSFUL ) {
0112       ++idle_tasks;
0113     }
0114   }
0115 
0116   id = CreateTask( "WORK", GetSelfPriority() );
0117   StartTask( id, Worker, NULL );
0118 
0119   self = GetThread( RTEMS_SELF );
0120   other = GetThread( id );
0121 
0122   Yield();
0123   Yield();
0124 
0125   /*
0126    * Check that we have a non-zero CPU usage.  Reset the CPU usage.  Check that
0127    * it was cleared to zero.
0128    */
0129   TimecounterTick();
0130 
0131   cpu_usage_self = _Thread_Get_CPU_time_used( self );
0132   cpu_usage_other = _Thread_Get_CPU_time_used( other );
0133 
0134   T_gt_i64( _Thread_Get_CPU_time_used_after_last_reset( self ), 0 );
0135   T_gt_i64( _Thread_Get_CPU_time_used_after_last_reset( other ), 0 );
0136 
0137   rtems_cpu_usage_reset();
0138 
0139   /*
0140    * Our CPU usage after the last reset is now exactly one tick of the
0141    * software timecounter.
0142    */
0143   T_eq_i64( _Thread_Get_CPU_time_used_after_last_reset( self ), 4295 );
0144   T_eq_i64(
0145     _Thread_Get_CPU_time_used( self ),
0146     cpu_usage_self + 12885 + 4295 * idle_tasks
0147   );
0148 
0149   T_eq_i64( _Thread_Get_CPU_time_used_after_last_reset( other ), 0 );
0150   T_eq_i64( _Thread_Get_CPU_time_used( other ), cpu_usage_other );
0151 
0152   /*
0153    * Clean up all used resources.
0154    */
0155   DeleteTask( id );
0156 }
0157 
0158 /**
0159  * @fn void T_case_body_RtemsCpuuseValCpuuse( void )
0160  */
0161 T_TEST_CASE( RtemsCpuuseValCpuuse )
0162 {
0163   RtemsCpuuseValCpuuse_Action_0();
0164 }
0165 
0166 /** @} */