Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp
00001 #include "mbed.h" 00002 #include "greentea-client/test_env.h" 00003 #include "rtos.h" 00004 00005 #if defined(MBED_RTOS_SINGLE_THREAD) 00006 #error [NOT_SUPPORTED] test not supported 00007 #endif 00008 00009 #define THREAD_DELAY 75 00010 #define SEMAPHORE_SLOTS 2 00011 #define SEM_CHANGES 100 00012 00013 /* 00014 * The stack size is defined in cmsis_os.h mainly dependent on the underlying toolchain and 00015 * the C standard library. For GCC, ARM_STD and IAR it is defined with a size of 2048 bytes 00016 * and for ARM_MICRO 512. Because of reduce RAM size some targets need a reduced stacksize. 00017 */ 00018 #if defined(TARGET_STM32F334R8) && (defined(TOOLCHAIN_GCC) || defined(TOOLCHAIN_IAR)) 00019 #define STACK_SIZE DEFAULT_STACK_SIZE/4 00020 #elif defined(TARGET_STM32F103RB) 00021 #define STACK_SIZE DEFAULT_STACK_SIZE/2 00022 #elif defined(TARGET_STM32F070RB) 00023 #define STACK_SIZE DEFAULT_STACK_SIZE/2 00024 #elif defined(TARGET_STM32F072RB) 00025 #define STACK_SIZE DEFAULT_STACK_SIZE/2 00026 #elif defined(TARGET_STM32F302R8) && defined(TOOLCHAIN_IAR) 00027 #define STACK_SIZE DEFAULT_STACK_SIZE/2 00028 #elif defined(TARGET_STM32L073RZ) 00029 #define STACK_SIZE DEFAULT_STACK_SIZE/2 00030 #elif defined(TARGET_STM32F303K8) && defined(TOOLCHAIN_IAR) 00031 #define STACK_SIZE DEFAULT_STACK_SIZE/4 00032 #elif (defined(TARGET_EFM32HG_STK3400)) && !defined(TOOLCHAIN_ARM_MICRO) 00033 #define STACK_SIZE 512 00034 #elif (defined(TARGET_EFM32LG_STK3600) || defined(TARGET_EFM32WG_STK3800) || defined(TARGET_EFM32PG_STK3401)) && !defined(TOOLCHAIN_ARM_MICRO) 00035 #define STACK_SIZE 768 00036 #elif (defined(TARGET_EFM32GG_STK3700)) && !defined(TOOLCHAIN_ARM_MICRO) 00037 #define STACK_SIZE 1536 00038 #elif defined(TARGET_MCU_NRF51822) || defined(TARGET_MCU_NRF52832) 00039 #define STACK_SIZE 768 00040 #elif defined(TARGET_XDOT_L151CC) 00041 #define STACK_SIZE 1024 00042 #else 00043 #define STACK_SIZE DEFAULT_STACK_SIZE 00044 #endif 00045 00046 void print_char(char c = '*') { 00047 printf("%c", c); 00048 fflush(stdout); 00049 } 00050 00051 Semaphore two_slots(SEMAPHORE_SLOTS); 00052 00053 volatile int change_counter = 0; 00054 volatile int sem_counter = 0; 00055 volatile bool sem_defect = false; 00056 00057 void test_thread(void const *delay) { 00058 const int thread_delay = int(delay); 00059 while (true) { 00060 two_slots.wait(); 00061 sem_counter++; 00062 const bool sem_lock_failed = sem_counter > SEMAPHORE_SLOTS; 00063 const char msg = sem_lock_failed ? 'e' : sem_counter + '0'; 00064 print_char(msg); 00065 if (sem_lock_failed) { 00066 sem_defect = true; 00067 } 00068 Thread::wait(thread_delay); 00069 print_char('.'); 00070 sem_counter--; 00071 change_counter++; 00072 two_slots.release(); 00073 } 00074 } 00075 00076 int main (void) { 00077 GREENTEA_SETUP(20, "default_auto"); 00078 00079 const int t1_delay = THREAD_DELAY * 1; 00080 const int t2_delay = THREAD_DELAY * 2; 00081 const int t3_delay = THREAD_DELAY * 3; 00082 Thread t1(test_thread, (void *)t1_delay, osPriorityNormal, STACK_SIZE); 00083 Thread t2(test_thread, (void *)t2_delay, osPriorityNormal, STACK_SIZE); 00084 Thread t3(test_thread, (void *)t3_delay, osPriorityNormal, STACK_SIZE); 00085 00086 while (true) { 00087 if (change_counter >= SEM_CHANGES or sem_defect == true) { 00088 t1.terminate(); 00089 t2.terminate(); 00090 t3.terminate(); 00091 break; 00092 } 00093 } 00094 00095 fflush(stdout); 00096 GREENTEA_TESTSUITE_RESULT(!sem_defect); 00097 return 0; 00098 }
Generated on Tue Jul 12 2022 16:40:05 by
