![]() |
|
|||
File indexing completed on 2025-05-11 08:24:52
0001 /* SPDX-License-Identifier: BSD-2-Clause */ 0002 0003 /** 0004 * @file 0005 * 0006 * @ingroup RtemsSchedulerValSmpOnly 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 <limits.h> 0056 #include <rtems.h> 0057 0058 #include "ts-config.h" 0059 #include "tx-support.h" 0060 0061 #include <rtems/test.h> 0062 0063 /** 0064 * @defgroup RtemsSchedulerValSmpOnly spec:/rtems/scheduler/val/smp-only 0065 * 0066 * @ingroup TestsuitesValidationSmpOnly0 0067 * 0068 * @brief This test case collection provides validation test cases for SMP-only 0069 * requirements of the @ref RTEMSAPIClassicScheduler. 0070 * 0071 * This test case performs the following actions: 0072 * 0073 * - Call rtems_scheduler_get_processor() on all online processors and check 0074 * the returned value. 0075 * 0076 * - Call rtems_scheduler_get_processor_maximum() and check the returned value. 0077 * 0078 * - Check that the returned value is greater than or equal to one. 0079 * 0080 * - Check that the returned value is less than or equal to 0081 * rtems_configuration_get_maximum_processors(). 0082 * 0083 * - Call rtems_scheduler_ident() for each configured scheduler. 0084 * 0085 * - Check that the object index of scheduler A has the expected value. 0086 * 0087 * - Check that the object index of scheduler B has the expected value. 0088 * 0089 * - Check that the object index of scheduler C has the expected value. 0090 * 0091 * - Check that the object index of scheduler D has the expected value. 0092 * 0093 * - Check that processor 0 has scheduler A assigned. 0094 * 0095 * - Check that processor 1 has scheduler B assigned. 0096 * 0097 * - Check that scheduler B has the maximum priority of the EDF SMP 0098 * scheduler. 0099 * 0100 * - Check that processor 2 has scheduler C assigned if it is present. 0101 * 0102 * - Check that processor 3 has scheduler C assigned if it is present. 0103 * 0104 * @{ 0105 */ 0106 0107 /** 0108 * @brief Call rtems_scheduler_get_processor() on all online processors and 0109 * check the returned value. 0110 */ 0111 static void RtemsSchedulerValSmpOnly_Action_0( void ) 0112 { 0113 rtems_id scheduler_id; 0114 rtems_task_priority priority; 0115 uint32_t cpu_index; 0116 uint32_t cpu_max; 0117 0118 scheduler_id = GetSelfScheduler(); 0119 priority = GetSelfPriority(); 0120 cpu_max = rtems_scheduler_get_processor_maximum(); 0121 T_step_ge_u32( 0, cpu_max, 1 ); 0122 0123 for ( cpu_index = 0; cpu_index < cpu_max; ++cpu_index ) { 0124 rtems_status_code sc; 0125 rtems_id id; 0126 0127 sc = rtems_scheduler_ident_by_processor( cpu_index, &id ); 0128 T_quiet_rsc_success( sc ); 0129 0130 SetSelfScheduler( id, priority ); 0131 SetSelfAffinityOne( cpu_index ); 0132 0133 T_quiet_eq_u32( rtems_scheduler_get_processor(), cpu_index ); 0134 0135 SetSelfAffinityAll(); 0136 } 0137 0138 SetSelfScheduler( scheduler_id, priority ); 0139 } 0140 0141 /** 0142 * @brief Call rtems_scheduler_get_processor_maximum() and check the returned 0143 * value. 0144 */ 0145 static void RtemsSchedulerValSmpOnly_Action_1( void ) 0146 { 0147 uint32_t cpu_max; 0148 0149 cpu_max = rtems_scheduler_get_processor_maximum(); 0150 0151 /* 0152 * Check that the returned value is greater than or equal to one. 0153 */ 0154 T_step_ge_u32( 1, cpu_max, 1 ); 0155 0156 /* 0157 * Check that the returned value is less than or equal to 0158 * rtems_configuration_get_maximum_processors(). 0159 */ 0160 T_step_le_u32( 0161 2, 0162 cpu_max, 0163 rtems_configuration_get_maximum_processors() 0164 ); 0165 } 0166 0167 /** 0168 * @brief Call rtems_scheduler_ident() for each configured scheduler. 0169 */ 0170 static void RtemsSchedulerValSmpOnly_Action_2( void ) 0171 { 0172 rtems_status_code sc; 0173 rtems_id id[ 4 ]; 0174 rtems_id id_by_cpu; 0175 rtems_task_priority priority; 0176 0177 sc = rtems_scheduler_ident( TEST_SCHEDULER_A_NAME, &id[ 0 ]); 0178 T_step_rsc_success( 3, sc ); 0179 0180 sc = rtems_scheduler_ident( TEST_SCHEDULER_B_NAME, &id[ 1 ]); 0181 T_step_rsc_success( 4, sc ); 0182 0183 sc = rtems_scheduler_ident( TEST_SCHEDULER_C_NAME, &id[ 2 ]); 0184 T_step_rsc_success( 5, sc ); 0185 0186 sc = rtems_scheduler_ident( TEST_SCHEDULER_D_NAME, &id[ 3 ]); 0187 T_step_rsc_success( 6, sc ); 0188 0189 /* 0190 * Check that the object index of scheduler A has the expected value. 0191 */ 0192 T_step_eq_u16( 7, rtems_object_id_get_index( id[ 0 ] ), 1 ); 0193 0194 /* 0195 * Check that the object index of scheduler B has the expected value. 0196 */ 0197 T_step_eq_u16( 8, rtems_object_id_get_index( id[ 1 ] ), 2 ); 0198 0199 /* 0200 * Check that the object index of scheduler C has the expected value. 0201 */ 0202 T_step_eq_u16( 9, rtems_object_id_get_index( id[ 2 ] ), 3 ); 0203 0204 /* 0205 * Check that the object index of scheduler D has the expected value. 0206 */ 0207 T_step_eq_u16( 10, rtems_object_id_get_index( id[ 3 ] ), 4 ); 0208 0209 /* 0210 * Check that processor 0 has scheduler A assigned. 0211 */ 0212 sc = rtems_scheduler_ident_by_processor( 0, &id_by_cpu ); 0213 T_step_rsc_success( 11, sc ); 0214 T_step_eq_u32( 12, id[ 0 ], id_by_cpu ); 0215 0216 /* 0217 * Check that processor 1 has scheduler B assigned. 0218 */ 0219 sc = rtems_scheduler_ident_by_processor( 1, &id_by_cpu ); 0220 T_step_rsc_success( 13, sc ); 0221 T_step_eq_u32( 14, id[ 1 ], id_by_cpu ); 0222 0223 /* 0224 * Check that scheduler B has the maximum priority of the EDF SMP scheduler. 0225 */ 0226 sc = rtems_scheduler_get_maximum_priority( id_by_cpu, &priority ); 0227 T_step_rsc_success( 15, sc ); 0228 T_step_eq_u32( 16, priority, (uint32_t) INT_MAX ); 0229 0230 /* 0231 * Check that processor 2 has scheduler C assigned if it is present. 0232 */ 0233 sc = rtems_scheduler_ident_by_processor( 2, &id_by_cpu ); 0234 T_step_true( 17, sc == RTEMS_INVALID_NAME || id[ 2 ] == id_by_cpu ); 0235 0236 /* 0237 * Check that processor 3 has scheduler C assigned if it is present. 0238 */ 0239 sc = rtems_scheduler_ident_by_processor( 3, &id_by_cpu ); 0240 T_step_true( 18, sc == RTEMS_INVALID_NAME || id[ 2 ] == id_by_cpu ); 0241 } 0242 0243 /** 0244 * @fn void T_case_body_RtemsSchedulerValSmpOnly( void ) 0245 */ 0246 T_TEST_CASE( RtemsSchedulerValSmpOnly ) 0247 { 0248 T_plan( 19 ); 0249 0250 RtemsSchedulerValSmpOnly_Action_0(); 0251 RtemsSchedulerValSmpOnly_Action_1(); 0252 RtemsSchedulerValSmpOnly_Action_2(); 0253 } 0254 0255 /** @} */
[ Source navigation ] | [ Diff markup ] | [ Identifier search ] | [ general search ] |
This page was automatically generated by the 2.3.7 LXR engine. The LXR team |
![]() ![]() |