/*---------------------------------------------------------------------------- Designers Guide to the Cortex-M Family CMSIS mailbox Example *----------------------------------------------------------------------------*/ #include "STM32F10x.h" #include "cmsis_os.h" #include "Board_LED.h" typedef struct //define the mail slot format { uint8_t LED0; uint8_t LED1; uint8_t LED2; uint8_t LED3; } mail_format; osMailQDef(mail_box, 16, mail_format); //define the mailbox osMailQId mail_box; //define the mailbox id void LED_Producer (void const *argument) { uint8_t led0[12] = {1,0,0,0,1,1,1,1,0,0,0,0}; //create the patterns to send to the mailbox uint8_t led1[12] = {0,2,0,0,0,2,2,2,2,0,0,0}; uint8_t led2[12] = {0,0,4,0,0,0,4,4,4,4,0,0}; uint8_t led3[12] = {0,0,0,8,0,0,0,8,8,8,8,0}; uint8_t index; mail_format *LEDtx; //define a pointer in the mailslot format while (1) { for(index=0;index<12;index++) { LEDtx = (mail_format*)osMailAlloc(mail_box, osWaitForever); //allocate a mailslot LEDtx->LED0 = led0[index]; //Populate it with data LEDtx->LED1 = led1[index]; LEDtx->LED2 = led2[index]; LEDtx->LED3 = led3[index]; osMailPut(mail_box, LEDtx); //Post the mail to the mailbox osDelay(100); } } } void LED_Consumer (void const *argument) { osEvent evt; //declare an osEvent variable mail_format *LEDrx; //define a pointer in the mailslot format while (1) { evt = osMailGet(mail_box, osWaitForever); //wait until a message arrives if(evt.status == osEventMail) //Check for a valid message { LEDrx = (mail_format*)evt.value.p; //Set the receive pointer to the mailslot LED_SetOut(LEDrx->LED0|LEDrx->LED1|LEDrx->LED2|LEDrx->LED3); //Use the data osMailFree(mail_box, LEDrx); //Free the mailslot } } } osThreadDef(LED_Producer, osPriorityNormal, 1,0); osThreadDef(LED_Consumer, osPriorityNormal, 1,0); int main (void) { osKernelInitialize (); // initialize CMSIS-RTOS LED_Initialize (); mail_box = osMailCreate(osMailQ(mail_box), NULL); // Create the mailbox osThreadCreate(osThread(LED_Producer), NULL); osThreadCreate(osThread(LED_Consumer), NULL); osKernelStart (); // start thread execution }