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 "unity.h"
kadonotakashi 0:8fdf9a60065b 19 #include "utest.h"
kadonotakashi 0:8fdf9a60065b 20 #include "rtos.h"
kadonotakashi 0:8fdf9a60065b 21 #include "SynchronizedIntegral.h"
kadonotakashi 0:8fdf9a60065b 22 #include "LockGuard.h"
kadonotakashi 0:8fdf9a60065b 23
kadonotakashi 0:8fdf9a60065b 24 #if defined(MBED_RTOS_SINGLE_THREAD)
kadonotakashi 0:8fdf9a60065b 25 #error [NOT_SUPPORTED] test not supported
kadonotakashi 0:8fdf9a60065b 26 #endif
kadonotakashi 0:8fdf9a60065b 27
kadonotakashi 0:8fdf9a60065b 28 #if !DEVICE_USTICKER
kadonotakashi 0:8fdf9a60065b 29 #error [NOT_SUPPORTED] test not supported
kadonotakashi 0:8fdf9a60065b 30 #endif
kadonotakashi 0:8fdf9a60065b 31
kadonotakashi 0:8fdf9a60065b 32 #define THREAD_STACK_SIZE 512
kadonotakashi 0:8fdf9a60065b 33 #if defined(__CORTEX_A9)
kadonotakashi 0:8fdf9a60065b 34 #define PARALLEL_THREAD_STACK_SIZE 512
kadonotakashi 0:8fdf9a60065b 35 #elif defined(__CORTEX_M23) || defined(__CORTEX_M33)
kadonotakashi 0:8fdf9a60065b 36 #define PARALLEL_THREAD_STACK_SIZE 512
kadonotakashi 0:8fdf9a60065b 37 #elif defined(__ARM_FM)
kadonotakashi 0:8fdf9a60065b 38 #define PARALLEL_THREAD_STACK_SIZE 512
kadonotakashi 0:8fdf9a60065b 39 #else
kadonotakashi 0:8fdf9a60065b 40 #define PARALLEL_THREAD_STACK_SIZE 384
kadonotakashi 0:8fdf9a60065b 41 #endif
kadonotakashi 0:8fdf9a60065b 42 #define CHILD_THREAD_STACK_SIZE 384
kadonotakashi 0:8fdf9a60065b 43
kadonotakashi 0:8fdf9a60065b 44 using namespace utest::v1;
kadonotakashi 0:8fdf9a60065b 45
kadonotakashi 0:8fdf9a60065b 46 // The counter type used accross all the tests
kadonotakashi 0:8fdf9a60065b 47 // It is internall ysynchronized so read
kadonotakashi 0:8fdf9a60065b 48 typedef SynchronizedIntegral<int> counter_t;
kadonotakashi 0:8fdf9a60065b 49
kadonotakashi 0:8fdf9a60065b 50 template<osPriority P, uint32_t S>
kadonotakashi 0:8fdf9a60065b 51 class ParallelThread : public Thread {
kadonotakashi 0:8fdf9a60065b 52 public:
kadonotakashi 0:8fdf9a60065b 53 ParallelThread() : Thread(P, S) { }
kadonotakashi 0:8fdf9a60065b 54 };
kadonotakashi 0:8fdf9a60065b 55
kadonotakashi 0:8fdf9a60065b 56 // Tasks with different functions to test on threads
kadonotakashi 0:8fdf9a60065b 57 void increment(counter_t *counter)
kadonotakashi 0:8fdf9a60065b 58 {
kadonotakashi 0:8fdf9a60065b 59 (*counter)++;
kadonotakashi 0:8fdf9a60065b 60 }
kadonotakashi 0:8fdf9a60065b 61
kadonotakashi 0:8fdf9a60065b 62 void increment_with_yield(counter_t *counter)
kadonotakashi 0:8fdf9a60065b 63 {
kadonotakashi 0:8fdf9a60065b 64 ThisThread::yield();
kadonotakashi 0:8fdf9a60065b 65 (*counter)++;
kadonotakashi 0:8fdf9a60065b 66 }
kadonotakashi 0:8fdf9a60065b 67
kadonotakashi 0:8fdf9a60065b 68 void increment_with_wait(counter_t *counter)
kadonotakashi 0:8fdf9a60065b 69 {
kadonotakashi 0:8fdf9a60065b 70 ThisThread::sleep_for(100);
kadonotakashi 0:8fdf9a60065b 71 (*counter)++;
kadonotakashi 0:8fdf9a60065b 72 }
kadonotakashi 0:8fdf9a60065b 73
kadonotakashi 0:8fdf9a60065b 74 void increment_with_child(counter_t *counter)
kadonotakashi 0:8fdf9a60065b 75 {
kadonotakashi 0:8fdf9a60065b 76 Thread *child = new (std::nothrow) Thread(osPriorityNormal, CHILD_THREAD_STACK_SIZE);
kadonotakashi 0:8fdf9a60065b 77 char *dummy = new (std::nothrow) char[CHILD_THREAD_STACK_SIZE];
kadonotakashi 0:8fdf9a60065b 78 delete[] dummy;
kadonotakashi 0:8fdf9a60065b 79
kadonotakashi 0:8fdf9a60065b 80 // Don't fail test due to lack of memory. Call function directly instead
kadonotakashi 0:8fdf9a60065b 81 if (!child || !dummy) {
kadonotakashi 0:8fdf9a60065b 82 increment(counter);
kadonotakashi 0:8fdf9a60065b 83 delete child;
kadonotakashi 0:8fdf9a60065b 84 return;
kadonotakashi 0:8fdf9a60065b 85 }
kadonotakashi 0:8fdf9a60065b 86 child->start(callback(increment, counter));
kadonotakashi 0:8fdf9a60065b 87 child->join();
kadonotakashi 0:8fdf9a60065b 88 delete child;
kadonotakashi 0:8fdf9a60065b 89 }
kadonotakashi 0:8fdf9a60065b 90
kadonotakashi 0:8fdf9a60065b 91 void increment_with_murder(counter_t *counter)
kadonotakashi 0:8fdf9a60065b 92 {
kadonotakashi 0:8fdf9a60065b 93 {
kadonotakashi 0:8fdf9a60065b 94 // take ownership of the counter mutex so it prevent the child to
kadonotakashi 0:8fdf9a60065b 95 // modify counter.
kadonotakashi 0:8fdf9a60065b 96 LockGuard lock(counter->internal_mutex());
kadonotakashi 0:8fdf9a60065b 97 Thread *child = new (std::nothrow) Thread(osPriorityNormal, CHILD_THREAD_STACK_SIZE);
kadonotakashi 0:8fdf9a60065b 98 char *dummy = new (std::nothrow) char[CHILD_THREAD_STACK_SIZE];
kadonotakashi 0:8fdf9a60065b 99 delete[] dummy;
kadonotakashi 0:8fdf9a60065b 100
kadonotakashi 0:8fdf9a60065b 101 // Don't fail test due to lack of memory.
kadonotakashi 0:8fdf9a60065b 102 if (!child || !dummy) {
kadonotakashi 0:8fdf9a60065b 103 delete child;
kadonotakashi 0:8fdf9a60065b 104 goto end;
kadonotakashi 0:8fdf9a60065b 105 }
kadonotakashi 0:8fdf9a60065b 106 child->start(callback(increment, counter));
kadonotakashi 0:8fdf9a60065b 107 child->terminate();
kadonotakashi 0:8fdf9a60065b 108 delete child;
kadonotakashi 0:8fdf9a60065b 109 }
kadonotakashi 0:8fdf9a60065b 110
kadonotakashi 0:8fdf9a60065b 111 end:
kadonotakashi 0:8fdf9a60065b 112 (*counter)++;
kadonotakashi 0:8fdf9a60065b 113 }
kadonotakashi 0:8fdf9a60065b 114
kadonotakashi 0:8fdf9a60065b 115 void self_terminate(Thread *self)
kadonotakashi 0:8fdf9a60065b 116 {
kadonotakashi 0:8fdf9a60065b 117 self->terminate();
kadonotakashi 0:8fdf9a60065b 118 // Code should not get here
kadonotakashi 0:8fdf9a60065b 119 TEST_ASSERT(0);
kadonotakashi 0:8fdf9a60065b 120 }
kadonotakashi 0:8fdf9a60065b 121
kadonotakashi 0:8fdf9a60065b 122 // Tests that spawn tasks in different configurations
kadonotakashi 0:8fdf9a60065b 123
kadonotakashi 0:8fdf9a60065b 124 /** Template for tests: single thread, with yield, with wait, with child, with murder
kadonotakashi 0:8fdf9a60065b 125
kadonotakashi 0:8fdf9a60065b 126 Testing single thread
kadonotakashi 0:8fdf9a60065b 127 Given single thread is started
kadonotakashi 0:8fdf9a60065b 128 when the thread increments the counter
kadonotakashi 0:8fdf9a60065b 129 then the final value of the counter is equal to 1
kadonotakashi 0:8fdf9a60065b 130
kadonotakashi 0:8fdf9a60065b 131 Testing single thread with yield
kadonotakashi 0:8fdf9a60065b 132 Given single thread is started
kadonotakashi 0:8fdf9a60065b 133 when the thread yields and then increments the counter
kadonotakashi 0:8fdf9a60065b 134 then the final value of the counter is equal to 1
kadonotakashi 0:8fdf9a60065b 135
kadonotakashi 0:8fdf9a60065b 136 Testing single thread with wait
kadonotakashi 0:8fdf9a60065b 137 Given single thread is started
kadonotakashi 0:8fdf9a60065b 138 when the thread waits for 100ms and then increments the counter
kadonotakashi 0:8fdf9a60065b 139 then the final value of the counter is equal to 1
kadonotakashi 0:8fdf9a60065b 140
kadonotakashi 0:8fdf9a60065b 141 Testing single thread with child
kadonotakashi 0:8fdf9a60065b 142 Given single thread is started
kadonotakashi 0:8fdf9a60065b 143 when the thread spawns another thread that increments the counter
kadonotakashi 0:8fdf9a60065b 144 then the final value of the counter is equal to 1
kadonotakashi 0:8fdf9a60065b 145
kadonotakashi 0:8fdf9a60065b 146 Testing serial threads with murder
kadonotakashi 0:8fdf9a60065b 147 Given single thread is started
kadonotakashi 0:8fdf9a60065b 148 when the parent thread is holding a lock
kadonotakashi 0:8fdf9a60065b 149 and the parent thread spawns a child thread that waits for the lock before incrementing the counter
kadonotakashi 0:8fdf9a60065b 150 and the parent terminates the child before releasing the lock
kadonotakashi 0:8fdf9a60065b 151 and the parent increments the counter
kadonotakashi 0:8fdf9a60065b 152 then the final value of the counter is equal to 1
kadonotakashi 0:8fdf9a60065b 153 */
kadonotakashi 0:8fdf9a60065b 154 template <void (*F)(counter_t *)>
kadonotakashi 0:8fdf9a60065b 155 void test_single_thread()
kadonotakashi 0:8fdf9a60065b 156 {
kadonotakashi 0:8fdf9a60065b 157 char *dummy = new (std::nothrow) char[THREAD_STACK_SIZE];
kadonotakashi 0:8fdf9a60065b 158 delete[] dummy;
kadonotakashi 0:8fdf9a60065b 159 TEST_SKIP_UNLESS_MESSAGE(dummy, "Not enough memory to run test");
kadonotakashi 0:8fdf9a60065b 160
kadonotakashi 0:8fdf9a60065b 161 counter_t counter(0);
kadonotakashi 0:8fdf9a60065b 162 Thread thread(osPriorityNormal, THREAD_STACK_SIZE);
kadonotakashi 0:8fdf9a60065b 163 thread.start(callback(F, &counter));
kadonotakashi 0:8fdf9a60065b 164 thread.join();
kadonotakashi 0:8fdf9a60065b 165 TEST_ASSERT_EQUAL(counter, 1);
kadonotakashi 0:8fdf9a60065b 166 }
kadonotakashi 0:8fdf9a60065b 167
kadonotakashi 0:8fdf9a60065b 168 /** Template for tests: parallel threads, with yield, with wait, with child, with murder
kadonotakashi 0:8fdf9a60065b 169
kadonotakashi 0:8fdf9a60065b 170 Testing parallel threads
kadonotakashi 0:8fdf9a60065b 171 Given multiple threads are started in parallel
kadonotakashi 0:8fdf9a60065b 172 when each of the threads increments the counter
kadonotakashi 0:8fdf9a60065b 173 then the final value of the counter is equal to number of threads
kadonotakashi 0:8fdf9a60065b 174
kadonotakashi 0:8fdf9a60065b 175 Testing parallel threads with yield
kadonotakashi 0:8fdf9a60065b 176 Given multiple threads are started in parallel
kadonotakashi 0:8fdf9a60065b 177 when each of the threads yields and then increments the counter
kadonotakashi 0:8fdf9a60065b 178 then the final value of the counter is equal to number of threads
kadonotakashi 0:8fdf9a60065b 179
kadonotakashi 0:8fdf9a60065b 180 Testing parallel threads with wait
kadonotakashi 0:8fdf9a60065b 181 Given multiple threads are started in parallel
kadonotakashi 0:8fdf9a60065b 182 when each of the threads waits for 100ms and then increments the counter
kadonotakashi 0:8fdf9a60065b 183 then the final value of the counter is equal to number of threads
kadonotakashi 0:8fdf9a60065b 184
kadonotakashi 0:8fdf9a60065b 185 Testing parallel threads with child
kadonotakashi 0:8fdf9a60065b 186 Given multiple threads are started in parallel
kadonotakashi 0:8fdf9a60065b 187 when each of the threads spawns another thread that increments the counter
kadonotakashi 0:8fdf9a60065b 188 then the final value of the counter is equal to number of parallel threads
kadonotakashi 0:8fdf9a60065b 189
kadonotakashi 0:8fdf9a60065b 190 Testing parallel threads with murder
kadonotakashi 0:8fdf9a60065b 191 Given multiple threads are started in parallel
kadonotakashi 0:8fdf9a60065b 192 when the parent thread is holding a lock
kadonotakashi 0:8fdf9a60065b 193 and the parent thread spawns a child thread that waits for the lock before incrementing the counter
kadonotakashi 0:8fdf9a60065b 194 and the parent terminates the child before releasing the lock
kadonotakashi 0:8fdf9a60065b 195 and the parent increments the counter
kadonotakashi 0:8fdf9a60065b 196 then the final value of the counter is equal to number of parallel threads
kadonotakashi 0:8fdf9a60065b 197 */
kadonotakashi 0:8fdf9a60065b 198 template <int N, void (*F)(counter_t *)>
kadonotakashi 0:8fdf9a60065b 199 void test_parallel_threads()
kadonotakashi 0:8fdf9a60065b 200 {
kadonotakashi 0:8fdf9a60065b 201 char *dummy = new (std::nothrow) char[PARALLEL_THREAD_STACK_SIZE * N];
kadonotakashi 0:8fdf9a60065b 202 delete[] dummy;
kadonotakashi 0:8fdf9a60065b 203 TEST_SKIP_UNLESS_MESSAGE(dummy, "Not enough memory to run test");
kadonotakashi 0:8fdf9a60065b 204
kadonotakashi 0:8fdf9a60065b 205 counter_t counter(0);
kadonotakashi 0:8fdf9a60065b 206 ParallelThread<osPriorityNormal, PARALLEL_THREAD_STACK_SIZE> threads[N];
kadonotakashi 0:8fdf9a60065b 207
kadonotakashi 0:8fdf9a60065b 208 for (int i = 0; i < N; i++) {
kadonotakashi 0:8fdf9a60065b 209 threads[i].start(callback(F, &counter));
kadonotakashi 0:8fdf9a60065b 210 }
kadonotakashi 0:8fdf9a60065b 211
kadonotakashi 0:8fdf9a60065b 212 for (int i = 0; i < N; i++) {
kadonotakashi 0:8fdf9a60065b 213 threads[i].join();
kadonotakashi 0:8fdf9a60065b 214 }
kadonotakashi 0:8fdf9a60065b 215
kadonotakashi 0:8fdf9a60065b 216 TEST_ASSERT_EQUAL(counter, N);
kadonotakashi 0:8fdf9a60065b 217 }
kadonotakashi 0:8fdf9a60065b 218
kadonotakashi 0:8fdf9a60065b 219 /** Template for tests: serial threads, with yield, with wait, with child, with murder
kadonotakashi 0:8fdf9a60065b 220
kadonotakashi 0:8fdf9a60065b 221 Testing serial threads
kadonotakashi 0:8fdf9a60065b 222 Given multiple threads are started serially
kadonotakashi 0:8fdf9a60065b 223 when each of the threads increments the counter
kadonotakashi 0:8fdf9a60065b 224 then the final value of the counter is equal to number of threads
kadonotakashi 0:8fdf9a60065b 225
kadonotakashi 0:8fdf9a60065b 226 Testing serial threads with yield
kadonotakashi 0:8fdf9a60065b 227 Given multiple threads are started serially
kadonotakashi 0:8fdf9a60065b 228 when each of the threads yields and then increments the counter
kadonotakashi 0:8fdf9a60065b 229 then the final value of the counter is equal to number of threads
kadonotakashi 0:8fdf9a60065b 230
kadonotakashi 0:8fdf9a60065b 231 Testing serial threads with wait
kadonotakashi 0:8fdf9a60065b 232 Given multiple threads are started serially
kadonotakashi 0:8fdf9a60065b 233 when each of the threads waits for 100ms and then increments the counter
kadonotakashi 0:8fdf9a60065b 234 then the final value of the counter is equal to number of threads
kadonotakashi 0:8fdf9a60065b 235
kadonotakashi 0:8fdf9a60065b 236 Testing serial threads with child
kadonotakashi 0:8fdf9a60065b 237 Given multiple threads are started serially
kadonotakashi 0:8fdf9a60065b 238 when each of the threads spawns another thread that increments the counter
kadonotakashi 0:8fdf9a60065b 239 then the final value of the counter is equal to number of serial threads
kadonotakashi 0:8fdf9a60065b 240
kadonotakashi 0:8fdf9a60065b 241 Testing serial threads with murder
kadonotakashi 0:8fdf9a60065b 242 Given multiple threads are started serially
kadonotakashi 0:8fdf9a60065b 243 when the parent thread is holding a lock
kadonotakashi 0:8fdf9a60065b 244 and the parent thread spawns a child thread that waits for the lock before incrementing the counter
kadonotakashi 0:8fdf9a60065b 245 and the parent terminates the child before releasing the lock
kadonotakashi 0:8fdf9a60065b 246 and the parent increments the counter
kadonotakashi 0:8fdf9a60065b 247 then the final value of the counter is equal to number of serial threads
kadonotakashi 0:8fdf9a60065b 248 */
kadonotakashi 0:8fdf9a60065b 249 template <int N, void (*F)(counter_t *)>
kadonotakashi 0:8fdf9a60065b 250 void test_serial_threads()
kadonotakashi 0:8fdf9a60065b 251 {
kadonotakashi 0:8fdf9a60065b 252 counter_t counter(0);
kadonotakashi 0:8fdf9a60065b 253 char *dummy = new (std::nothrow) char[THREAD_STACK_SIZE];
kadonotakashi 0:8fdf9a60065b 254 delete[] dummy;
kadonotakashi 0:8fdf9a60065b 255 TEST_SKIP_UNLESS_MESSAGE(dummy, "Not enough memory to run test");
kadonotakashi 0:8fdf9a60065b 256
kadonotakashi 0:8fdf9a60065b 257 for (int i = 0; i < N; i++) {
kadonotakashi 0:8fdf9a60065b 258 Thread thread(osPriorityNormal, THREAD_STACK_SIZE);
kadonotakashi 0:8fdf9a60065b 259 thread.start(callback(F, &counter));
kadonotakashi 0:8fdf9a60065b 260 thread.join();
kadonotakashi 0:8fdf9a60065b 261 }
kadonotakashi 0:8fdf9a60065b 262
kadonotakashi 0:8fdf9a60065b 263 TEST_ASSERT_EQUAL(counter, N);
kadonotakashi 0:8fdf9a60065b 264 }
kadonotakashi 0:8fdf9a60065b 265
kadonotakashi 0:8fdf9a60065b 266 /** Testing thread self terminate
kadonotakashi 0:8fdf9a60065b 267
kadonotakashi 0:8fdf9a60065b 268 Given the thread is running
kadonotakashi 0:8fdf9a60065b 269 when the thread calls @a terminate on its self
kadonotakashi 0:8fdf9a60065b 270 then the thread terminates execution cleanly
kadonotakashi 0:8fdf9a60065b 271 */
kadonotakashi 0:8fdf9a60065b 272 void test_self_terminate()
kadonotakashi 0:8fdf9a60065b 273 {
kadonotakashi 0:8fdf9a60065b 274 Thread *thread = new (std::nothrow) Thread(osPriorityNormal, THREAD_STACK_SIZE);
kadonotakashi 0:8fdf9a60065b 275 char *dummy = new (std::nothrow) char[THREAD_STACK_SIZE];
kadonotakashi 0:8fdf9a60065b 276 delete[] dummy;
kadonotakashi 0:8fdf9a60065b 277
kadonotakashi 0:8fdf9a60065b 278 // Don't fail test due to lack of memory.
kadonotakashi 0:8fdf9a60065b 279 if (!thread || !dummy) {
kadonotakashi 0:8fdf9a60065b 280 goto end;
kadonotakashi 0:8fdf9a60065b 281 }
kadonotakashi 0:8fdf9a60065b 282 thread->start(callback(self_terminate, thread));
kadonotakashi 0:8fdf9a60065b 283 thread->join();
kadonotakashi 0:8fdf9a60065b 284
kadonotakashi 0:8fdf9a60065b 285 end:
kadonotakashi 0:8fdf9a60065b 286 delete thread;
kadonotakashi 0:8fdf9a60065b 287 }
kadonotakashi 0:8fdf9a60065b 288
kadonotakashi 0:8fdf9a60065b 289 void flags_wait()
kadonotakashi 0:8fdf9a60065b 290 {
kadonotakashi 0:8fdf9a60065b 291 uint32_t flags = ThisThread::flags_wait_all(0x1);
kadonotakashi 0:8fdf9a60065b 292 TEST_ASSERT_EQUAL(0x1, flags);
kadonotakashi 0:8fdf9a60065b 293 }
kadonotakashi 0:8fdf9a60065b 294
kadonotakashi 0:8fdf9a60065b 295 void flags_wait_tout()
kadonotakashi 0:8fdf9a60065b 296 {
kadonotakashi 0:8fdf9a60065b 297 uint32_t flags = ThisThread::flags_wait_all_for(0x2, 50);
kadonotakashi 0:8fdf9a60065b 298 TEST_ASSERT_EQUAL(0x1, flags);
kadonotakashi 0:8fdf9a60065b 299 }
kadonotakashi 0:8fdf9a60065b 300
kadonotakashi 0:8fdf9a60065b 301 void flags_wait_multibit()
kadonotakashi 0:8fdf9a60065b 302 {
kadonotakashi 0:8fdf9a60065b 303 uint32_t flags = ThisThread::flags_wait_all(0x1 | 0x2);
kadonotakashi 0:8fdf9a60065b 304 TEST_ASSERT_EQUAL(0x3, flags);
kadonotakashi 0:8fdf9a60065b 305 }
kadonotakashi 0:8fdf9a60065b 306
kadonotakashi 0:8fdf9a60065b 307 void flags_wait_multibit_any()
kadonotakashi 0:8fdf9a60065b 308 {
kadonotakashi 0:8fdf9a60065b 309 uint32_t flags = ThisThread::flags_wait_any(0x1 | 0x2);
kadonotakashi 0:8fdf9a60065b 310 TEST_ASSERT_NOT_EQUAL(0x0, flags);
kadonotakashi 0:8fdf9a60065b 311 }
kadonotakashi 0:8fdf9a60065b 312
kadonotakashi 0:8fdf9a60065b 313 void flags_wait_multibit_tout()
kadonotakashi 0:8fdf9a60065b 314 {
kadonotakashi 0:8fdf9a60065b 315 uint32_t flags = ThisThread::flags_wait_all_for(0x1 | 0x2, 50);
kadonotakashi 0:8fdf9a60065b 316 TEST_ASSERT_NOT_EQUAL(0x3, flags);
kadonotakashi 0:8fdf9a60065b 317 }
kadonotakashi 0:8fdf9a60065b 318
kadonotakashi 0:8fdf9a60065b 319 /**
kadonotakashi 0:8fdf9a60065b 320 Testing thread flags: wait
kadonotakashi 0:8fdf9a60065b 321 Given two threads (A & B) are started
kadonotakashi 0:8fdf9a60065b 322 when thread A executes @a flags_wait_all(0x1)
kadonotakashi 0:8fdf9a60065b 323 and thread B execute @a flags_set(0x1)
kadonotakashi 0:8fdf9a60065b 324 then thread A exits the wait and continues execution
kadonotakashi 0:8fdf9a60065b 325
kadonotakashi 0:8fdf9a60065b 326 Testing thread flags: timeout
kadonotakashi 0:8fdf9a60065b 327 Given two threads (A & B) are started
kadonotakashi 0:8fdf9a60065b 328 when thread A executes @a flags_wait_all_for(0x1 | 0x2, 50) with a timeout of 50ms
kadonotakashi 0:8fdf9a60065b 329 and thread B execute @a flags_set(0x2)
kadonotakashi 0:8fdf9a60065b 330 then thread A keeps waiting for correct flags until it timeouts
kadonotakashi 0:8fdf9a60065b 331
kadonotakashi 0:8fdf9a60065b 332 Testing thread flags: multi-bit
kadonotakashi 0:8fdf9a60065b 333 Given two threads (A & B) are started
kadonotakashi 0:8fdf9a60065b 334 when thread A executes @a flags_wait_all(0x1 | 0x2)
kadonotakashi 0:8fdf9a60065b 335 and thread B execute @a flags_set(0x1 | 0x2)
kadonotakashi 0:8fdf9a60065b 336 then thread A exits the wait and continues execution
kadonotakashi 0:8fdf9a60065b 337
kadonotakashi 0:8fdf9a60065b 338 Testing thread flags: multi-bit any
kadonotakashi 0:8fdf9a60065b 339 Given two threads (A & B) are started
kadonotakashi 0:8fdf9a60065b 340 when thread A executes @a flags_wait_any(0x1 | 0x2)
kadonotakashi 0:8fdf9a60065b 341 and thread B execute @a flags_set(0x1)
kadonotakashi 0:8fdf9a60065b 342 then thread A exits the wait and continues execution
kadonotakashi 0:8fdf9a60065b 343
kadonotakashi 0:8fdf9a60065b 344 Testing thread flags: multi-bit timeout
kadonotakashi 0:8fdf9a60065b 345 Given two threads (A & B) are started
kadonotakashi 0:8fdf9a60065b 346 when thread A executes @a flags_wait_all_for(0x1, 50) with a timeout of 50ms
kadonotakashi 0:8fdf9a60065b 347 and thread B execute @a flags_set(0x2)
kadonotakashi 0:8fdf9a60065b 348 then thread A keeps waiting for correct flags until it timeouts
kadonotakashi 0:8fdf9a60065b 349 */
kadonotakashi 0:8fdf9a60065b 350 template <int S, void (*F)()>
kadonotakashi 0:8fdf9a60065b 351 void test_thread_flags_set()
kadonotakashi 0:8fdf9a60065b 352 {
kadonotakashi 0:8fdf9a60065b 353 char *dummy = new (std::nothrow) char[THREAD_STACK_SIZE];
kadonotakashi 0:8fdf9a60065b 354 delete[] dummy;
kadonotakashi 0:8fdf9a60065b 355 TEST_SKIP_UNLESS_MESSAGE(dummy, "Not enough memory to run test");
kadonotakashi 0:8fdf9a60065b 356
kadonotakashi 0:8fdf9a60065b 357 Thread t_wait(osPriorityNormal, THREAD_STACK_SIZE);
kadonotakashi 0:8fdf9a60065b 358
kadonotakashi 0:8fdf9a60065b 359 t_wait.start(callback(F));
kadonotakashi 0:8fdf9a60065b 360
kadonotakashi 0:8fdf9a60065b 361 ThisThread::yield();
kadonotakashi 0:8fdf9a60065b 362
kadonotakashi 0:8fdf9a60065b 363 Thread::State state = t_wait.get_state();
kadonotakashi 0:8fdf9a60065b 364 TEST_ASSERT_EQUAL(Thread::WaitingThreadFlag, state);
kadonotakashi 0:8fdf9a60065b 365
kadonotakashi 0:8fdf9a60065b 366 int32_t res = t_wait.flags_set(S);
kadonotakashi 0:8fdf9a60065b 367
kadonotakashi 0:8fdf9a60065b 368 t_wait.join();
kadonotakashi 0:8fdf9a60065b 369 }
kadonotakashi 0:8fdf9a60065b 370
kadonotakashi 0:8fdf9a60065b 371 void flags_clear()
kadonotakashi 0:8fdf9a60065b 372 {
kadonotakashi 0:8fdf9a60065b 373 ThisThread::yield();
kadonotakashi 0:8fdf9a60065b 374
kadonotakashi 0:8fdf9a60065b 375 int32_t sig = ThisThread::flags_clear(0x1);
kadonotakashi 0:8fdf9a60065b 376 TEST_ASSERT_EQUAL(0x1, sig);
kadonotakashi 0:8fdf9a60065b 377
kadonotakashi 0:8fdf9a60065b 378 /* Flags cleared we should get timeout */
kadonotakashi 0:8fdf9a60065b 379 uint32_t flags = ThisThread::flags_wait_all_for(0x1, 0);
kadonotakashi 0:8fdf9a60065b 380 TEST_ASSERT_EQUAL(0, flags);
kadonotakashi 0:8fdf9a60065b 381 }
kadonotakashi 0:8fdf9a60065b 382
kadonotakashi 0:8fdf9a60065b 383 /** Testing thread flags: flags clear
kadonotakashi 0:8fdf9a60065b 384
kadonotakashi 0:8fdf9a60065b 385 Given two threads (A & B) are started
kadonotakashi 0:8fdf9a60065b 386 when thread A executes @a flags_set(0x1)
kadonotakashi 0:8fdf9a60065b 387 and thread B execute @a flags_clear(0x1)
kadonotakashi 0:8fdf9a60065b 388 and thread B execute @a flags_wait_all_for(0x1, 0)
kadonotakashi 0:8fdf9a60065b 389 then thread B @a flags_wait_all_for return should be 0 indicating no flags set
kadonotakashi 0:8fdf9a60065b 390 */
kadonotakashi 0:8fdf9a60065b 391 void test_thread_flags_clear()
kadonotakashi 0:8fdf9a60065b 392 {
kadonotakashi 0:8fdf9a60065b 393 char *dummy = new (std::nothrow) char[THREAD_STACK_SIZE];
kadonotakashi 0:8fdf9a60065b 394 delete[] dummy;
kadonotakashi 0:8fdf9a60065b 395 TEST_SKIP_UNLESS_MESSAGE(dummy, "Not enough memory to run test");
kadonotakashi 0:8fdf9a60065b 396
kadonotakashi 0:8fdf9a60065b 397 Thread t_wait(osPriorityNormal, THREAD_STACK_SIZE);
kadonotakashi 0:8fdf9a60065b 398
kadonotakashi 0:8fdf9a60065b 399 t_wait.start(callback(flags_clear));
kadonotakashi 0:8fdf9a60065b 400
kadonotakashi 0:8fdf9a60065b 401 int32_t res = t_wait.flags_set(0x1);
kadonotakashi 0:8fdf9a60065b 402 TEST_ASSERT_EQUAL(0x1, res);
kadonotakashi 0:8fdf9a60065b 403
kadonotakashi 0:8fdf9a60065b 404 t_wait.join();
kadonotakashi 0:8fdf9a60065b 405 }
kadonotakashi 0:8fdf9a60065b 406
kadonotakashi 0:8fdf9a60065b 407 void thread_wait_flags()
kadonotakashi 0:8fdf9a60065b 408 {
kadonotakashi 0:8fdf9a60065b 409 ThisThread::flags_wait_all(0x1);
kadonotakashi 0:8fdf9a60065b 410 }
kadonotakashi 0:8fdf9a60065b 411
kadonotakashi 0:8fdf9a60065b 412 void stack_info()
kadonotakashi 0:8fdf9a60065b 413 {
kadonotakashi 0:8fdf9a60065b 414 ThisThread::flags_wait_all(0x1);
kadonotakashi 0:8fdf9a60065b 415
kadonotakashi 0:8fdf9a60065b 416 thread_wait_flags();
kadonotakashi 0:8fdf9a60065b 417
kadonotakashi 0:8fdf9a60065b 418 ThisThread::flags_wait_all(0x1);
kadonotakashi 0:8fdf9a60065b 419 }
kadonotakashi 0:8fdf9a60065b 420
kadonotakashi 0:8fdf9a60065b 421 /** Testing thread stack info
kadonotakashi 0:8fdf9a60065b 422
kadonotakashi 0:8fdf9a60065b 423 Given the thread is running
kadonotakashi 0:8fdf9a60065b 424 when a function is called from the thread context
kadonotakashi 0:8fdf9a60065b 425 then the stack usage goes up
kadonotakashi 0:8fdf9a60065b 426 and the reported stack size is as requested in the constructor
kadonotakashi 0:8fdf9a60065b 427 and the sum of free and used stack sizes is equal to the total stack size
kadonotakashi 0:8fdf9a60065b 428 when the function returns
kadonotakashi 0:8fdf9a60065b 429 then the stack usage goes down
kadonotakashi 0:8fdf9a60065b 430 and the reported stack size is as requested in the constructor
kadonotakashi 0:8fdf9a60065b 431 and the sum of free and used stack sizes is equal to the total stack size
kadonotakashi 0:8fdf9a60065b 432 */
kadonotakashi 0:8fdf9a60065b 433 void test_thread_stack_info()
kadonotakashi 0:8fdf9a60065b 434 {
kadonotakashi 0:8fdf9a60065b 435 char *dummy = new (std::nothrow) char[THREAD_STACK_SIZE];
kadonotakashi 0:8fdf9a60065b 436 delete[] dummy;
kadonotakashi 0:8fdf9a60065b 437 TEST_SKIP_UNLESS_MESSAGE(dummy, "Not enough memory to run test");
kadonotakashi 0:8fdf9a60065b 438
kadonotakashi 0:8fdf9a60065b 439 Thread t(osPriorityNormal, THREAD_STACK_SIZE);
kadonotakashi 0:8fdf9a60065b 440 t.start(callback(stack_info));
kadonotakashi 0:8fdf9a60065b 441
kadonotakashi 0:8fdf9a60065b 442 ThisThread::yield();
kadonotakashi 0:8fdf9a60065b 443
kadonotakashi 0:8fdf9a60065b 444 TEST_ASSERT_EQUAL(THREAD_STACK_SIZE, t.stack_size());
kadonotakashi 0:8fdf9a60065b 445 TEST_ASSERT_EQUAL(THREAD_STACK_SIZE, t.free_stack() + t.used_stack());
kadonotakashi 0:8fdf9a60065b 446 uint32_t last_stack = t.used_stack();
kadonotakashi 0:8fdf9a60065b 447
kadonotakashi 0:8fdf9a60065b 448 t.flags_set(0x1);
kadonotakashi 0:8fdf9a60065b 449 ThisThread::yield();
kadonotakashi 0:8fdf9a60065b 450
kadonotakashi 0:8fdf9a60065b 451 TEST_ASSERT_EQUAL(THREAD_STACK_SIZE, t.free_stack() + t.used_stack());
kadonotakashi 0:8fdf9a60065b 452 TEST_ASSERT(last_stack <= t.used_stack());
kadonotakashi 0:8fdf9a60065b 453 last_stack = t.used_stack();
kadonotakashi 0:8fdf9a60065b 454
kadonotakashi 0:8fdf9a60065b 455 t.flags_set(0x1);
kadonotakashi 0:8fdf9a60065b 456 ThisThread::yield();
kadonotakashi 0:8fdf9a60065b 457
kadonotakashi 0:8fdf9a60065b 458 TEST_ASSERT_EQUAL(THREAD_STACK_SIZE, t.free_stack() + t.used_stack());
kadonotakashi 0:8fdf9a60065b 459 TEST_ASSERT(last_stack >= t.used_stack());
kadonotakashi 0:8fdf9a60065b 460
kadonotakashi 0:8fdf9a60065b 461 t.flags_set(0x1);
kadonotakashi 0:8fdf9a60065b 462
kadonotakashi 0:8fdf9a60065b 463 t.join();
kadonotakashi 0:8fdf9a60065b 464 }
kadonotakashi 0:8fdf9a60065b 465
kadonotakashi 0:8fdf9a60065b 466 /** Testing thread wait aka delay
kadonotakashi 0:8fdf9a60065b 467
kadonotakashi 0:8fdf9a60065b 468 Given the thread is running
kadonotakashi 0:8fdf9a60065b 469 when the @a wait function is called
kadonotakashi 0:8fdf9a60065b 470 then the thread sleeps for given amount of time
kadonotakashi 0:8fdf9a60065b 471 */
kadonotakashi 0:8fdf9a60065b 472 void test_thread_wait()
kadonotakashi 0:8fdf9a60065b 473 {
kadonotakashi 0:8fdf9a60065b 474 Timer timer;
kadonotakashi 0:8fdf9a60065b 475 timer.start();
kadonotakashi 0:8fdf9a60065b 476
kadonotakashi 0:8fdf9a60065b 477 Thread::wait(150);
kadonotakashi 0:8fdf9a60065b 478
kadonotakashi 0:8fdf9a60065b 479 TEST_ASSERT_UINT32_WITHIN(50000, 150000, timer.read_us());
kadonotakashi 0:8fdf9a60065b 480 }
kadonotakashi 0:8fdf9a60065b 481
kadonotakashi 0:8fdf9a60065b 482 /** Testing thread name
kadonotakashi 0:8fdf9a60065b 483
kadonotakashi 0:8fdf9a60065b 484 Given a thread is started with a specified name
kadonotakashi 0:8fdf9a60065b 485 when the name is queried using @a get_name
kadonotakashi 0:8fdf9a60065b 486 then the returned name is as set
kadonotakashi 0:8fdf9a60065b 487 */
kadonotakashi 0:8fdf9a60065b 488 void test_thread_name()
kadonotakashi 0:8fdf9a60065b 489 {
kadonotakashi 0:8fdf9a60065b 490 char *dummy = new (std::nothrow) char[THREAD_STACK_SIZE];
kadonotakashi 0:8fdf9a60065b 491 delete[] dummy;
kadonotakashi 0:8fdf9a60065b 492 TEST_SKIP_UNLESS_MESSAGE(dummy, "Not enough memory to run test");
kadonotakashi 0:8fdf9a60065b 493
kadonotakashi 0:8fdf9a60065b 494 const char tname[] = "Amazing thread";
kadonotakashi 0:8fdf9a60065b 495 Thread t(osPriorityNormal, THREAD_STACK_SIZE, NULL, tname);
kadonotakashi 0:8fdf9a60065b 496 t.start(callback(thread_wait_flags));
kadonotakashi 0:8fdf9a60065b 497 TEST_ASSERT_EQUAL(strcmp(tname, t.get_name()), 0);
kadonotakashi 0:8fdf9a60065b 498 t.flags_set(0x1);
kadonotakashi 0:8fdf9a60065b 499 t.join();
kadonotakashi 0:8fdf9a60065b 500 }
kadonotakashi 0:8fdf9a60065b 501
kadonotakashi 0:8fdf9a60065b 502 void test_deleted_thread()
kadonotakashi 0:8fdf9a60065b 503 {
kadonotakashi 0:8fdf9a60065b 504 }
kadonotakashi 0:8fdf9a60065b 505
kadonotakashi 0:8fdf9a60065b 506 /** Testing thread states: deleted
kadonotakashi 0:8fdf9a60065b 507
kadonotakashi 0:8fdf9a60065b 508 Given the thread is not started
kadonotakashi 0:8fdf9a60065b 509 then its state, as reported by @a get_state, is @a Deleted
kadonotakashi 0:8fdf9a60065b 510 when the thread is started and finishes executing
kadonotakashi 0:8fdf9a60065b 511 then its state, as reported by @a get_state, is @a Deleted
kadonotakashi 0:8fdf9a60065b 512 */
kadonotakashi 0:8fdf9a60065b 513 void test_deleted()
kadonotakashi 0:8fdf9a60065b 514 {
kadonotakashi 0:8fdf9a60065b 515 char *dummy = new (std::nothrow) char[THREAD_STACK_SIZE];
kadonotakashi 0:8fdf9a60065b 516 delete[] dummy;
kadonotakashi 0:8fdf9a60065b 517 TEST_SKIP_UNLESS_MESSAGE(dummy, "Not enough memory to run test");
kadonotakashi 0:8fdf9a60065b 518
kadonotakashi 0:8fdf9a60065b 519 Thread t(osPriorityNormal, THREAD_STACK_SIZE);
kadonotakashi 0:8fdf9a60065b 520
kadonotakashi 0:8fdf9a60065b 521 TEST_ASSERT_EQUAL(Thread::Deleted, t.get_state());
kadonotakashi 0:8fdf9a60065b 522
kadonotakashi 0:8fdf9a60065b 523 t.start(callback(test_deleted_thread));
kadonotakashi 0:8fdf9a60065b 524
kadonotakashi 0:8fdf9a60065b 525 t.join();
kadonotakashi 0:8fdf9a60065b 526 TEST_ASSERT_EQUAL(Thread::Deleted, t.get_state());
kadonotakashi 0:8fdf9a60065b 527 }
kadonotakashi 0:8fdf9a60065b 528
kadonotakashi 0:8fdf9a60065b 529 void test_delay_thread()
kadonotakashi 0:8fdf9a60065b 530 {
kadonotakashi 0:8fdf9a60065b 531 Thread::wait(50);
kadonotakashi 0:8fdf9a60065b 532 }
kadonotakashi 0:8fdf9a60065b 533
kadonotakashi 0:8fdf9a60065b 534 /** Testing thread states: wait delay
kadonotakashi 0:8fdf9a60065b 535
kadonotakashi 0:8fdf9a60065b 536 Given the thread is running
kadonotakashi 0:8fdf9a60065b 537 when thread calls @a wait
kadonotakashi 0:8fdf9a60065b 538 then its state, as reported by @a get_state, is @a WaitingDelay
kadonotakashi 0:8fdf9a60065b 539 */
kadonotakashi 0:8fdf9a60065b 540 void test_delay()
kadonotakashi 0:8fdf9a60065b 541 {
kadonotakashi 0:8fdf9a60065b 542 char *dummy = new (std::nothrow) char[THREAD_STACK_SIZE];
kadonotakashi 0:8fdf9a60065b 543 delete[] dummy;
kadonotakashi 0:8fdf9a60065b 544 TEST_SKIP_UNLESS_MESSAGE(dummy, "Not enough memory to run test");
kadonotakashi 0:8fdf9a60065b 545
kadonotakashi 0:8fdf9a60065b 546 Thread t(osPriorityNormal, THREAD_STACK_SIZE);
kadonotakashi 0:8fdf9a60065b 547
kadonotakashi 0:8fdf9a60065b 548 t.start(callback(test_delay_thread));
kadonotakashi 0:8fdf9a60065b 549
kadonotakashi 0:8fdf9a60065b 550 ThisThread::yield();
kadonotakashi 0:8fdf9a60065b 551
kadonotakashi 0:8fdf9a60065b 552 TEST_ASSERT_EQUAL(Thread::WaitingDelay, t.get_state());
kadonotakashi 0:8fdf9a60065b 553
kadonotakashi 0:8fdf9a60065b 554 t.join();
kadonotakashi 0:8fdf9a60065b 555 TEST_ASSERT_EQUAL(Thread::Deleted, t.get_state());
kadonotakashi 0:8fdf9a60065b 556 }
kadonotakashi 0:8fdf9a60065b 557
kadonotakashi 0:8fdf9a60065b 558 void test_thread_flags_thread()
kadonotakashi 0:8fdf9a60065b 559 {
kadonotakashi 0:8fdf9a60065b 560 ThisThread::flags_wait_all(0x1);
kadonotakashi 0:8fdf9a60065b 561 }
kadonotakashi 0:8fdf9a60065b 562
kadonotakashi 0:8fdf9a60065b 563 /** Testing thread states: wait flags
kadonotakashi 0:8fdf9a60065b 564
kadonotakashi 0:8fdf9a60065b 565 Given the thread is running
kadonotakashi 0:8fdf9a60065b 566 when thread waits for flags
kadonotakashi 0:8fdf9a60065b 567 then its state, as reported by @a get_state, is @a WaitingThreadFlag
kadonotakashi 0:8fdf9a60065b 568 */
kadonotakashi 0:8fdf9a60065b 569 void test_thread_flags()
kadonotakashi 0:8fdf9a60065b 570 {
kadonotakashi 0:8fdf9a60065b 571 char *dummy = new (std::nothrow) char[THREAD_STACK_SIZE];
kadonotakashi 0:8fdf9a60065b 572 delete[] dummy;
kadonotakashi 0:8fdf9a60065b 573 TEST_SKIP_UNLESS_MESSAGE(dummy, "Not enough memory to run test");
kadonotakashi 0:8fdf9a60065b 574
kadonotakashi 0:8fdf9a60065b 575 Thread t(osPriorityNormal, THREAD_STACK_SIZE);
kadonotakashi 0:8fdf9a60065b 576
kadonotakashi 0:8fdf9a60065b 577 t.start(callback(test_thread_flags_thread));
kadonotakashi 0:8fdf9a60065b 578
kadonotakashi 0:8fdf9a60065b 579 ThisThread::yield();
kadonotakashi 0:8fdf9a60065b 580
kadonotakashi 0:8fdf9a60065b 581 TEST_ASSERT_EQUAL(Thread::WaitingThreadFlag, t.get_state());
kadonotakashi 0:8fdf9a60065b 582
kadonotakashi 0:8fdf9a60065b 583 t.flags_set(0x1);
kadonotakashi 0:8fdf9a60065b 584 }
kadonotakashi 0:8fdf9a60065b 585
kadonotakashi 0:8fdf9a60065b 586 void test_evt_flag_thread(EventFlags *evtflg)
kadonotakashi 0:8fdf9a60065b 587 {
kadonotakashi 0:8fdf9a60065b 588 evtflg->wait_any(0x1);
kadonotakashi 0:8fdf9a60065b 589 }
kadonotakashi 0:8fdf9a60065b 590
kadonotakashi 0:8fdf9a60065b 591 /** Testing thread states: wait evt flag
kadonotakashi 0:8fdf9a60065b 592
kadonotakashi 0:8fdf9a60065b 593 Given the thread is running
kadonotakashi 0:8fdf9a60065b 594 when thread waits for an event flag
kadonotakashi 0:8fdf9a60065b 595 then its state, as reported by @a get_state, is @a WaitingEventFlag
kadonotakashi 0:8fdf9a60065b 596 */
kadonotakashi 0:8fdf9a60065b 597 void test_evt_flag()
kadonotakashi 0:8fdf9a60065b 598 {
kadonotakashi 0:8fdf9a60065b 599 char *dummy = new (std::nothrow) char[THREAD_STACK_SIZE];
kadonotakashi 0:8fdf9a60065b 600 delete[] dummy;
kadonotakashi 0:8fdf9a60065b 601 TEST_SKIP_UNLESS_MESSAGE(dummy, "Not enough memory to run test");
kadonotakashi 0:8fdf9a60065b 602
kadonotakashi 0:8fdf9a60065b 603 Thread t(osPriorityNormal, THREAD_STACK_SIZE);
kadonotakashi 0:8fdf9a60065b 604 EventFlags evtflg;
kadonotakashi 0:8fdf9a60065b 605
kadonotakashi 0:8fdf9a60065b 606 t.start(callback(test_evt_flag_thread, &evtflg));
kadonotakashi 0:8fdf9a60065b 607
kadonotakashi 0:8fdf9a60065b 608 ThisThread::yield();
kadonotakashi 0:8fdf9a60065b 609
kadonotakashi 0:8fdf9a60065b 610 TEST_ASSERT_EQUAL(Thread::WaitingEventFlag, t.get_state());
kadonotakashi 0:8fdf9a60065b 611
kadonotakashi 0:8fdf9a60065b 612 evtflg.set(0x1);
kadonotakashi 0:8fdf9a60065b 613 }
kadonotakashi 0:8fdf9a60065b 614
kadonotakashi 0:8fdf9a60065b 615 void test_mutex_thread(Mutex *mutex)
kadonotakashi 0:8fdf9a60065b 616 {
kadonotakashi 0:8fdf9a60065b 617 mutex->lock();
kadonotakashi 0:8fdf9a60065b 618 }
kadonotakashi 0:8fdf9a60065b 619
kadonotakashi 0:8fdf9a60065b 620 /** Testing thread states: wait mutex
kadonotakashi 0:8fdf9a60065b 621
kadonotakashi 0:8fdf9a60065b 622 Given the thread is running
kadonotakashi 0:8fdf9a60065b 623 when thread waits for a mutex
kadonotakashi 0:8fdf9a60065b 624 then its state, as reported by @a get_state, is @a WaitingMutex
kadonotakashi 0:8fdf9a60065b 625 */
kadonotakashi 0:8fdf9a60065b 626 void test_mutex()
kadonotakashi 0:8fdf9a60065b 627 {
kadonotakashi 0:8fdf9a60065b 628 char *dummy = new (std::nothrow) char[THREAD_STACK_SIZE];
kadonotakashi 0:8fdf9a60065b 629 delete[] dummy;
kadonotakashi 0:8fdf9a60065b 630 TEST_SKIP_UNLESS_MESSAGE(dummy, "Not enough memory to run test");
kadonotakashi 0:8fdf9a60065b 631
kadonotakashi 0:8fdf9a60065b 632 Thread t(osPriorityNormal, THREAD_STACK_SIZE);
kadonotakashi 0:8fdf9a60065b 633 Mutex mutex;
kadonotakashi 0:8fdf9a60065b 634
kadonotakashi 0:8fdf9a60065b 635 mutex.lock();
kadonotakashi 0:8fdf9a60065b 636
kadonotakashi 0:8fdf9a60065b 637 t.start(callback(test_mutex_thread, &mutex));
kadonotakashi 0:8fdf9a60065b 638
kadonotakashi 0:8fdf9a60065b 639 ThisThread::yield();
kadonotakashi 0:8fdf9a60065b 640
kadonotakashi 0:8fdf9a60065b 641 TEST_ASSERT_EQUAL(Thread::WaitingMutex, t.get_state());
kadonotakashi 0:8fdf9a60065b 642
kadonotakashi 0:8fdf9a60065b 643 mutex.unlock();
kadonotakashi 0:8fdf9a60065b 644 }
kadonotakashi 0:8fdf9a60065b 645
kadonotakashi 0:8fdf9a60065b 646 void test_semaphore_thread(Semaphore *sem)
kadonotakashi 0:8fdf9a60065b 647 {
kadonotakashi 0:8fdf9a60065b 648 sem->wait();
kadonotakashi 0:8fdf9a60065b 649 }
kadonotakashi 0:8fdf9a60065b 650
kadonotakashi 0:8fdf9a60065b 651 /** Testing thread states: wait semaphore
kadonotakashi 0:8fdf9a60065b 652
kadonotakashi 0:8fdf9a60065b 653 Given the thread is running
kadonotakashi 0:8fdf9a60065b 654 when thread waits for a semaphore
kadonotakashi 0:8fdf9a60065b 655 then its state, as reported by @a get_state, is @a WaitingSemaphore
kadonotakashi 0:8fdf9a60065b 656 */
kadonotakashi 0:8fdf9a60065b 657 void test_semaphore()
kadonotakashi 0:8fdf9a60065b 658 {
kadonotakashi 0:8fdf9a60065b 659 char *dummy = new (std::nothrow) char[THREAD_STACK_SIZE];
kadonotakashi 0:8fdf9a60065b 660 delete[] dummy;
kadonotakashi 0:8fdf9a60065b 661 TEST_SKIP_UNLESS_MESSAGE(dummy, "Not enough memory to run test");
kadonotakashi 0:8fdf9a60065b 662
kadonotakashi 0:8fdf9a60065b 663 Thread t(osPriorityNormal, THREAD_STACK_SIZE);
kadonotakashi 0:8fdf9a60065b 664 Semaphore sem;
kadonotakashi 0:8fdf9a60065b 665
kadonotakashi 0:8fdf9a60065b 666 t.start(callback(test_semaphore_thread, &sem));
kadonotakashi 0:8fdf9a60065b 667
kadonotakashi 0:8fdf9a60065b 668 ThisThread::yield();
kadonotakashi 0:8fdf9a60065b 669
kadonotakashi 0:8fdf9a60065b 670 TEST_ASSERT_EQUAL(Thread::WaitingSemaphore, t.get_state());
kadonotakashi 0:8fdf9a60065b 671
kadonotakashi 0:8fdf9a60065b 672 sem.release();
kadonotakashi 0:8fdf9a60065b 673 }
kadonotakashi 0:8fdf9a60065b 674
kadonotakashi 0:8fdf9a60065b 675 void test_msg_get_thread(Queue<int32_t, 1> *queue)
kadonotakashi 0:8fdf9a60065b 676 {
kadonotakashi 0:8fdf9a60065b 677 queue->get();
kadonotakashi 0:8fdf9a60065b 678 }
kadonotakashi 0:8fdf9a60065b 679
kadonotakashi 0:8fdf9a60065b 680 /** Testing thread states: wait message get
kadonotakashi 0:8fdf9a60065b 681
kadonotakashi 0:8fdf9a60065b 682 Given the thread is running
kadonotakashi 0:8fdf9a60065b 683 when thread tries to get a message from an empty queue
kadonotakashi 0:8fdf9a60065b 684 then its state, as reported by @a get_state, is @a WaitingMessageGet
kadonotakashi 0:8fdf9a60065b 685 */
kadonotakashi 0:8fdf9a60065b 686 void test_msg_get()
kadonotakashi 0:8fdf9a60065b 687 {
kadonotakashi 0:8fdf9a60065b 688 char *dummy = new (std::nothrow) char[THREAD_STACK_SIZE];
kadonotakashi 0:8fdf9a60065b 689 delete[] dummy;
kadonotakashi 0:8fdf9a60065b 690 TEST_SKIP_UNLESS_MESSAGE(dummy, "Not enough memory to run test");
kadonotakashi 0:8fdf9a60065b 691
kadonotakashi 0:8fdf9a60065b 692 Thread t(osPriorityNormal, THREAD_STACK_SIZE);
kadonotakashi 0:8fdf9a60065b 693 Queue<int32_t, 1> queue;
kadonotakashi 0:8fdf9a60065b 694
kadonotakashi 0:8fdf9a60065b 695 t.start(callback(test_msg_get_thread, &queue));
kadonotakashi 0:8fdf9a60065b 696
kadonotakashi 0:8fdf9a60065b 697 ThisThread::yield();
kadonotakashi 0:8fdf9a60065b 698
kadonotakashi 0:8fdf9a60065b 699 TEST_ASSERT_EQUAL(Thread::WaitingMessageGet, t.get_state());
kadonotakashi 0:8fdf9a60065b 700
kadonotakashi 0:8fdf9a60065b 701 queue.put((int32_t *)0xE1EE7);
kadonotakashi 0:8fdf9a60065b 702 }
kadonotakashi 0:8fdf9a60065b 703
kadonotakashi 0:8fdf9a60065b 704 void test_msg_put_thread(Queue<int32_t, 1> *queue)
kadonotakashi 0:8fdf9a60065b 705 {
kadonotakashi 0:8fdf9a60065b 706 queue->put((int32_t *)0xDEADBEEF, osWaitForever);
kadonotakashi 0:8fdf9a60065b 707
kadonotakashi 0:8fdf9a60065b 708 }
kadonotakashi 0:8fdf9a60065b 709
kadonotakashi 0:8fdf9a60065b 710 /** Testing thread states: wait message put
kadonotakashi 0:8fdf9a60065b 711
kadonotakashi 0:8fdf9a60065b 712 Given the thread is running
kadonotakashi 0:8fdf9a60065b 713 when thread tries to put a message into a full queue
kadonotakashi 0:8fdf9a60065b 714 then its state, as reported by @a get_state, is @a WaitingMessagePut
kadonotakashi 0:8fdf9a60065b 715 */
kadonotakashi 0:8fdf9a60065b 716 void test_msg_put()
kadonotakashi 0:8fdf9a60065b 717 {
kadonotakashi 0:8fdf9a60065b 718 char *dummy = new (std::nothrow) char[THREAD_STACK_SIZE];
kadonotakashi 0:8fdf9a60065b 719 delete[] dummy;
kadonotakashi 0:8fdf9a60065b 720 TEST_SKIP_UNLESS_MESSAGE(dummy, "Not enough memory to run test");
kadonotakashi 0:8fdf9a60065b 721
kadonotakashi 0:8fdf9a60065b 722 Thread t(osPriorityNormal, THREAD_STACK_SIZE);
kadonotakashi 0:8fdf9a60065b 723 Queue<int32_t, 1> queue;
kadonotakashi 0:8fdf9a60065b 724
kadonotakashi 0:8fdf9a60065b 725 queue.put((int32_t *)0xE1EE7);
kadonotakashi 0:8fdf9a60065b 726
kadonotakashi 0:8fdf9a60065b 727 t.start(callback(test_msg_put_thread, &queue));
kadonotakashi 0:8fdf9a60065b 728
kadonotakashi 0:8fdf9a60065b 729 ThisThread::yield();
kadonotakashi 0:8fdf9a60065b 730
kadonotakashi 0:8fdf9a60065b 731 TEST_ASSERT_EQUAL(Thread::WaitingMessagePut, t.get_state());
kadonotakashi 0:8fdf9a60065b 732 queue.get();
kadonotakashi 0:8fdf9a60065b 733 }
kadonotakashi 0:8fdf9a60065b 734
kadonotakashi 0:8fdf9a60065b 735 /** Utility function that places some date on the stack */
kadonotakashi 0:8fdf9a60065b 736 void use_some_stack()
kadonotakashi 0:8fdf9a60065b 737 {
kadonotakashi 0:8fdf9a60065b 738 volatile uint32_t stack_filler[10] = {0xDEADBEEF};
kadonotakashi 0:8fdf9a60065b 739 }
kadonotakashi 0:8fdf9a60065b 740
kadonotakashi 0:8fdf9a60065b 741 /** Testing thread with external stack memory
kadonotakashi 0:8fdf9a60065b 742
kadonotakashi 0:8fdf9a60065b 743 Given external buffer is supplied as stack to a thread
kadonotakashi 0:8fdf9a60065b 744 when the thread executes
kadonotakashi 0:8fdf9a60065b 745 then the supplies buffer is used as a stack
kadonotakashi 0:8fdf9a60065b 746 */
kadonotakashi 0:8fdf9a60065b 747 void test_thread_ext_stack()
kadonotakashi 0:8fdf9a60065b 748 {
kadonotakashi 0:8fdf9a60065b 749 char stack[512];
kadonotakashi 0:8fdf9a60065b 750 Thread t(osPriorityNormal, sizeof(stack), (unsigned char *)stack);
kadonotakashi 0:8fdf9a60065b 751
kadonotakashi 0:8fdf9a60065b 752 memset(&stack, 0, sizeof(stack));
kadonotakashi 0:8fdf9a60065b 753 t.start(callback(use_some_stack));
kadonotakashi 0:8fdf9a60065b 754 t.join();
kadonotakashi 0:8fdf9a60065b 755
kadonotakashi 0:8fdf9a60065b 756 /* If buffer was used as a stack it was cleared with pattern and some data were placed in it */
kadonotakashi 0:8fdf9a60065b 757 for (unsigned i = 0; i < sizeof(stack); i++) {
kadonotakashi 0:8fdf9a60065b 758 if (stack[i] != 0) {
kadonotakashi 0:8fdf9a60065b 759 return;
kadonotakashi 0:8fdf9a60065b 760 }
kadonotakashi 0:8fdf9a60065b 761 }
kadonotakashi 0:8fdf9a60065b 762
kadonotakashi 0:8fdf9a60065b 763 TEST_FAIL_MESSAGE("External stack was not used.");
kadonotakashi 0:8fdf9a60065b 764 }
kadonotakashi 0:8fdf9a60065b 765
kadonotakashi 0:8fdf9a60065b 766 /** Testing thread priority operations
kadonotakashi 0:8fdf9a60065b 767
kadonotakashi 0:8fdf9a60065b 768 Given thread running with osPriorityNormal
kadonotakashi 0:8fdf9a60065b 769 when new priority is set using @a set_priority
kadonotakashi 0:8fdf9a60065b 770 then priority is changed and can be retrieved using @a get_priority
kadonotakashi 0:8fdf9a60065b 771 */
kadonotakashi 0:8fdf9a60065b 772 void test_thread_prio()
kadonotakashi 0:8fdf9a60065b 773 {
kadonotakashi 0:8fdf9a60065b 774 char *dummy = new (std::nothrow) char[THREAD_STACK_SIZE];
kadonotakashi 0:8fdf9a60065b 775 delete[] dummy;
kadonotakashi 0:8fdf9a60065b 776 TEST_SKIP_UNLESS_MESSAGE(dummy, "Not enough memory to run test");
kadonotakashi 0:8fdf9a60065b 777
kadonotakashi 0:8fdf9a60065b 778 Thread t(osPriorityNormal, THREAD_STACK_SIZE);
kadonotakashi 0:8fdf9a60065b 779 t.start(callback(thread_wait_flags));
kadonotakashi 0:8fdf9a60065b 780
kadonotakashi 0:8fdf9a60065b 781 TEST_ASSERT_EQUAL(osPriorityNormal, t.get_priority());
kadonotakashi 0:8fdf9a60065b 782
kadonotakashi 0:8fdf9a60065b 783 t.set_priority(osPriorityHigh);
kadonotakashi 0:8fdf9a60065b 784
kadonotakashi 0:8fdf9a60065b 785 TEST_ASSERT_EQUAL(osPriorityHigh, t.get_priority());
kadonotakashi 0:8fdf9a60065b 786
kadonotakashi 0:8fdf9a60065b 787 t.flags_set(0x1);
kadonotakashi 0:8fdf9a60065b 788 t.join();
kadonotakashi 0:8fdf9a60065b 789 }
kadonotakashi 0:8fdf9a60065b 790
kadonotakashi 0:8fdf9a60065b 791 utest::v1::status_t test_setup(const size_t number_of_cases)
kadonotakashi 0:8fdf9a60065b 792 {
kadonotakashi 0:8fdf9a60065b 793 GREENTEA_SETUP(20, "default_auto");
kadonotakashi 0:8fdf9a60065b 794 return verbose_test_setup_handler(number_of_cases);
kadonotakashi 0:8fdf9a60065b 795 }
kadonotakashi 0:8fdf9a60065b 796
kadonotakashi 0:8fdf9a60065b 797 #define DEFAULT_HANDLERS NULL,NULL,greentea_case_setup_handler,greentea_case_teardown_handler,greentea_case_failure_abort_handler
kadonotakashi 0:8fdf9a60065b 798
kadonotakashi 0:8fdf9a60065b 799 // Test cases. It's spelled out rather than constructed with macro because
kadonotakashi 0:8fdf9a60065b 800 // macros don't play nicely with the templates (extra comma).
kadonotakashi 0:8fdf9a60065b 801 static const case_t cases[] = {
kadonotakashi 0:8fdf9a60065b 802 {"Testing single thread", test_single_thread<increment>, DEFAULT_HANDLERS},
kadonotakashi 0:8fdf9a60065b 803 {"Testing parallel threads", test_parallel_threads<3, increment>, DEFAULT_HANDLERS},
kadonotakashi 0:8fdf9a60065b 804 {"Testing serial threads", test_serial_threads<10, increment>, DEFAULT_HANDLERS},
kadonotakashi 0:8fdf9a60065b 805
kadonotakashi 0:8fdf9a60065b 806 {"Testing single thread with yield", test_single_thread<increment_with_yield>, DEFAULT_HANDLERS},
kadonotakashi 0:8fdf9a60065b 807 {"Testing parallel threads with yield", test_parallel_threads<3, increment_with_yield>, DEFAULT_HANDLERS},
kadonotakashi 0:8fdf9a60065b 808 {"Testing serial threads with yield", test_serial_threads<10, increment_with_yield>, DEFAULT_HANDLERS},
kadonotakashi 0:8fdf9a60065b 809
kadonotakashi 0:8fdf9a60065b 810 {"Testing single thread with wait", test_single_thread<increment_with_wait>, DEFAULT_HANDLERS},
kadonotakashi 0:8fdf9a60065b 811 {"Testing parallel threads with wait", test_parallel_threads<3, increment_with_wait>, DEFAULT_HANDLERS},
kadonotakashi 0:8fdf9a60065b 812 {"Testing serial threads with wait", test_serial_threads<10, increment_with_wait>, DEFAULT_HANDLERS},
kadonotakashi 0:8fdf9a60065b 813
kadonotakashi 0:8fdf9a60065b 814 {"Testing single thread with child", test_single_thread<increment_with_child>, DEFAULT_HANDLERS},
kadonotakashi 0:8fdf9a60065b 815 {"Testing parallel threads with child", test_parallel_threads<2, increment_with_child>, DEFAULT_HANDLERS},
kadonotakashi 0:8fdf9a60065b 816 {"Testing serial threads with child", test_serial_threads<10, increment_with_child>, DEFAULT_HANDLERS},
kadonotakashi 0:8fdf9a60065b 817
kadonotakashi 0:8fdf9a60065b 818 {"Testing single thread with murder", test_single_thread<increment_with_murder>, DEFAULT_HANDLERS},
kadonotakashi 0:8fdf9a60065b 819 {"Testing parallel threads with murder", test_parallel_threads<2, increment_with_murder>, DEFAULT_HANDLERS},
kadonotakashi 0:8fdf9a60065b 820 {"Testing serial threads with murder", test_serial_threads<10, increment_with_murder>, DEFAULT_HANDLERS},
kadonotakashi 0:8fdf9a60065b 821
kadonotakashi 0:8fdf9a60065b 822 {"Testing thread self terminate", test_self_terminate, DEFAULT_HANDLERS},
kadonotakashi 0:8fdf9a60065b 823
kadonotakashi 0:8fdf9a60065b 824 {"Testing thread flags: wait", test_thread_flags_set<0x1, flags_wait>, DEFAULT_HANDLERS},
kadonotakashi 0:8fdf9a60065b 825 {"Testing thread flags: timeout", test_thread_flags_set<0x1, flags_wait_tout>, DEFAULT_HANDLERS},
kadonotakashi 0:8fdf9a60065b 826 {"Testing thread flags: multi-bit all", test_thread_flags_set<0x3, flags_wait_multibit>, DEFAULT_HANDLERS},
kadonotakashi 0:8fdf9a60065b 827 {"Testing thread flags: multi-bit all timeout", test_thread_flags_set<0x1, flags_wait_multibit_tout>, DEFAULT_HANDLERS},
kadonotakashi 0:8fdf9a60065b 828 {"Testing thread flags: multi-bit any", test_thread_flags_set<0x1, flags_wait_multibit_any>, DEFAULT_HANDLERS},
kadonotakashi 0:8fdf9a60065b 829 {"Testing thread flags: flags clear", test_thread_flags_clear, DEFAULT_HANDLERS},
kadonotakashi 0:8fdf9a60065b 830
kadonotakashi 0:8fdf9a60065b 831 {"Testing thread stack info", test_thread_stack_info, DEFAULT_HANDLERS},
kadonotakashi 0:8fdf9a60065b 832 {"Testing thread wait", test_thread_wait, DEFAULT_HANDLERS},
kadonotakashi 0:8fdf9a60065b 833 {"Testing thread name", test_thread_name, DEFAULT_HANDLERS},
kadonotakashi 0:8fdf9a60065b 834
kadonotakashi 0:8fdf9a60065b 835 {"Testing thread states: deleted", test_deleted, DEFAULT_HANDLERS},
kadonotakashi 0:8fdf9a60065b 836 {"Testing thread states: wait delay", test_delay, DEFAULT_HANDLERS},
kadonotakashi 0:8fdf9a60065b 837 {"Testing thread states: wait thread flags", test_thread_flags, DEFAULT_HANDLERS},
kadonotakashi 0:8fdf9a60065b 838 {"Testing thread states: wait event flag", test_evt_flag, DEFAULT_HANDLERS},
kadonotakashi 0:8fdf9a60065b 839 {"Testing thread states: wait mutex", test_mutex, DEFAULT_HANDLERS},
kadonotakashi 0:8fdf9a60065b 840 {"Testing thread states: wait semaphore", test_semaphore, DEFAULT_HANDLERS},
kadonotakashi 0:8fdf9a60065b 841 {"Testing thread states: wait message get", test_msg_get, DEFAULT_HANDLERS},
kadonotakashi 0:8fdf9a60065b 842 {"Testing thread states: wait message put", test_msg_put, DEFAULT_HANDLERS},
kadonotakashi 0:8fdf9a60065b 843
kadonotakashi 0:8fdf9a60065b 844 {"Testing thread with external stack memory", test_thread_ext_stack, DEFAULT_HANDLERS},
kadonotakashi 0:8fdf9a60065b 845 {"Testing thread priority ops", test_thread_prio, DEFAULT_HANDLERS}
kadonotakashi 0:8fdf9a60065b 846
kadonotakashi 0:8fdf9a60065b 847 };
kadonotakashi 0:8fdf9a60065b 848
kadonotakashi 0:8fdf9a60065b 849 Specification specification(test_setup, cases);
kadonotakashi 0:8fdf9a60065b 850
kadonotakashi 0:8fdf9a60065b 851 int main()
kadonotakashi 0:8fdf9a60065b 852 {
kadonotakashi 0:8fdf9a60065b 853 return !Harness::run(specification);
kadonotakashi 0:8fdf9a60065b 854 }