#include "mbed.h" //Include file for all mbed functions #include "rtos.h" //Include the mbed rtos functions //Define symbols for signal numbers as signals are numbered in 2 to the power off (binary) #define s1 1 //Use s1 symbol for signal number 1 #define s2 2 //Use s2 symbol for signal number 2 #define s3 4 //Use s3 symbol for signal number 4 #define s4 8 //Use s4 symbol for signal number 8 #define s5 16 //Use s5 symbol for signal number 16 #define s6 32 //Use s6 symbol for signal number 32 #define s7 64 //Use s7 symbol for signal number 64 #define s8 128 //Use s8 symbol for signal number 128 #define s9 256 //Use s9 symbol for signal number 256 #define s10 512 //Use s10 symbol for signal number 512 #define s11 1024 //Use s11 symbol for signal number 1024 #define s12 2048 //Use s12 symbol for signal number 2048 #define s13 4096 //Use s13 symbol for signal number 4096 #define s14 8192 //Use s14 symbol for signal number 8192 #define s15 16384 //Use s15 symbol for signal number 16384 #define s16 32768 //Use s16 symbol for signal number 32768 //Create thread IDs used with signals osThreadId mainThreadID, thread1_ThreadID, thread2_ThreadID, thread3_ThreadID, thread4_ThreadID; osThreadId threadMessage_ThreadID; //Create thread pointers for thread creation - 14 max Thread *thread_1, *thread_2, *thread_3, *thread_4, *thread_message; //Set signals 1 to 4 every 3 seconds void thread1(void const *argument) { thread1_ThreadID = osThreadGetId(); //Identify this thread while (true) { Thread::wait(3000); //Put the thread in WAIT state osSignalSet(threadMessage_ThreadID, s1); //Set signal 1 of the threadMessage thread osSignalSet(threadMessage_ThreadID, s2); //Set signal 2 of the threadMessage thread osSignalSet(threadMessage_ThreadID, s3); //Set signal 3 of the threadMessage thread osSignalSet(threadMessage_ThreadID, s4); //Set signal 4 of the threadMessage thread printf("Thread 1 runs\n"); } } //Set signals 5 to 8 every 3 seconds void thread2(void const *argument) { thread2_ThreadID = osThreadGetId(); while (true) { Thread::wait(3000); osSignalSet(threadMessage_ThreadID, s5); osSignalSet(threadMessage_ThreadID, s6); osSignalSet(threadMessage_ThreadID, s7); osSignalSet(threadMessage_ThreadID, s8); printf("Thread 2 runs\n"); } } //Set signals 9 to 12 every 3 seconds void thread3(void const *argument) { thread3_ThreadID = osThreadGetId(); while (true) { Thread::wait(3000); osSignalSet(threadMessage_ThreadID, s9); osSignalSet(threadMessage_ThreadID, s10); osSignalSet(threadMessage_ThreadID, s11); osSignalSet(threadMessage_ThreadID, s12); printf("Thread 3 runs\n"); } } //Set signals 13 to 16 every 3 seconds void thread4(void const *argument) { thread4_ThreadID = osThreadGetId(); while (true) { Thread::wait(3000); osSignalSet(threadMessage_ThreadID, s13); osSignalSet(threadMessage_ThreadID, s14); osSignalSet(threadMessage_ThreadID, s15); osSignalSet(threadMessage_ThreadID, s16); printf("Thread 4 runs\n"); } } //Thread writes message using printf that the signal has been received by the thread for all 16 signals void threadMessage(void const *argument) { threadMessage_ThreadID = osThreadGetId(); //Identify the thread while (true) { osEvent evt; //Create variable of type osEvent evt = osSignalWait (s1, 0); //Read signal status into osEvent variable evt if (evt.status == osEventSignal) { //Check if signal has been received printf("Signal 1 received\n\n"); //Write message to say signal has been reveived by the thread } evt = osSignalWait (s2, 0); if (evt.status == osEventSignal) { printf("Signal 2 received\n\n"); } evt = osSignalWait (s3, 0); if (evt.status == osEventSignal) { printf("Signal 3 received\n\n"); } evt = osSignalWait (s4, 0); if (evt.status == osEventSignal) { printf("Signal 4 received\n\n"); } evt = osSignalWait (s5, 0); if (evt.status == osEventSignal) { printf("Signal 5 received\n\n"); } evt = osSignalWait (s6, 0); if (evt.status == osEventSignal) { printf("Signal 6 received\n\n"); } evt = osSignalWait (s7, 0); if (evt.status == osEventSignal) { printf("Signal 7 received\n\n"); } evt = osSignalWait (s8, 0); if (evt.status == osEventSignal) { printf("Signal 8 received\n\n"); } evt = osSignalWait (s9, 0); if (evt.status == osEventSignal) { printf("Signal 9 received\n\n"); } evt = osSignalWait (s10, 0); if (evt.status == osEventSignal) { printf("Signal 10 received\n\n"); } evt = osSignalWait (s11, 0); if (evt.status == osEventSignal) { printf("Signal 11 received\n\n"); } evt = osSignalWait (s12, 0); if (evt.status == osEventSignal) { printf("Signal 12 received\n\n"); } evt = osSignalWait (s13, 0); if (evt.status == osEventSignal) { printf("Signal 13 received\n\n"); } evt = osSignalWait (s14, 0); if (evt.status == osEventSignal) { printf("Signal 14 received\n\n"); } evt = osSignalWait (s15, 0); if (evt.status == osEventSignal) { printf("Signal 15 received\n\n"); } evt = osSignalWait (s16, 0); if (evt.status == osEventSignal) { printf("Signal 16 received\n\n"); } Thread::wait(500); //Put thread in WAIT state every 500 mS } } int main() { mainThreadID = osThreadGetId(); //Identify the thread //Create threads thread_1 = new Thread (thread1, NULL, osPriorityNormal, 2048); thread_2 = new Thread (thread2, NULL, osPriorityNormal, 2048); thread_3 = new Thread (thread3, NULL, osPriorityNormal, 2048); thread_4 = new Thread (thread4, NULL, osPriorityNormal, 2048); thread_message = new Thread (threadMessage, NULL, osPriorityNormal, 2048); while (true) { printf("\n\n*** RTOS testing signals ***\n"); //write message to show main is running Thread::wait(1000); //Put main in WAIT state every 1S } }