Color Oled(SSD1331) connect to STMicroelectronics Nucleo-F466

Dependencies:   ssd1331

Committer:
kadonotakashi
Date:
Thu Oct 11 02:27:46 2018 +0000
Revision:
3:f3764f852aa8
Parent:
0:8fdf9a60065b
Nucreo 446 + SSD1331 test version;

Who changed what in which revision?

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