![]() |
|
|||
File indexing completed on 2025-05-11 08:24:52
0001 /* SPDX-License-Identifier: BSD-2-Clause */ 0002 0003 /** 0004 * @file 0005 * 0006 * @ingroup ScoreThreadValSmpOneCpu 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/score/threadimpl.h> 0056 0057 #include "tx-support.h" 0058 0059 #include <rtems/test.h> 0060 0061 /** 0062 * @defgroup ScoreThreadValSmpOneCpu spec:/score/thread/val/smp-one-cpu 0063 * 0064 * @ingroup TestsuitesValidationSmpOneCpu0 0065 * 0066 * @brief Tests SMP-specific thread behaviour using only one processor and a 0067 * uniprocessor scheduler. 0068 * 0069 * This test case performs the following actions: 0070 * 0071 * - Create one worker thread to validate the thread pinning on only one 0072 * processor using a uniprocessor scheduler. 0073 * 0074 * - Pin the runner thread. Preempt the runner thread. Unpin the runner 0075 * thread. 0076 * 0077 * - Clean up all used resources. 0078 * 0079 * @{ 0080 */ 0081 0082 /** 0083 * @brief Test context for spec:/score/thread/val/smp-one-cpu test case. 0084 */ 0085 typedef struct { 0086 /** 0087 * @brief This member contains the worker thread identifier. 0088 */ 0089 rtems_id worker_id; 0090 0091 /** 0092 * @brief This member contains a counter for EVENT_COUNT. 0093 */ 0094 volatile uint32_t counter; 0095 } ScoreThreadValSmpOneCpu_Context; 0096 0097 static ScoreThreadValSmpOneCpu_Context 0098 ScoreThreadValSmpOneCpu_Instance; 0099 0100 #define EVENT_COUNT RTEMS_EVENT_0 0101 0102 typedef ScoreThreadValSmpOneCpu_Context Context; 0103 0104 static void WorkerTask( rtems_task_argument arg ) 0105 { 0106 Context *ctx; 0107 0108 ctx = (Context *) arg; 0109 0110 while ( true ) { 0111 rtems_event_set events; 0112 0113 events = ReceiveAnyEvents(); 0114 0115 if ( ( events & EVENT_COUNT ) != 0 ) { 0116 ++ctx->counter; 0117 } 0118 } 0119 } 0120 0121 static T_fixture ScoreThreadValSmpOneCpu_Fixture = { 0122 .setup = NULL, 0123 .stop = NULL, 0124 .teardown = NULL, 0125 .scope = NULL, 0126 .initial_context = &ScoreThreadValSmpOneCpu_Instance 0127 }; 0128 0129 /** 0130 * @brief Create one worker thread to validate the thread pinning on only one 0131 * processor using a uniprocessor scheduler. 0132 */ 0133 static void ScoreThreadValSmpOneCpu_Action_0( 0134 ScoreThreadValSmpOneCpu_Context *ctx 0135 ) 0136 { 0137 Per_CPU_Control *cpu_self; 0138 Thread_Control *executing; 0139 0140 executing = _Thread_Get_executing(); 0141 SetSelfPriority( PRIO_NORMAL ); 0142 ctx->counter = 0; 0143 0144 ctx->worker_id = CreateTask( "WORK", PRIO_HIGH ); 0145 StartTask( ctx->worker_id, WorkerTask, ctx ); 0146 0147 /* 0148 * Pin the runner thread. Preempt the runner thread. Unpin the runner 0149 * thread. 0150 */ 0151 _Thread_Pin( executing ); 0152 0153 /* We have to preempt the runner to end up in _Thread_Do_unpin() */ 0154 SendEvents( ctx->worker_id, EVENT_COUNT ); 0155 T_eq_u32( ctx->counter, 1 ); 0156 0157 cpu_self = _Thread_Dispatch_disable(); 0158 _Thread_Unpin( executing, cpu_self ); 0159 _Thread_Dispatch_direct( cpu_self ); 0160 0161 /* 0162 * Clean up all used resources. 0163 */ 0164 DeleteTask( ctx->worker_id ); 0165 RestoreRunnerPriority(); 0166 } 0167 0168 /** 0169 * @fn void T_case_body_ScoreThreadValSmpOneCpu( void ) 0170 */ 0171 T_TEST_CASE_FIXTURE( 0172 ScoreThreadValSmpOneCpu, 0173 &ScoreThreadValSmpOneCpu_Fixture 0174 ) 0175 { 0176 ScoreThreadValSmpOneCpu_Context *ctx; 0177 0178 ctx = T_fixture_context(); 0179 0180 ScoreThreadValSmpOneCpu_Action_0( ctx ); 0181 } 0182 0183 /** @} */
[ Source navigation ] | [ Diff markup ] | [ Identifier search ] | [ general search ] |
This page was automatically generated by the 2.3.7 LXR engine. The LXR team |
![]() ![]() |