mbed-rtos test programs for DISCO_F746NG. #Test for thread, mutex, semaphore, signals, queues, mail, ISR

Dependencies:   mbed-rtos mbed-src

Committer:
mzta
Date:
Wed Nov 11 07:53:46 2015 +0000
Revision:
0:225c1da086a1
Initial commit.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mzta 0:225c1da086a1 1 #include "mbed.h"
mzta 0:225c1da086a1 2 #include "test_env.h"
mzta 0:225c1da086a1 3 #include "rtos.h"
mzta 0:225c1da086a1 4
mzta 0:225c1da086a1 5 /********************
mzta 0:225c1da086a1 6 * Switch test case
mzta 0:225c1da086a1 7 ********************/
mzta 0:225c1da086a1 8 #define TEST_84_BASIC
mzta 0:225c1da086a1 9 //#define TEST_85_MUTEX
mzta 0:225c1da086a1 10 //#define TEST_86_SEMAPHORE
mzta 0:225c1da086a1 11 //#define TEST_87_SIGNALS
mzta 0:225c1da086a1 12 //#define TEST_88_QUEUE
mzta 0:225c1da086a1 13 //#define TEST_89_MAIL
mzta 0:225c1da086a1 14 //#define TEST_90_TIMER
mzta 0:225c1da086a1 15 //#define TEST_91_ISR
mzta 0:225c1da086a1 16
mzta 0:225c1da086a1 17 #if defined(TEST_84_BASIC)
mzta 0:225c1da086a1 18
mzta 0:225c1da086a1 19 /*
mzta 0:225c1da086a1 20 * The stack size is defined in cmsis_os.h mainly dependent on the underlying toolchain and
mzta 0:225c1da086a1 21 * the C standard library. For GCC, ARM_STD and IAR it is defined with a size of 2048 bytes
mzta 0:225c1da086a1 22 * and for ARM_MICRO 512. Because of reduce RAM size some targets need a reduced stacksize.
mzta 0:225c1da086a1 23 */
mzta 0:225c1da086a1 24 #if (defined(TARGET_STM32L053R8) || defined(TARGET_STM32L053C8)) && defined(TOOLCHAIN_GCC)
mzta 0:225c1da086a1 25 #define STACK_SIZE DEFAULT_STACK_SIZE/2
mzta 0:225c1da086a1 26 #elif (defined(TARGET_STM32F030R8) || defined(TARGET_STM32F070RB)) && defined(TOOLCHAIN_GCC)
mzta 0:225c1da086a1 27 #define STACK_SIZE DEFAULT_STACK_SIZE/2
mzta 0:225c1da086a1 28 #elif (defined(TARGET_STM32F030R8)) && defined(TOOLCHAIN_IAR)
mzta 0:225c1da086a1 29 #define STACK_SIZE DEFAULT_STACK_SIZE/2
mzta 0:225c1da086a1 30 #else
mzta 0:225c1da086a1 31 #define STACK_SIZE DEFAULT_STACK_SIZE
mzta 0:225c1da086a1 32 #endif
mzta 0:225c1da086a1 33
mzta 0:225c1da086a1 34 void print_char(char c = '*') {
mzta 0:225c1da086a1 35 printf("%c", c);
mzta 0:225c1da086a1 36 fflush(stdout);
mzta 0:225c1da086a1 37 }
mzta 0:225c1da086a1 38
mzta 0:225c1da086a1 39 DigitalOut led1(LED1);
mzta 0:225c1da086a1 40 DigitalOut led2(LED2);
mzta 0:225c1da086a1 41
mzta 0:225c1da086a1 42 void led2_thread(void const *argument) {
mzta 0:225c1da086a1 43 while (true) {
mzta 0:225c1da086a1 44 led2 = !led2;
mzta 0:225c1da086a1 45 Thread::wait(1000);
mzta 0:225c1da086a1 46 print_char();
mzta 0:225c1da086a1 47 }
mzta 0:225c1da086a1 48 }
mzta 0:225c1da086a1 49
mzta 0:225c1da086a1 50 int main() {
mzta 0:225c1da086a1 51 MBED_HOSTTEST_TIMEOUT(15);
mzta 0:225c1da086a1 52 MBED_HOSTTEST_SELECT(wait_us_auto);
mzta 0:225c1da086a1 53 MBED_HOSTTEST_DESCRIPTION(Basic thread);
mzta 0:225c1da086a1 54 MBED_HOSTTEST_START("RTOS_1");
mzta 0:225c1da086a1 55
mzta 0:225c1da086a1 56 Thread thread(led2_thread, NULL, osPriorityNormal, STACK_SIZE);
mzta 0:225c1da086a1 57
mzta 0:225c1da086a1 58 while (true) {
mzta 0:225c1da086a1 59 led1 = !led1;
mzta 0:225c1da086a1 60 Thread::wait(500);
mzta 0:225c1da086a1 61 }
mzta 0:225c1da086a1 62 }
mzta 0:225c1da086a1 63
mzta 0:225c1da086a1 64 #elif defined(TEST_85_MUTEX)
mzta 0:225c1da086a1 65
mzta 0:225c1da086a1 66 #define THREAD_DELAY 50
mzta 0:225c1da086a1 67 #define SIGNALS_TO_EMIT 100
mzta 0:225c1da086a1 68
mzta 0:225c1da086a1 69 /*
mzta 0:225c1da086a1 70 * The stack size is defined in cmsis_os.h mainly dependent on the underlying toolchain and
mzta 0:225c1da086a1 71 * the C standard library. For GCC, ARM_STD and IAR it is defined with a size of 2048 bytes
mzta 0:225c1da086a1 72 * and for ARM_MICRO 512. Because of reduce RAM size some targets need a reduced stacksize.
mzta 0:225c1da086a1 73 */
mzta 0:225c1da086a1 74 #if (defined(TARGET_STM32L053R8) || defined(TARGET_STM32L053C8)) && defined(TOOLCHAIN_GCC)
mzta 0:225c1da086a1 75 #define STACK_SIZE DEFAULT_STACK_SIZE/4
mzta 0:225c1da086a1 76 #elif (defined(TARGET_STM32F030R8) || defined(TARGET_STM32F070RB)) && defined(TOOLCHAIN_GCC)
mzta 0:225c1da086a1 77 #define STACK_SIZE DEFAULT_STACK_SIZE/4
mzta 0:225c1da086a1 78 #elif defined(TARGET_STM32F334R8) && defined(TOOLCHAIN_IAR)
mzta 0:225c1da086a1 79 #define STACK_SIZE DEFAULT_STACK_SIZE/4
mzta 0:225c1da086a1 80 #elif defined(TARGET_STM32F030R8) && defined(TOOLCHAIN_IAR)
mzta 0:225c1da086a1 81 #define STACK_SIZE DEFAULT_STACK_SIZE/4
mzta 0:225c1da086a1 82 #elif defined(TARGET_STM32F070RB) && defined(TOOLCHAIN_IAR)
mzta 0:225c1da086a1 83 #define STACK_SIZE DEFAULT_STACK_SIZE/2
mzta 0:225c1da086a1 84 #elif defined(TARGET_STM32F072RB) && defined(TOOLCHAIN_IAR)
mzta 0:225c1da086a1 85 #define STACK_SIZE DEFAULT_STACK_SIZE/2
mzta 0:225c1da086a1 86 #elif defined(TARGET_STM32F302R8) && defined(TOOLCHAIN_IAR)
mzta 0:225c1da086a1 87 #define STACK_SIZE DEFAULT_STACK_SIZE/2
mzta 0:225c1da086a1 88 #else
mzta 0:225c1da086a1 89 #define STACK_SIZE DEFAULT_STACK_SIZE
mzta 0:225c1da086a1 90 #endif
mzta 0:225c1da086a1 91
mzta 0:225c1da086a1 92 void print_char(char c = '*') {
mzta 0:225c1da086a1 93 printf("%c", c);
mzta 0:225c1da086a1 94 fflush(stdout);
mzta 0:225c1da086a1 95 }
mzta 0:225c1da086a1 96
mzta 0:225c1da086a1 97 Mutex stdio_mutex;
mzta 0:225c1da086a1 98 DigitalOut led(LED1);
mzta 0:225c1da086a1 99
mzta 0:225c1da086a1 100 volatile int change_counter = 0;
mzta 0:225c1da086a1 101 volatile bool changing_counter = false;
mzta 0:225c1da086a1 102 volatile bool mutex_defect = false;
mzta 0:225c1da086a1 103
mzta 0:225c1da086a1 104 bool manipulate_protected_zone(const int thread_delay) {
mzta 0:225c1da086a1 105 bool result = true;
mzta 0:225c1da086a1 106
mzta 0:225c1da086a1 107 stdio_mutex.lock(); // LOCK
mzta 0:225c1da086a1 108 if (changing_counter == true) {
mzta 0:225c1da086a1 109 // 'e' stands for error. If changing_counter is true access is not exclusively
mzta 0:225c1da086a1 110 print_char('e');
mzta 0:225c1da086a1 111 result = false;
mzta 0:225c1da086a1 112 mutex_defect = true;
mzta 0:225c1da086a1 113 }
mzta 0:225c1da086a1 114 changing_counter = true;
mzta 0:225c1da086a1 115
mzta 0:225c1da086a1 116 // Some action on protected
mzta 0:225c1da086a1 117 led = !led;
mzta 0:225c1da086a1 118 change_counter++;
mzta 0:225c1da086a1 119 print_char('.');
mzta 0:225c1da086a1 120 Thread::wait(thread_delay);
mzta 0:225c1da086a1 121
mzta 0:225c1da086a1 122 changing_counter = false;
mzta 0:225c1da086a1 123 stdio_mutex.unlock(); // UNLOCK
mzta 0:225c1da086a1 124 return result;
mzta 0:225c1da086a1 125 }
mzta 0:225c1da086a1 126
mzta 0:225c1da086a1 127 void test_thread(void const *args) {
mzta 0:225c1da086a1 128 const int thread_delay = int(args);
mzta 0:225c1da086a1 129 while (true) {
mzta 0:225c1da086a1 130 manipulate_protected_zone(thread_delay);
mzta 0:225c1da086a1 131 }
mzta 0:225c1da086a1 132 }
mzta 0:225c1da086a1 133
mzta 0:225c1da086a1 134 int main() {
mzta 0:225c1da086a1 135 MBED_HOSTTEST_TIMEOUT(20);
mzta 0:225c1da086a1 136 MBED_HOSTTEST_SELECT(default);
mzta 0:225c1da086a1 137 MBED_HOSTTEST_DESCRIPTION(Mutex resource lock);
mzta 0:225c1da086a1 138 MBED_HOSTTEST_START("RTOS_2");
mzta 0:225c1da086a1 139
mzta 0:225c1da086a1 140 const int t1_delay = THREAD_DELAY * 1;
mzta 0:225c1da086a1 141 const int t2_delay = THREAD_DELAY * 2;
mzta 0:225c1da086a1 142 const int t3_delay = THREAD_DELAY * 3;
mzta 0:225c1da086a1 143 Thread t2(test_thread, (void *)t2_delay, osPriorityNormal, STACK_SIZE);
mzta 0:225c1da086a1 144 Thread t3(test_thread, (void *)t3_delay, osPriorityNormal, STACK_SIZE);
mzta 0:225c1da086a1 145
mzta 0:225c1da086a1 146 while (true) {
mzta 0:225c1da086a1 147 // Thread 1 action
mzta 0:225c1da086a1 148 Thread::wait(t1_delay);
mzta 0:225c1da086a1 149 manipulate_protected_zone(t1_delay);
mzta 0:225c1da086a1 150 if (change_counter >= SIGNALS_TO_EMIT or mutex_defect == true) {
mzta 0:225c1da086a1 151 t2.terminate();
mzta 0:225c1da086a1 152 t3.terminate();
mzta 0:225c1da086a1 153 break;
mzta 0:225c1da086a1 154 }
mzta 0:225c1da086a1 155 }
mzta 0:225c1da086a1 156
mzta 0:225c1da086a1 157 fflush(stdout);
mzta 0:225c1da086a1 158 MBED_HOSTTEST_RESULT(!mutex_defect);
mzta 0:225c1da086a1 159 return 0;
mzta 0:225c1da086a1 160 }
mzta 0:225c1da086a1 161
mzta 0:225c1da086a1 162 #elif defined(TEST_86_SEMAPHORE)
mzta 0:225c1da086a1 163
mzta 0:225c1da086a1 164 #define THREAD_DELAY 75
mzta 0:225c1da086a1 165 #define SEMAPHORE_SLOTS 2
mzta 0:225c1da086a1 166 #define SEM_CHANGES 100
mzta 0:225c1da086a1 167
mzta 0:225c1da086a1 168 /*
mzta 0:225c1da086a1 169 * The stack size is defined in cmsis_os.h mainly dependent on the underlying toolchain and
mzta 0:225c1da086a1 170 * the C standard library. For GCC, ARM_STD and IAR it is defined with a size of 2048 bytes
mzta 0:225c1da086a1 171 * and for ARM_MICRO 512. Because of reduce RAM size some targets need a reduced stacksize.
mzta 0:225c1da086a1 172 */
mzta 0:225c1da086a1 173 #if (defined(TARGET_STM32L053R8) || defined(TARGET_STM32L053C8)) && defined(TOOLCHAIN_GCC)
mzta 0:225c1da086a1 174 #define STACK_SIZE DEFAULT_STACK_SIZE/16
mzta 0:225c1da086a1 175 #elif (defined(TARGET_STM32F030R8) || defined(TARGET_STM32F070RB)) && defined(TOOLCHAIN_GCC)
mzta 0:225c1da086a1 176 #define STACK_SIZE DEFAULT_STACK_SIZE/8
mzta 0:225c1da086a1 177 #elif defined(TARGET_STM32F334R8) && (defined(TOOLCHAIN_GCC) || defined(TOOLCHAIN_IAR))
mzta 0:225c1da086a1 178 #define STACK_SIZE DEFAULT_STACK_SIZE/4
mzta 0:225c1da086a1 179 #elif defined(TARGET_STM32F103RB) && defined(TOOLCHAIN_IAR)
mzta 0:225c1da086a1 180 #define STACK_SIZE DEFAULT_STACK_SIZE/4
mzta 0:225c1da086a1 181 #elif defined(TARGET_STM32F030R8) && defined(TOOLCHAIN_IAR)
mzta 0:225c1da086a1 182 #define STACK_SIZE DEFAULT_STACK_SIZE/4
mzta 0:225c1da086a1 183 #elif defined(TARGET_STM32F070RB) && defined(TOOLCHAIN_IAR)
mzta 0:225c1da086a1 184 #define STACK_SIZE DEFAULT_STACK_SIZE/2
mzta 0:225c1da086a1 185 #elif defined(TARGET_STM32F072RB) && defined(TOOLCHAIN_IAR)
mzta 0:225c1da086a1 186 #define STACK_SIZE DEFAULT_STACK_SIZE/2
mzta 0:225c1da086a1 187 #elif defined(TARGET_STM32F302R8) && defined(TOOLCHAIN_IAR)
mzta 0:225c1da086a1 188 #define STACK_SIZE DEFAULT_STACK_SIZE/2
mzta 0:225c1da086a1 189 #else
mzta 0:225c1da086a1 190 #define STACK_SIZE DEFAULT_STACK_SIZE
mzta 0:225c1da086a1 191 #endif
mzta 0:225c1da086a1 192
mzta 0:225c1da086a1 193 void print_char(char c = '*') {
mzta 0:225c1da086a1 194 printf("%c", c);
mzta 0:225c1da086a1 195 fflush(stdout);
mzta 0:225c1da086a1 196 }
mzta 0:225c1da086a1 197
mzta 0:225c1da086a1 198 #define ORIGINAL 1
mzta 0:225c1da086a1 199 #undef ORIGINAL
mzta 0:225c1da086a1 200
mzta 0:225c1da086a1 201 #if ORIGINAL
mzta 0:225c1da086a1 202 Semaphore two_slots(SEMAPHORE_SLOTS);
mzta 0:225c1da086a1 203 #else
mzta 0:225c1da086a1 204 Semaphore *two_slots;
mzta 0:225c1da086a1 205 #endif
mzta 0:225c1da086a1 206
mzta 0:225c1da086a1 207 volatile int change_counter = 0;
mzta 0:225c1da086a1 208 volatile int sem_counter = 0;
mzta 0:225c1da086a1 209 volatile bool sem_defect = false;
mzta 0:225c1da086a1 210
mzta 0:225c1da086a1 211 void test_thread(void const *delay) {
mzta 0:225c1da086a1 212 const int thread_delay = int(delay);
mzta 0:225c1da086a1 213 while (true) {
mzta 0:225c1da086a1 214 #if ORIGINAL
mzta 0:225c1da086a1 215 two_slots.wait();
mzta 0:225c1da086a1 216 #else
mzta 0:225c1da086a1 217 two_slots->wait();
mzta 0:225c1da086a1 218 #endif
mzta 0:225c1da086a1 219 sem_counter++;
mzta 0:225c1da086a1 220 const bool sem_lock_failed = sem_counter > SEMAPHORE_SLOTS;
mzta 0:225c1da086a1 221 const char msg = sem_lock_failed ? 'e' : sem_counter + '0';
mzta 0:225c1da086a1 222 print_char(msg);
mzta 0:225c1da086a1 223 if (sem_lock_failed) {
mzta 0:225c1da086a1 224 sem_defect = true;
mzta 0:225c1da086a1 225 }
mzta 0:225c1da086a1 226 Thread::wait(thread_delay);
mzta 0:225c1da086a1 227 print_char('.');
mzta 0:225c1da086a1 228 sem_counter--;
mzta 0:225c1da086a1 229 change_counter++;
mzta 0:225c1da086a1 230 #if ORIGINAL
mzta 0:225c1da086a1 231 two_slots.release();
mzta 0:225c1da086a1 232 #else
mzta 0:225c1da086a1 233 two_slots->release();
mzta 0:225c1da086a1 234 #endif
mzta 0:225c1da086a1 235 }
mzta 0:225c1da086a1 236 }
mzta 0:225c1da086a1 237
mzta 0:225c1da086a1 238 int main (void) {
mzta 0:225c1da086a1 239
mzta 0:225c1da086a1 240 #ifndef ORIGINAL
mzta 0:225c1da086a1 241 two_slots = new Semaphore(SEMAPHORE_SLOTS);
mzta 0:225c1da086a1 242 #endif
mzta 0:225c1da086a1 243
mzta 0:225c1da086a1 244 MBED_HOSTTEST_TIMEOUT(20);
mzta 0:225c1da086a1 245 MBED_HOSTTEST_SELECT(default_auto);
mzta 0:225c1da086a1 246 MBED_HOSTTEST_DESCRIPTION(Semaphore resource lock);
mzta 0:225c1da086a1 247 MBED_HOSTTEST_START("RTOS_3");
mzta 0:225c1da086a1 248
mzta 0:225c1da086a1 249 const int t1_delay = THREAD_DELAY * 1;
mzta 0:225c1da086a1 250 const int t2_delay = THREAD_DELAY * 2;
mzta 0:225c1da086a1 251 const int t3_delay = THREAD_DELAY * 3;
mzta 0:225c1da086a1 252 Thread t1(test_thread, (void *)t1_delay, osPriorityNormal, STACK_SIZE);
mzta 0:225c1da086a1 253 Thread t2(test_thread, (void *)t2_delay, osPriorityNormal, STACK_SIZE);
mzta 0:225c1da086a1 254 Thread t3(test_thread, (void *)t3_delay, osPriorityNormal, STACK_SIZE);
mzta 0:225c1da086a1 255
mzta 0:225c1da086a1 256 while (true) {
mzta 0:225c1da086a1 257 if (change_counter >= SEM_CHANGES or sem_defect == true) {
mzta 0:225c1da086a1 258 t1.terminate();
mzta 0:225c1da086a1 259 t2.terminate();
mzta 0:225c1da086a1 260 t3.terminate();
mzta 0:225c1da086a1 261 break;
mzta 0:225c1da086a1 262 }
mzta 0:225c1da086a1 263 }
mzta 0:225c1da086a1 264
mzta 0:225c1da086a1 265 fflush(stdout);
mzta 0:225c1da086a1 266 MBED_HOSTTEST_RESULT(!sem_defect);
mzta 0:225c1da086a1 267 return 0;
mzta 0:225c1da086a1 268 }
mzta 0:225c1da086a1 269
mzta 0:225c1da086a1 270 #elif defined(TEST_87_SIGNALS)
mzta 0:225c1da086a1 271
mzta 0:225c1da086a1 272 #define SIGNALS_TO_EMIT 100
mzta 0:225c1da086a1 273 #define SIGNAL_HANDLE_DELEY 25
mzta 0:225c1da086a1 274 #define SIGNAL_SET_VALUE 0x01
mzta 0:225c1da086a1 275
mzta 0:225c1da086a1 276 /*
mzta 0:225c1da086a1 277 * The stack size is defined in cmsis_os.h mainly dependent on the underlying toolchain and
mzta 0:225c1da086a1 278 * the C standard library. For GCC, ARM_STD and IAR it is defined with a size of 2048 bytes
mzta 0:225c1da086a1 279 * and for ARM_MICRO 512. Because of reduce RAM size some targets need a reduced stacksize.
mzta 0:225c1da086a1 280 */
mzta 0:225c1da086a1 281 #if defined(TARGET_STM32L053R8) || defined(TARGET_STM32L053C8)
mzta 0:225c1da086a1 282 #define STACK_SIZE DEFAULT_STACK_SIZE/4
mzta 0:225c1da086a1 283 #elif (defined(TARGET_STM32F030R8)) && defined(TOOLCHAIN_IAR)
mzta 0:225c1da086a1 284 #define STACK_SIZE DEFAULT_STACK_SIZE/2
mzta 0:225c1da086a1 285 #else
mzta 0:225c1da086a1 286 #define STACK_SIZE DEFAULT_STACK_SIZE
mzta 0:225c1da086a1 287 #endif
mzta 0:225c1da086a1 288
mzta 0:225c1da086a1 289 DigitalOut led(LED1);
mzta 0:225c1da086a1 290 volatile int signal_counter = 0;
mzta 0:225c1da086a1 291
mzta 0:225c1da086a1 292 void led_thread(void const *argument) {
mzta 0:225c1da086a1 293 while (true) {
mzta 0:225c1da086a1 294 // Signal flags that are reported as event are automatically cleared.
mzta 0:225c1da086a1 295 Thread::signal_wait(SIGNAL_SET_VALUE);
mzta 0:225c1da086a1 296 led = !led;
mzta 0:225c1da086a1 297 signal_counter++;
mzta 0:225c1da086a1 298 }
mzta 0:225c1da086a1 299 }
mzta 0:225c1da086a1 300
mzta 0:225c1da086a1 301 int main (void) {
mzta 0:225c1da086a1 302 MBED_HOSTTEST_TIMEOUT(20);
mzta 0:225c1da086a1 303 MBED_HOSTTEST_SELECT(default_auto);
mzta 0:225c1da086a1 304 MBED_HOSTTEST_DESCRIPTION(Signals messaging);
mzta 0:225c1da086a1 305 MBED_HOSTTEST_START("RTOS_4");
mzta 0:225c1da086a1 306
mzta 0:225c1da086a1 307 Thread thread(led_thread, NULL, osPriorityNormal, STACK_SIZE);
mzta 0:225c1da086a1 308 bool result = true;
mzta 0:225c1da086a1 309
mzta 0:225c1da086a1 310 while (true) {
mzta 0:225c1da086a1 311 Thread::wait(2 * SIGNAL_HANDLE_DELEY);
mzta 0:225c1da086a1 312 thread.signal_set(SIGNAL_SET_VALUE);
mzta 0:225c1da086a1 313 if (signal_counter == SIGNALS_TO_EMIT) {
mzta 0:225c1da086a1 314 printf("Handled %d signals\r\n", signal_counter);
mzta 0:225c1da086a1 315 break;
mzta 0:225c1da086a1 316 }
mzta 0:225c1da086a1 317 }
mzta 0:225c1da086a1 318 MBED_HOSTTEST_RESULT(result);
mzta 0:225c1da086a1 319 return 0;
mzta 0:225c1da086a1 320 }
mzta 0:225c1da086a1 321
mzta 0:225c1da086a1 322 #elif defined(TEST_88_QUEUE)
mzta 0:225c1da086a1 323
mzta 0:225c1da086a1 324 typedef struct {
mzta 0:225c1da086a1 325 float voltage; /* AD result of measured voltage */
mzta 0:225c1da086a1 326 float current; /* AD result of measured current */
mzta 0:225c1da086a1 327 uint32_t counter; /* A counter value */
mzta 0:225c1da086a1 328 } message_t;
mzta 0:225c1da086a1 329
mzta 0:225c1da086a1 330 #define CREATE_VOLTAGE(COUNTER) (COUNTER * 0.1) * 33
mzta 0:225c1da086a1 331 #define CREATE_CURRENT(COUNTER) (COUNTER * 0.1) * 11
mzta 0:225c1da086a1 332 #define QUEUE_SIZE 16
mzta 0:225c1da086a1 333 #define QUEUE_PUT_DELAY 100
mzta 0:225c1da086a1 334
mzta 0:225c1da086a1 335 /*
mzta 0:225c1da086a1 336 * The stack size is defined in cmsis_os.h mainly dependent on the underlying toolchain and
mzta 0:225c1da086a1 337 * the C standard library. For GCC, ARM_STD and IAR it is defined with a size of 2048 bytes
mzta 0:225c1da086a1 338 * and for ARM_MICRO 512. Because of reduce RAM size some targets need a reduced stacksize.
mzta 0:225c1da086a1 339 */
mzta 0:225c1da086a1 340 #if (defined(TARGET_STM32L053R8) || defined(TARGET_STM32L053C8)) && defined(TOOLCHAIN_GCC)
mzta 0:225c1da086a1 341 #define STACK_SIZE DEFAULT_STACK_SIZE/4
mzta 0:225c1da086a1 342 #elif (defined(TARGET_STM32F030R8)) && defined(TOOLCHAIN_GCC)
mzta 0:225c1da086a1 343 #define STACK_SIZE DEFAULT_STACK_SIZE/4
mzta 0:225c1da086a1 344 #elif (defined(TARGET_STM32F030R8)) && defined(TOOLCHAIN_IAR)
mzta 0:225c1da086a1 345 #define STACK_SIZE DEFAULT_STACK_SIZE/2
mzta 0:225c1da086a1 346 #else
mzta 0:225c1da086a1 347 #define STACK_SIZE DEFAULT_STACK_SIZE
mzta 0:225c1da086a1 348 #endif
mzta 0:225c1da086a1 349
mzta 0:225c1da086a1 350 MemoryPool<message_t, QUEUE_SIZE> mpool;
mzta 0:225c1da086a1 351 Queue<message_t, QUEUE_SIZE> queue;
mzta 0:225c1da086a1 352
mzta 0:225c1da086a1 353 /* Send Thread */
mzta 0:225c1da086a1 354 void send_thread (void const *argument) {
mzta 0:225c1da086a1 355 static uint32_t i = 10;
mzta 0:225c1da086a1 356 while (true) {
mzta 0:225c1da086a1 357 i++; // Fake data update
mzta 0:225c1da086a1 358 message_t *message = mpool.alloc();
mzta 0:225c1da086a1 359 message->voltage = CREATE_VOLTAGE(i);
mzta 0:225c1da086a1 360 message->current = CREATE_CURRENT(i);
mzta 0:225c1da086a1 361 message->counter = i;
mzta 0:225c1da086a1 362 queue.put(message);
mzta 0:225c1da086a1 363 Thread::wait(QUEUE_PUT_DELAY);
mzta 0:225c1da086a1 364 }
mzta 0:225c1da086a1 365 }
mzta 0:225c1da086a1 366
mzta 0:225c1da086a1 367 int main (void) {
mzta 0:225c1da086a1 368 MBED_HOSTTEST_TIMEOUT(20);
mzta 0:225c1da086a1 369 MBED_HOSTTEST_SELECT(default_auto);
mzta 0:225c1da086a1 370 MBED_HOSTTEST_DESCRIPTION(Queue messaging);
mzta 0:225c1da086a1 371 MBED_HOSTTEST_START("RTOS_5");
mzta 0:225c1da086a1 372
mzta 0:225c1da086a1 373 Thread thread(send_thread, NULL, osPriorityNormal, STACK_SIZE);
mzta 0:225c1da086a1 374 bool result = true;
mzta 0:225c1da086a1 375 int result_counter = 0;
mzta 0:225c1da086a1 376
mzta 0:225c1da086a1 377 while (true) {
mzta 0:225c1da086a1 378 osEvent evt = queue.get();
mzta 0:225c1da086a1 379 if (evt.status == osEventMessage) {
mzta 0:225c1da086a1 380 message_t *message = (message_t*)evt.value.p;
mzta 0:225c1da086a1 381 const float expected_voltage = CREATE_VOLTAGE(message->counter);
mzta 0:225c1da086a1 382 const float expected_current = CREATE_CURRENT(message->counter);
mzta 0:225c1da086a1 383 // Check using macros if received values correspond to values sent via queue
mzta 0:225c1da086a1 384 bool expected_values = (expected_voltage == message->voltage) &&
mzta 0:225c1da086a1 385 (expected_current == message->current);
mzta 0:225c1da086a1 386 result = result && expected_values;
mzta 0:225c1da086a1 387 const char *result_msg = expected_values ? "OK" : "FAIL";
mzta 0:225c1da086a1 388 printf("%3d %.2fV %.2fA ... [%s]\r\n", message->counter,
mzta 0:225c1da086a1 389 message->voltage,
mzta 0:225c1da086a1 390 message->current,
mzta 0:225c1da086a1 391 result_msg);
mzta 0:225c1da086a1 392 mpool.free(message);
mzta 0:225c1da086a1 393 if (result == false || ++result_counter == QUEUE_SIZE) {
mzta 0:225c1da086a1 394 break;
mzta 0:225c1da086a1 395 }
mzta 0:225c1da086a1 396 }
mzta 0:225c1da086a1 397 }
mzta 0:225c1da086a1 398 MBED_HOSTTEST_RESULT(result);
mzta 0:225c1da086a1 399 return 0;
mzta 0:225c1da086a1 400 }
mzta 0:225c1da086a1 401
mzta 0:225c1da086a1 402 #elif defined(TEST_89_MAIL)
mzta 0:225c1da086a1 403
mzta 0:225c1da086a1 404 typedef struct {
mzta 0:225c1da086a1 405 float voltage; /* AD result of measured voltage */
mzta 0:225c1da086a1 406 float current; /* AD result of measured current */
mzta 0:225c1da086a1 407 uint32_t counter; /* A counter value */
mzta 0:225c1da086a1 408 } mail_t;
mzta 0:225c1da086a1 409
mzta 0:225c1da086a1 410 #define CREATE_VOLTAGE(COUNTER) (COUNTER * 0.1) * 33
mzta 0:225c1da086a1 411 #define CREATE_CURRENT(COUNTER) (COUNTER * 0.1) * 11
mzta 0:225c1da086a1 412 #define QUEUE_SIZE 16
mzta 0:225c1da086a1 413 #define QUEUE_PUT_DELAY 100
mzta 0:225c1da086a1 414
mzta 0:225c1da086a1 415 /*
mzta 0:225c1da086a1 416 * The stack size is defined in cmsis_os.h mainly dependent on the underlying toolchain and
mzta 0:225c1da086a1 417 * the C standard library. For GCC, ARM_STD and IAR it is defined with a size of 2048 bytes
mzta 0:225c1da086a1 418 * and for ARM_MICRO 512. Because of reduce RAM size some targets need a reduced stacksize.
mzta 0:225c1da086a1 419 */
mzta 0:225c1da086a1 420 #if (defined(TARGET_STM32L053R8) || defined(TARGET_STM32L053C8)) && defined(TOOLCHAIN_GCC)
mzta 0:225c1da086a1 421 #define STACK_SIZE DEFAULT_STACK_SIZE/4
mzta 0:225c1da086a1 422 #elif (defined(TARGET_STM32F030R8)) && defined(TOOLCHAIN_GCC)
mzta 0:225c1da086a1 423 #define STACK_SIZE DEFAULT_STACK_SIZE/2
mzta 0:225c1da086a1 424 #elif (defined(TARGET_STM32F030R8)) && defined(TOOLCHAIN_IAR)
mzta 0:225c1da086a1 425 #define STACK_SIZE DEFAULT_STACK_SIZE/2
mzta 0:225c1da086a1 426 #else
mzta 0:225c1da086a1 427 #define STACK_SIZE DEFAULT_STACK_SIZE
mzta 0:225c1da086a1 428 #endif
mzta 0:225c1da086a1 429
mzta 0:225c1da086a1 430 Mail<mail_t, QUEUE_SIZE> mail_box;
mzta 0:225c1da086a1 431
mzta 0:225c1da086a1 432 void send_thread (void const *argument) {
mzta 0:225c1da086a1 433 static uint32_t i = 10;
mzta 0:225c1da086a1 434 while (true) {
mzta 0:225c1da086a1 435 i++; // fake data update
mzta 0:225c1da086a1 436 mail_t *mail = mail_box.alloc();
mzta 0:225c1da086a1 437 mail->voltage = CREATE_VOLTAGE(i);
mzta 0:225c1da086a1 438 mail->current = CREATE_CURRENT(i);
mzta 0:225c1da086a1 439 mail->counter = i;
mzta 0:225c1da086a1 440 mail_box.put(mail);
mzta 0:225c1da086a1 441 Thread::wait(QUEUE_PUT_DELAY);
mzta 0:225c1da086a1 442 }
mzta 0:225c1da086a1 443 }
mzta 0:225c1da086a1 444
mzta 0:225c1da086a1 445 int main (void) {
mzta 0:225c1da086a1 446 MBED_HOSTTEST_TIMEOUT(20);
mzta 0:225c1da086a1 447 MBED_HOSTTEST_SELECT(default_auto);
mzta 0:225c1da086a1 448 MBED_HOSTTEST_DESCRIPTION(Mail messaging);
mzta 0:225c1da086a1 449 MBED_HOSTTEST_START("RTOS_6");
mzta 0:225c1da086a1 450
mzta 0:225c1da086a1 451 Thread thread(send_thread, NULL, osPriorityNormal, STACK_SIZE);
mzta 0:225c1da086a1 452 bool result = true;
mzta 0:225c1da086a1 453 int result_counter = 0;
mzta 0:225c1da086a1 454
mzta 0:225c1da086a1 455 while (true) {
mzta 0:225c1da086a1 456 osEvent evt = mail_box.get();
mzta 0:225c1da086a1 457 if (evt.status == osEventMail) {
mzta 0:225c1da086a1 458 mail_t *mail = (mail_t*)evt.value.p;
mzta 0:225c1da086a1 459 const float expected_voltage = CREATE_VOLTAGE(mail->counter);
mzta 0:225c1da086a1 460 const float expected_current = CREATE_CURRENT(mail->counter);
mzta 0:225c1da086a1 461 // Check using macros if received values correspond to values sent via queue
mzta 0:225c1da086a1 462 bool expected_values = (expected_voltage == mail->voltage) &&
mzta 0:225c1da086a1 463 (expected_current == mail->current);
mzta 0:225c1da086a1 464 result = result && expected_values;
mzta 0:225c1da086a1 465 const char *result_msg = expected_values ? "OK" : "FAIL";
mzta 0:225c1da086a1 466 printf("%3d %.2fV %.2fA ... [%s]\r\n", mail->counter,
mzta 0:225c1da086a1 467 mail->voltage,
mzta 0:225c1da086a1 468 mail->current,
mzta 0:225c1da086a1 469 result_msg);
mzta 0:225c1da086a1 470 mail_box.free(mail);
mzta 0:225c1da086a1 471 if (result == false || ++result_counter == QUEUE_SIZE) {
mzta 0:225c1da086a1 472 break;
mzta 0:225c1da086a1 473 }
mzta 0:225c1da086a1 474 }
mzta 0:225c1da086a1 475 }
mzta 0:225c1da086a1 476 MBED_HOSTTEST_RESULT(result);
mzta 0:225c1da086a1 477 return 0;
mzta 0:225c1da086a1 478 }
mzta 0:225c1da086a1 479
mzta 0:225c1da086a1 480 #elif defined(TEST_90_TIMER)
mzta 0:225c1da086a1 481
mzta 0:225c1da086a1 482 DigitalOut LEDs[4] = {
mzta 0:225c1da086a1 483 DigitalOut(LED1), DigitalOut(LED2), DigitalOut(LED3), DigitalOut(LED4)
mzta 0:225c1da086a1 484 };
mzta 0:225c1da086a1 485
mzta 0:225c1da086a1 486 void print_char(char c = '*')
mzta 0:225c1da086a1 487 {
mzta 0:225c1da086a1 488 printf("%c", c);
mzta 0:225c1da086a1 489 fflush(stdout);
mzta 0:225c1da086a1 490 }
mzta 0:225c1da086a1 491
mzta 0:225c1da086a1 492 void blink(void const *n) {
mzta 0:225c1da086a1 493 static int counter = 0;
mzta 0:225c1da086a1 494 const int led_id = int(n);
mzta 0:225c1da086a1 495 LEDs[led_id] = !LEDs[led_id];
mzta 0:225c1da086a1 496 if (++counter == 75) {
mzta 0:225c1da086a1 497 print_char();
mzta 0:225c1da086a1 498 counter = 0;
mzta 0:225c1da086a1 499 }
mzta 0:225c1da086a1 500 }
mzta 0:225c1da086a1 501
mzta 0:225c1da086a1 502 int main(void) {
mzta 0:225c1da086a1 503 MBED_HOSTTEST_TIMEOUT(15);
mzta 0:225c1da086a1 504 MBED_HOSTTEST_SELECT(wait_us_auto);
mzta 0:225c1da086a1 505 MBED_HOSTTEST_DESCRIPTION(Timer);
mzta 0:225c1da086a1 506 MBED_HOSTTEST_START("RTOS_7");
mzta 0:225c1da086a1 507
mzta 0:225c1da086a1 508 RtosTimer led_1_timer(blink, osTimerPeriodic, (void *)0);
mzta 0:225c1da086a1 509 RtosTimer led_2_timer(blink, osTimerPeriodic, (void *)1);
mzta 0:225c1da086a1 510 RtosTimer led_3_timer(blink, osTimerPeriodic, (void *)2);
mzta 0:225c1da086a1 511 RtosTimer led_4_timer(blink, osTimerPeriodic, (void *)3);
mzta 0:225c1da086a1 512
mzta 0:225c1da086a1 513 led_1_timer.start(200);
mzta 0:225c1da086a1 514 led_2_timer.start(100);
mzta 0:225c1da086a1 515 led_3_timer.start(50);
mzta 0:225c1da086a1 516 led_4_timer.start(25);
mzta 0:225c1da086a1 517
mzta 0:225c1da086a1 518 Thread::wait(osWaitForever);
mzta 0:225c1da086a1 519 }
mzta 0:225c1da086a1 520
mzta 0:225c1da086a1 521 #elif defined(TEST_91_ISR)
mzta 0:225c1da086a1 522
mzta 0:225c1da086a1 523 #define QUEUE_SIZE 5
mzta 0:225c1da086a1 524 #define THREAD_DELAY 250
mzta 0:225c1da086a1 525 #define QUEUE_PUT_ISR_VALUE 128
mzta 0:225c1da086a1 526 #define QUEUE_PUT_THREAD_VALUE 127
mzta 0:225c1da086a1 527
mzta 0:225c1da086a1 528 /*
mzta 0:225c1da086a1 529 * The stack size is defined in cmsis_os.h mainly dependent on the underlying toolchain and
mzta 0:225c1da086a1 530 * the C standard library. For GCC, ARM_STD and IAR it is defined with a size of 2048 bytes
mzta 0:225c1da086a1 531 * and for ARM_MICRO 512. Because of reduce RAM size some targets need a reduced stacksize.
mzta 0:225c1da086a1 532 */
mzta 0:225c1da086a1 533 #if defined(TARGET_STM32L053R8) || defined(TARGET_STM32L053C8)
mzta 0:225c1da086a1 534 #define STACK_SIZE DEFAULT_STACK_SIZE/4
mzta 0:225c1da086a1 535 #elif (defined(TARGET_STM32F030R8)) && defined(TOOLCHAIN_IAR)
mzta 0:225c1da086a1 536 #define STACK_SIZE DEFAULT_STACK_SIZE/2
mzta 0:225c1da086a1 537 #else
mzta 0:225c1da086a1 538 #define STACK_SIZE DEFAULT_STACK_SIZE
mzta 0:225c1da086a1 539 #endif
mzta 0:225c1da086a1 540
mzta 0:225c1da086a1 541 Queue<uint32_t, QUEUE_SIZE> queue;
mzta 0:225c1da086a1 542
mzta 0:225c1da086a1 543 DigitalOut myled(LED1);
mzta 0:225c1da086a1 544
mzta 0:225c1da086a1 545 void queue_isr() {
mzta 0:225c1da086a1 546
mzta 0:225c1da086a1 547 queue.put((uint32_t*)QUEUE_PUT_ISR_VALUE);
mzta 0:225c1da086a1 548 myled = !myled;
mzta 0:225c1da086a1 549 }
mzta 0:225c1da086a1 550
mzta 0:225c1da086a1 551 void queue_thread(void const *argument) {
mzta 0:225c1da086a1 552 while (true) {
mzta 0:225c1da086a1 553 queue.put((uint32_t*)QUEUE_PUT_THREAD_VALUE);
mzta 0:225c1da086a1 554 Thread::wait(THREAD_DELAY);
mzta 0:225c1da086a1 555 }
mzta 0:225c1da086a1 556 }
mzta 0:225c1da086a1 557
mzta 0:225c1da086a1 558 int main (void) {
mzta 0:225c1da086a1 559 MBED_HOSTTEST_TIMEOUT(20);
mzta 0:225c1da086a1 560 MBED_HOSTTEST_SELECT(default_auto);
mzta 0:225c1da086a1 561 MBED_HOSTTEST_DESCRIPTION(ISR (Queue));
mzta 0:225c1da086a1 562 MBED_HOSTTEST_START("RTOS_8");
mzta 0:225c1da086a1 563
mzta 0:225c1da086a1 564 Thread thread(queue_thread, NULL, osPriorityNormal, STACK_SIZE);
mzta 0:225c1da086a1 565 Ticker ticker;
mzta 0:225c1da086a1 566 ticker.attach(queue_isr, 1.0);
mzta 0:225c1da086a1 567 int isr_puts_counter = 0;
mzta 0:225c1da086a1 568 bool result = true;
mzta 0:225c1da086a1 569
mzta 0:225c1da086a1 570 while (true) {
mzta 0:225c1da086a1 571 osEvent evt = queue.get();
mzta 0:225c1da086a1 572 if (evt.status != osEventMessage) {
mzta 0:225c1da086a1 573 printf("QUEUE_GET: Status(0x%02X) ... [FAIL]\r\n", evt.status);
mzta 0:225c1da086a1 574 result = false;
mzta 0:225c1da086a1 575 break;
mzta 0:225c1da086a1 576 } else {
mzta 0:225c1da086a1 577 printf("QUEUE_GET: Value(%u) ... [OK]\r\n", evt.value.v);
mzta 0:225c1da086a1 578 if (evt.value.v == QUEUE_PUT_ISR_VALUE) {
mzta 0:225c1da086a1 579 isr_puts_counter++;
mzta 0:225c1da086a1 580 }
mzta 0:225c1da086a1 581 if (isr_puts_counter >= QUEUE_SIZE) {
mzta 0:225c1da086a1 582 break;
mzta 0:225c1da086a1 583 }
mzta 0:225c1da086a1 584 }
mzta 0:225c1da086a1 585 }
mzta 0:225c1da086a1 586
mzta 0:225c1da086a1 587 MBED_HOSTTEST_RESULT(result);
mzta 0:225c1da086a1 588 return 0;
mzta 0:225c1da086a1 589 }
mzta 0:225c1da086a1 590
mzta 0:225c1da086a1 591 #endif