PES4 / Mbed OS Queue_02
Committer:
demayer
Date:
Sat Apr 11 08:15:48 2020 +0000
Revision:
1:b36bbc1c6d27
Parent:
0:6bf0743ece18
IMU-library in .h und .cpp file aufgeteilt

Who changed what in which revision?

UserRevisionLine numberNew contents of line
demayer 0:6bf0743ece18 1 /* mbed Microcontroller Library
demayer 0:6bf0743ece18 2 * Copyright (c) 2017 ARM Limited
demayer 0:6bf0743ece18 3 *
demayer 0:6bf0743ece18 4 * Licensed under the Apache License, Version 2.0 (the "License");
demayer 0:6bf0743ece18 5 * you may not use this file except in compliance with the License.
demayer 0:6bf0743ece18 6 * You may obtain a copy of the License at
demayer 0:6bf0743ece18 7 *
demayer 0:6bf0743ece18 8 * http://www.apache.org/licenses/LICENSE-2.0
demayer 0:6bf0743ece18 9 *
demayer 0:6bf0743ece18 10 * Unless required by applicable law or agreed to in writing, software
demayer 0:6bf0743ece18 11 * distributed under the License is distributed on an "AS IS" BASIS,
demayer 0:6bf0743ece18 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
demayer 0:6bf0743ece18 13 * See the License for the specific language governing permissions and
demayer 0:6bf0743ece18 14 * limitations under the License.
demayer 0:6bf0743ece18 15 */
demayer 0:6bf0743ece18 16 #include "mbed.h"
demayer 0:6bf0743ece18 17 #include "greentea-client/test_env.h"
demayer 0:6bf0743ece18 18 #include "utest/utest.h"
demayer 0:6bf0743ece18 19 #include "unity/unity.h"
demayer 0:6bf0743ece18 20
demayer 0:6bf0743ece18 21 using utest::v1::Case;
demayer 0:6bf0743ece18 22
demayer 0:6bf0743ece18 23
demayer 0:6bf0743ece18 24 #if defined(MBED_RTOS_SINGLE_THREAD)
demayer 0:6bf0743ece18 25 #error [NOT_SUPPORTED] test not supported
demayer 0:6bf0743ece18 26 #endif
demayer 0:6bf0743ece18 27
demayer 0:6bf0743ece18 28 #define TEST_STACK_SIZE 512
demayer 0:6bf0743ece18 29 #define MAX_FLAG_POS 30
demayer 0:6bf0743ece18 30
demayer 0:6bf0743ece18 31 #define ALL_SIGNALS 0x7fffffff
demayer 0:6bf0743ece18 32 #define NO_SIGNALS 0x0
demayer 0:6bf0743ece18 33 #define PROHIBITED_SIGNAL 0x80000000
demayer 0:6bf0743ece18 34 #define SIGNAL1 0x1
demayer 0:6bf0743ece18 35 #define SIGNAL2 0x2
demayer 0:6bf0743ece18 36 #define SIGNAL3 0x4
demayer 0:6bf0743ece18 37
demayer 0:6bf0743ece18 38 struct Sync {
demayer 0:6bf0743ece18 39 Sync(Semaphore &parent, Semaphore &child): sem_parent(parent), sem_child(child)
demayer 0:6bf0743ece18 40 {}
demayer 0:6bf0743ece18 41
demayer 0:6bf0743ece18 42 Semaphore &sem_parent;
demayer 0:6bf0743ece18 43 Semaphore &sem_child;
demayer 0:6bf0743ece18 44 };
demayer 0:6bf0743ece18 45
demayer 0:6bf0743ece18 46
demayer 0:6bf0743ece18 47 /* In order to successfully run this test suite when compiled with --profile=debug
demayer 0:6bf0743ece18 48 * error() has to be redefined as noop.
demayer 0:6bf0743ece18 49 *
demayer 0:6bf0743ece18 50 * ThreadFlags calls RTX API which uses Event Recorder functionality. When compiled
demayer 0:6bf0743ece18 51 * with MBED_TRAP_ERRORS_ENABLED=1 (set in debug profile) EvrRtxEventFlagsError() calls error()
demayer 0:6bf0743ece18 52 * which aborts test program.
demayer 0:6bf0743ece18 53 */
demayer 0:6bf0743ece18 54 #if defined(MBED_TRAP_ERRORS_ENABLED) && MBED_TRAP_ERRORS_ENABLED
demayer 0:6bf0743ece18 55 void error(const char* format, ...) {
demayer 0:6bf0743ece18 56 (void) format;
demayer 0:6bf0743ece18 57 }
demayer 0:6bf0743ece18 58 #endif
demayer 0:6bf0743ece18 59
demayer 0:6bf0743ece18 60
demayer 0:6bf0743ece18 61 template <int32_t signals, uint32_t timeout, int32_t test_val>
demayer 0:6bf0743ece18 62 void run_signal_wait(void)
demayer 0:6bf0743ece18 63 {
demayer 0:6bf0743ece18 64 osEvent ev = Thread::signal_wait(signals, timeout);
demayer 0:6bf0743ece18 65 TEST_ASSERT_EQUAL(test_val, ev.status);
demayer 0:6bf0743ece18 66 }
demayer 0:6bf0743ece18 67
demayer 0:6bf0743ece18 68 template <int32_t signals, uint32_t timeout, int32_t test_val>
demayer 0:6bf0743ece18 69 void run_release_signal_wait(Semaphore *sem)
demayer 0:6bf0743ece18 70 {
demayer 0:6bf0743ece18 71 sem->release();
demayer 0:6bf0743ece18 72 osEvent ev = Thread::signal_wait(signals, timeout);
demayer 0:6bf0743ece18 73 TEST_ASSERT_EQUAL(test_val, ev.status);
demayer 0:6bf0743ece18 74 }
demayer 0:6bf0743ece18 75
demayer 0:6bf0743ece18 76 template <int32_t signals, uint32_t timeout, int32_t test_val>
demayer 0:6bf0743ece18 77 void run_release_wait_signal_wait(Sync *sync)
demayer 0:6bf0743ece18 78 {
demayer 0:6bf0743ece18 79 sync->sem_parent.release();
demayer 0:6bf0743ece18 80 sync->sem_child.wait();
demayer 0:6bf0743ece18 81 osEvent ev = Thread::signal_wait(signals, timeout);
demayer 0:6bf0743ece18 82 TEST_ASSERT_EQUAL(test_val, ev.status);
demayer 0:6bf0743ece18 83 }
demayer 0:6bf0743ece18 84
demayer 0:6bf0743ece18 85 template <int32_t signals, int32_t test_val>
demayer 0:6bf0743ece18 86 void run_clear(void)
demayer 0:6bf0743ece18 87 {
demayer 0:6bf0743ece18 88 int32_t ret = Thread::signal_clr(signals);
demayer 0:6bf0743ece18 89 TEST_ASSERT_EQUAL(test_val, ret);
demayer 0:6bf0743ece18 90 }
demayer 0:6bf0743ece18 91
demayer 0:6bf0743ece18 92 template <int32_t signals, int32_t test_val>
demayer 0:6bf0743ece18 93 void run_wait_clear(Sync *sync)
demayer 0:6bf0743ece18 94 {
demayer 0:6bf0743ece18 95 sync->sem_parent.release();
demayer 0:6bf0743ece18 96 sync->sem_child.wait();
demayer 0:6bf0743ece18 97 int32_t ret = Thread::signal_clr(signals);
demayer 0:6bf0743ece18 98 TEST_ASSERT_EQUAL(test_val, ret);
demayer 0:6bf0743ece18 99 }
demayer 0:6bf0743ece18 100
demayer 0:6bf0743ece18 101 template <int32_t signals1, int32_t signals2, int32_t test_val1, int32_t test_val2>
demayer 0:6bf0743ece18 102 void run_double_wait_clear(Sync *sync)
demayer 0:6bf0743ece18 103 {
demayer 0:6bf0743ece18 104 int32_t ret;
demayer 0:6bf0743ece18 105
demayer 0:6bf0743ece18 106 sync->sem_parent.release();
demayer 0:6bf0743ece18 107 sync->sem_child.wait();
demayer 0:6bf0743ece18 108 ret = Thread::signal_clr(signals1);
demayer 0:6bf0743ece18 109 TEST_ASSERT_EQUAL(test_val1, ret);
demayer 0:6bf0743ece18 110
demayer 0:6bf0743ece18 111 ret = Thread::signal_clr(signals2);
demayer 0:6bf0743ece18 112 TEST_ASSERT_EQUAL(test_val2, ret);
demayer 0:6bf0743ece18 113 }
demayer 0:6bf0743ece18 114
demayer 0:6bf0743ece18 115 void run_loop_wait_clear(Sync *sync)
demayer 0:6bf0743ece18 116 {
demayer 0:6bf0743ece18 117 int32_t signals = NO_SIGNALS;
demayer 0:6bf0743ece18 118 for (int i = 0; i <= MAX_FLAG_POS; i++) {
demayer 0:6bf0743ece18 119 int32_t signal = 1 << i;
demayer 0:6bf0743ece18 120 signals |= signal;
demayer 0:6bf0743ece18 121 sync->sem_child.wait();
demayer 0:6bf0743ece18 122 int32_t ret = Thread::signal_clr(NO_SIGNALS);
demayer 0:6bf0743ece18 123 TEST_ASSERT_EQUAL(signals, ret);
demayer 0:6bf0743ece18 124 sync->sem_parent.release();
demayer 0:6bf0743ece18 125 }
demayer 0:6bf0743ece18 126 }
demayer 0:6bf0743ece18 127
demayer 0:6bf0743ece18 128
demayer 0:6bf0743ece18 129 /** Validate that call signal_clr(NO_SIGNALS) doesn't change thread signals and return actual signals
demayer 0:6bf0743ece18 130
demayer 0:6bf0743ece18 131 Given two threads A & B are started, B with all signals already set
demayer 0:6bf0743ece18 132 When thread B calls @a signal_clr(NO_SIGNALS)
demayer 0:6bf0743ece18 133 Then thread B @a signal_clr status should be ALL_SIGNALS indicating that thread B state is unchanged
demayer 0:6bf0743ece18 134 */
demayer 0:6bf0743ece18 135 void test_clear_no_signals(void)
demayer 0:6bf0743ece18 136 {
demayer 0:6bf0743ece18 137 Semaphore sem_parent(0, 1);
demayer 0:6bf0743ece18 138 Semaphore sem_child(0, 1);
demayer 0:6bf0743ece18 139 Sync sync(sem_parent, sem_child);
demayer 0:6bf0743ece18 140
demayer 0:6bf0743ece18 141 Thread t(osPriorityNormal, TEST_STACK_SIZE);
demayer 0:6bf0743ece18 142 t.start(callback(run_double_wait_clear<NO_SIGNALS, NO_SIGNALS, ALL_SIGNALS, ALL_SIGNALS>, &sync));
demayer 0:6bf0743ece18 143 sem_parent.wait();
demayer 0:6bf0743ece18 144 t.signal_set(ALL_SIGNALS);
demayer 0:6bf0743ece18 145 sem_child.release();
demayer 0:6bf0743ece18 146 t.join();
demayer 0:6bf0743ece18 147 }
demayer 0:6bf0743ece18 148
demayer 0:6bf0743ece18 149 /** Validate if any signals are set on just created thread
demayer 0:6bf0743ece18 150
demayer 0:6bf0743ece18 151 Given the thread is running
demayer 0:6bf0743ece18 152 When thread execute @a signal_clr(NO_SIGNALS)
demayer 0:6bf0743ece18 153 Then thread @a signal_clr return status should be NO_SIGNALS(0) indicating no signals set
demayer 0:6bf0743ece18 154 */
demayer 0:6bf0743ece18 155 void test_init_state(void)
demayer 0:6bf0743ece18 156 {
demayer 0:6bf0743ece18 157 Thread t(osPriorityNormal, TEST_STACK_SIZE);
demayer 0:6bf0743ece18 158 t.start(callback(run_clear<NO_SIGNALS, NO_SIGNALS>));
demayer 0:6bf0743ece18 159 t.join();
demayer 0:6bf0743ece18 160 }
demayer 0:6bf0743ece18 161
demayer 0:6bf0743ece18 162 /** Validate all signals set in one shot
demayer 0:6bf0743ece18 163
demayer 0:6bf0743ece18 164 Given two threads A & B are started
demayer 0:6bf0743ece18 165 When thread A call @a signal_set(ALL_SIGNALS) with all possible signals
demayer 0:6bf0743ece18 166 Then thread B @a signal_clr(NO_SIGNALS) status should be ALL_SIGNALS indicating all signals set correctly
demayer 0:6bf0743ece18 167 */
demayer 0:6bf0743ece18 168 void test_set_all(void)
demayer 0:6bf0743ece18 169 {
demayer 0:6bf0743ece18 170 int32_t ret;
demayer 0:6bf0743ece18 171 Semaphore sem_parent(0, 1);
demayer 0:6bf0743ece18 172 Semaphore sem_child(0, 1);
demayer 0:6bf0743ece18 173 Sync sync(sem_parent, sem_child);
demayer 0:6bf0743ece18 174
demayer 0:6bf0743ece18 175 Thread t(osPriorityNormal, TEST_STACK_SIZE);
demayer 0:6bf0743ece18 176 t.start(callback(run_wait_clear<NO_SIGNALS, ALL_SIGNALS>, &sync));
demayer 0:6bf0743ece18 177
demayer 0:6bf0743ece18 178 sem_parent.wait();
demayer 0:6bf0743ece18 179 ret = t.signal_set(ALL_SIGNALS);
demayer 0:6bf0743ece18 180 TEST_ASSERT_EQUAL(ALL_SIGNALS, ret);
demayer 0:6bf0743ece18 181
demayer 0:6bf0743ece18 182 sem_child.release();
demayer 0:6bf0743ece18 183 t.join();
demayer 0:6bf0743ece18 184 }
demayer 0:6bf0743ece18 185
demayer 0:6bf0743ece18 186 /** Validate that call signal_set with prohibited signal doesn't change thread signals
demayer 0:6bf0743ece18 187
demayer 0:6bf0743ece18 188 Given two threads A & B are started, B with all signals set
demayer 0:6bf0743ece18 189 When thread A executes @a signal_set(PROHIBITED_SIGNAL) with prohibited signal
demayer 0:6bf0743ece18 190 Then thread B @a signal_clr(NO_SIGNALS) status should be ALL_SIGNALS indicating that thread B signals are unchanged
demayer 0:6bf0743ece18 191
demayer 0:6bf0743ece18 192 @note Each signal has up to 31 event flags 0x1, 0x2, 0x4, 0x8, ..., 0x40000000
demayer 0:6bf0743ece18 193 Most significant bit is reserved and thereby flag 0x80000000 is prohibited
demayer 0:6bf0743ece18 194 */
demayer 0:6bf0743ece18 195 void test_set_prohibited(void)
demayer 0:6bf0743ece18 196 {
demayer 0:6bf0743ece18 197 int32_t ret;
demayer 0:6bf0743ece18 198 Semaphore sem_parent(0, 1);
demayer 0:6bf0743ece18 199 Semaphore sem_child(0, 1);
demayer 0:6bf0743ece18 200 Sync sync(sem_parent, sem_child);
demayer 0:6bf0743ece18 201
demayer 0:6bf0743ece18 202 Thread t(osPriorityNormal, TEST_STACK_SIZE);
demayer 0:6bf0743ece18 203 t.start(callback(run_wait_clear<NO_SIGNALS, ALL_SIGNALS>, &sync));
demayer 0:6bf0743ece18 204
demayer 0:6bf0743ece18 205 sem_parent.wait();
demayer 0:6bf0743ece18 206 t.signal_set(ALL_SIGNALS);
demayer 0:6bf0743ece18 207
demayer 0:6bf0743ece18 208 ret = t.signal_set(PROHIBITED_SIGNAL);
demayer 0:6bf0743ece18 209 TEST_ASSERT_EQUAL(osErrorParameter, ret);
demayer 0:6bf0743ece18 210
demayer 0:6bf0743ece18 211 sem_child.release();
demayer 0:6bf0743ece18 212 t.join();
demayer 0:6bf0743ece18 213 }
demayer 0:6bf0743ece18 214
demayer 0:6bf0743ece18 215 /** Validate all signals clear in one shot
demayer 0:6bf0743ece18 216
demayer 0:6bf0743ece18 217 Given two threads A & B are started, B with all signals set
demayer 0:6bf0743ece18 218 When thread B execute @a signal_clr(ALL_SIGNALS) with all possible signals
demayer 0:6bf0743ece18 219 Then thread B @a signal_clr(NO_SIGNALS) status should be NO_SIGNALS(0) indicating all signals cleared correctly
demayer 0:6bf0743ece18 220 */
demayer 0:6bf0743ece18 221 void test_clear_all(void)
demayer 0:6bf0743ece18 222 {
demayer 0:6bf0743ece18 223 Semaphore sem_parent(0, 1);
demayer 0:6bf0743ece18 224 Semaphore sem_child(0, 1);
demayer 0:6bf0743ece18 225 Sync sync(sem_parent, sem_child);
demayer 0:6bf0743ece18 226
demayer 0:6bf0743ece18 227 Thread t(osPriorityNormal, TEST_STACK_SIZE);
demayer 0:6bf0743ece18 228 t.start(callback(run_double_wait_clear<ALL_SIGNALS, NO_SIGNALS, ALL_SIGNALS, NO_SIGNALS>, &sync));
demayer 0:6bf0743ece18 229 sem_parent.wait();
demayer 0:6bf0743ece18 230 t.signal_set(ALL_SIGNALS);
demayer 0:6bf0743ece18 231 sem_child.release();
demayer 0:6bf0743ece18 232 t.join();
demayer 0:6bf0743ece18 233 }
demayer 0:6bf0743ece18 234
demayer 0:6bf0743ece18 235 /** Validate all signals set one by one in loop
demayer 0:6bf0743ece18 236
demayer 0:6bf0743ece18 237 Given two threads A & B are started
demayer 0:6bf0743ece18 238 When thread A executes @a signal_set(signal) in loop with all possible signals
demayer 0:6bf0743ece18 239 */
demayer 0:6bf0743ece18 240 void test_set_all_loop(void)
demayer 0:6bf0743ece18 241 {
demayer 0:6bf0743ece18 242 int32_t ret;
demayer 0:6bf0743ece18 243 Semaphore sem_parent(0, 1);
demayer 0:6bf0743ece18 244 Semaphore sem_child(0, 1);
demayer 0:6bf0743ece18 245 Sync sync(sem_parent, sem_child);
demayer 0:6bf0743ece18 246
demayer 0:6bf0743ece18 247 Thread t(osPriorityNormal, TEST_STACK_SIZE);
demayer 0:6bf0743ece18 248 t.start(callback(run_loop_wait_clear, &sync));
demayer 0:6bf0743ece18 249
demayer 0:6bf0743ece18 250 int32_t signals = 0;
demayer 0:6bf0743ece18 251 for (int i = 0; i <= MAX_FLAG_POS; i++) {
demayer 0:6bf0743ece18 252 int32_t signal = 1 << i;
demayer 0:6bf0743ece18 253
demayer 0:6bf0743ece18 254 ret = t.signal_set(signal);
demayer 0:6bf0743ece18 255 signals |= signal;
demayer 0:6bf0743ece18 256 TEST_ASSERT_EQUAL(signals, ret);
demayer 0:6bf0743ece18 257 sem_child.release();
demayer 0:6bf0743ece18 258 sem_parent.wait();
demayer 0:6bf0743ece18 259 }
demayer 0:6bf0743ece18 260 t.join();
demayer 0:6bf0743ece18 261 }
demayer 0:6bf0743ece18 262
demayer 0:6bf0743ece18 263 /** Validate signal_wait return status if timeout specified
demayer 0:6bf0743ece18 264
demayer 0:6bf0743ece18 265 Given the thread is running
demayer 0:6bf0743ece18 266 When thread executes @a signal_wait(signals, timeout) with specified signals and timeout
demayer 0:6bf0743ece18 267 Then thread @a signal_wait status should be osEventTimeout indicating a timeout
demayer 0:6bf0743ece18 268 thread @a signal_wait status should be osOK indicating 0[ms] timeout set
demayer 0:6bf0743ece18 269 */
demayer 0:6bf0743ece18 270 template <int32_t signals, uint32_t timeout, int32_t status>
demayer 0:6bf0743ece18 271 void test_wait_timeout(void)
demayer 0:6bf0743ece18 272 {
demayer 0:6bf0743ece18 273 Thread t(osPriorityNormal, TEST_STACK_SIZE);
demayer 0:6bf0743ece18 274 t.start(callback(run_signal_wait<signals, timeout, status>));
demayer 0:6bf0743ece18 275 t.join();
demayer 0:6bf0743ece18 276 }
demayer 0:6bf0743ece18 277
demayer 0:6bf0743ece18 278 /** Validate that call of signal_wait return correctly when thread has all signals already set
demayer 0:6bf0743ece18 279
demayer 0:6bf0743ece18 280 Given two threads A & B are started, B with all signals already set
demayer 0:6bf0743ece18 281 When thread B executes @a signal_wait(ALL_SIGNALS, osWaitForever),
demayer 0:6bf0743ece18 282 Then thread B @a signal_wait return immediately with status osEventSignal indicating all wait signals was already set
demayer 0:6bf0743ece18 283 */
demayer 0:6bf0743ece18 284 void test_wait_all_already_set(void)
demayer 0:6bf0743ece18 285 {
demayer 0:6bf0743ece18 286 Semaphore sem_parent(0, 1);
demayer 0:6bf0743ece18 287 Semaphore sem_child(0, 1);
demayer 0:6bf0743ece18 288 Sync sync(sem_parent, sem_child);
demayer 0:6bf0743ece18 289
demayer 0:6bf0743ece18 290 Thread t(osPriorityNormal, TEST_STACK_SIZE);
demayer 0:6bf0743ece18 291 t.start(callback(run_release_wait_signal_wait<ALL_SIGNALS, osWaitForever, osEventSignal>, &sync));
demayer 0:6bf0743ece18 292
demayer 0:6bf0743ece18 293 sem_parent.wait();
demayer 0:6bf0743ece18 294 TEST_ASSERT_EQUAL(Thread::WaitingSemaphore, t.get_state());
demayer 0:6bf0743ece18 295 t.signal_set(ALL_SIGNALS);
demayer 0:6bf0743ece18 296 sem_child.release();
demayer 0:6bf0743ece18 297 t.join();
demayer 0:6bf0743ece18 298 }
demayer 0:6bf0743ece18 299
demayer 0:6bf0743ece18 300 /** Validate if signal_wait return correctly when all signals set
demayer 0:6bf0743ece18 301
demayer 0:6bf0743ece18 302 Given two threads A & B are started and B waiting for a thread flag to be set
demayer 0:6bf0743ece18 303 When thread A executes @a signal_set(ALL_SIGNALS) with all possible signals
demayer 0:6bf0743ece18 304 Then thread B @a signal_wait status is osEventSignal indicating all wait signals was set
demayer 0:6bf0743ece18 305 */
demayer 0:6bf0743ece18 306 void test_wait_all(void)
demayer 0:6bf0743ece18 307 {
demayer 0:6bf0743ece18 308 Semaphore sem(0, 1);
demayer 0:6bf0743ece18 309
demayer 0:6bf0743ece18 310 Thread t(osPriorityNormal, TEST_STACK_SIZE);
demayer 0:6bf0743ece18 311 t.start(callback(run_release_signal_wait<ALL_SIGNALS, osWaitForever, osEventSignal>, &sem));
demayer 0:6bf0743ece18 312
demayer 0:6bf0743ece18 313 sem.wait();
demayer 0:6bf0743ece18 314 TEST_ASSERT_EQUAL(Thread::WaitingThreadFlag, t.get_state());
demayer 0:6bf0743ece18 315
demayer 0:6bf0743ece18 316 t.signal_set(ALL_SIGNALS);
demayer 0:6bf0743ece18 317 t.join();
demayer 0:6bf0743ece18 318 }
demayer 0:6bf0743ece18 319
demayer 0:6bf0743ece18 320 /** Validate if signal_wait accumulate signals and return correctly when all signals set
demayer 0:6bf0743ece18 321
demayer 0:6bf0743ece18 322 Given two threads A & B are started and B waiting for a thread signals to be set
demayer 0:6bf0743ece18 323 When thread A executes @a signal_set setting all signals in loop
demayer 0:6bf0743ece18 324 Then thread B @a signal_wait status is osEventSignal indicating that all wait signals was set
demayer 0:6bf0743ece18 325 */
demayer 0:6bf0743ece18 326 void test_wait_all_loop(void)
demayer 0:6bf0743ece18 327 {
demayer 0:6bf0743ece18 328 int32_t ret;
demayer 0:6bf0743ece18 329 Semaphore sem(0, 1);
demayer 0:6bf0743ece18 330
demayer 0:6bf0743ece18 331 Thread t(osPriorityNormal, TEST_STACK_SIZE);
demayer 0:6bf0743ece18 332 t.start(callback(run_release_signal_wait<ALL_SIGNALS, osWaitForever, osEventSignal>, &sem));
demayer 0:6bf0743ece18 333
demayer 0:6bf0743ece18 334 sem.wait();
demayer 0:6bf0743ece18 335 TEST_ASSERT_EQUAL(Thread::WaitingThreadFlag, t.get_state());
demayer 0:6bf0743ece18 336
demayer 0:6bf0743ece18 337 for (int i = 0; i < MAX_FLAG_POS; i++) {
demayer 0:6bf0743ece18 338 int32_t signal = 1 << i;
demayer 0:6bf0743ece18 339 ret = t.signal_set(signal);
demayer 0:6bf0743ece18 340 }
demayer 0:6bf0743ece18 341 ret = t.signal_set(1 << MAX_FLAG_POS);
demayer 0:6bf0743ece18 342 TEST_ASSERT_EQUAL(NO_SIGNALS, ret);
demayer 0:6bf0743ece18 343 t.join();
demayer 0:6bf0743ece18 344 }
demayer 0:6bf0743ece18 345
demayer 0:6bf0743ece18 346 /** Validate if setting same signal twice cause any unwanted behaviour
demayer 0:6bf0743ece18 347
demayer 0:6bf0743ece18 348 Given two threads A & B are started and B waiting for a thread signals to be set
demayer 0:6bf0743ece18 349 When thread A executes @a signal_set twice for the same signal
demayer 0:6bf0743ece18 350 Then thread A @a signal_set status is current signal set
demayer 0:6bf0743ece18 351 thread B @a signal_wait status is osEventSignal indicating that all wait signals was set
demayer 0:6bf0743ece18 352 */
demayer 0:6bf0743ece18 353 void test_set_double(void)
demayer 0:6bf0743ece18 354 {
demayer 0:6bf0743ece18 355 int32_t ret;
demayer 0:6bf0743ece18 356 Semaphore sem(0, 1);
demayer 0:6bf0743ece18 357
demayer 0:6bf0743ece18 358 Thread t(osPriorityNormal, TEST_STACK_SIZE);
demayer 0:6bf0743ece18 359 t.start(callback(run_release_signal_wait<SIGNAL1|SIGNAL2|SIGNAL3, osWaitForever, osEventSignal>, &sem));
demayer 0:6bf0743ece18 360
demayer 0:6bf0743ece18 361 sem.wait();
demayer 0:6bf0743ece18 362 TEST_ASSERT_EQUAL(Thread::WaitingThreadFlag, t.get_state());
demayer 0:6bf0743ece18 363
demayer 0:6bf0743ece18 364 ret = t.signal_set(SIGNAL1);
demayer 0:6bf0743ece18 365 TEST_ASSERT_EQUAL(SIGNAL1, ret);
demayer 0:6bf0743ece18 366
demayer 0:6bf0743ece18 367 ret = t.signal_set(SIGNAL2);
demayer 0:6bf0743ece18 368 TEST_ASSERT_EQUAL(SIGNAL1 | SIGNAL2, ret);
demayer 0:6bf0743ece18 369
demayer 0:6bf0743ece18 370 ret = t.signal_set(SIGNAL2);
demayer 0:6bf0743ece18 371 TEST_ASSERT_EQUAL(SIGNAL1 | SIGNAL2, ret);
demayer 0:6bf0743ece18 372 TEST_ASSERT_EQUAL(Thread::WaitingThreadFlag, t.get_state());
demayer 0:6bf0743ece18 373
demayer 0:6bf0743ece18 374 ret = t.signal_set(SIGNAL3);
demayer 0:6bf0743ece18 375 TEST_ASSERT_EQUAL(NO_SIGNALS, ret);
demayer 0:6bf0743ece18 376 t.join();
demayer 0:6bf0743ece18 377 }
demayer 0:6bf0743ece18 378
demayer 0:6bf0743ece18 379
demayer 0:6bf0743ece18 380 utest::v1::status_t test_setup(const size_t number_of_cases)
demayer 0:6bf0743ece18 381 {
demayer 0:6bf0743ece18 382 GREENTEA_SETUP(10, "default_auto");
demayer 0:6bf0743ece18 383 return utest::v1::verbose_test_setup_handler(number_of_cases);
demayer 0:6bf0743ece18 384 }
demayer 0:6bf0743ece18 385
demayer 0:6bf0743ece18 386 Case cases[] = {
demayer 0:6bf0743ece18 387 Case("Validate that call signal_clr(NO_SIGNALS) doesn't change thread signals and return actual signals", test_clear_no_signals),
demayer 0:6bf0743ece18 388 Case("Validate if any signals are set on just created thread", test_init_state),
demayer 0:6bf0743ece18 389 Case("Validate all signals set in one shot", test_set_all),
demayer 0:6bf0743ece18 390 Case("Validate that call signal_set with prohibited signal doesn't change thread signals", test_set_prohibited),
demayer 0:6bf0743ece18 391 Case("Validate all signals clear in one shot", test_clear_all),
demayer 0:6bf0743ece18 392 Case("Validate all signals set one by one in loop", test_set_all_loop),
demayer 0:6bf0743ece18 393 Case("Validate signal_wait return status if timeout specified: 0[ms] no signals", test_wait_timeout<0, 0, osOK>),
demayer 0:6bf0743ece18 394 Case("Validate signal_wait return status if timeout specified: 0[ms] all signals", test_wait_timeout<ALL_SIGNALS, 0, osOK>),
demayer 0:6bf0743ece18 395 Case("Validate signal_wait return status if timeout specified: 1[ms] no signals", test_wait_timeout<0, 1, osEventTimeout>),
demayer 0:6bf0743ece18 396 Case("Validate signal_wait return status if timeout specified: 1[ms] all signals", test_wait_timeout<ALL_SIGNALS, 1, osEventTimeout>),
demayer 0:6bf0743ece18 397 Case("Validate that call of signal_wait return correctly when thread has all signals already set", test_wait_all_already_set),
demayer 0:6bf0743ece18 398 Case("Validate if signal_wait return correctly when all signals set", test_wait_all),
demayer 0:6bf0743ece18 399 Case("Validate if signal_wait accumulate signals and return correctly when all signals set", test_wait_all_loop),
demayer 0:6bf0743ece18 400 Case("Validate if setting same signal twice cause any unwanted behaviour", test_set_double)
demayer 0:6bf0743ece18 401 };
demayer 0:6bf0743ece18 402
demayer 0:6bf0743ece18 403 utest::v1::Specification specification(test_setup, cases);
demayer 0:6bf0743ece18 404
demayer 0:6bf0743ece18 405 int main()
demayer 0:6bf0743ece18 406 {
demayer 0:6bf0743ece18 407 return !utest::v1::Harness::run(specification);
demayer 0:6bf0743ece18 408 }