/*---------------------------------------------------------------------------- Designers Guide to the Cortex-M Family CMSIS RTOS Message Queue Example *----------------------------------------------------------------------------*/ #include "STM32F10x.h" #include "cmsis_os.h" #include "Board_LED.h" osMessageQId Q_LED; //define the message queue osMessageQDef (Q_LED,0x16,unsigned char); osEvent result; void led_Thread1 (void const *argument); void led_Thread2 (void const *argument); osThreadDef(led_Thread1, osPriorityAboveNormal, 1, 0); osThreadDef(led_Thread2, osPriorityNormal, 1, 0); osThreadId T_led_Thread1; osThreadId T_led_Thread2; osThreadId T_main; /*---------------------------------------------------------------------------- Task 2 'ledOff': switches the LED off *---------------------------------------------------------------------------*/ void led_Thread1 (void const *argument) { for (;;) { result = osMessageGet(Q_LED,osWaitForever); //wait for a message to arrive LED_On(result.value.v); // write the data to the LED's } } /*---------------------------------------------------------------------------- Task 1 'ledOn': switches the LED on *---------------------------------------------------------------------------*/ void led_Thread2 (void const *argument) { for (;;) { osMessagePut(Q_LED,1,osWaitForever); //Place a value in the message queue osDelay(100); //Wait 100 ms LED_Off(0x01); //switch off the LED osMessagePut(Q_LED,2,osWaitForever); //Repeat for other bit patterns osDelay(100); LED_Off(0x02); osMessagePut(Q_LED,3,osWaitForever); osDelay(100); LED_Off(0x03); osMessagePut(Q_LED,4, osWaitForever); osDelay(100); LED_Off(0x04); } } /*---------------------------------------------------------------------------- Main: Initialize and start RTX Kernel *---------------------------------------------------------------------------*/ int main (void) { osKernelInitialize (); // initialize CMSIS-RTOS LED_Initialize (); Q_LED = osMessageCreate(osMessageQ(Q_LED),NULL); //create the message queue T_led_Thread1 = osThreadCreate(osThread(led_Thread1), NULL); T_led_Thread2 = osThreadCreate(osThread(led_Thread2), NULL); osKernelStart (); // start thread execution }