65 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			65 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|   | #include "cmsis_os2.h"                          // CMSIS RTOS header file
 | ||
|  |   | ||
|  | /*----------------------------------------------------------------------------
 | ||
|  |  *      Message Queue creation & usage | ||
|  |  *---------------------------------------------------------------------------*/ | ||
|  |   | ||
|  | #define MSGQUEUE_OBJECTS 16                     // number of Message Queue Objects
 | ||
|  |   | ||
|  | typedef struct {                                // object data type
 | ||
|  |   uint8_t Buf[32]; | ||
|  |   uint8_t Idx; | ||
|  | } MSGQUEUE_OBJ_t; | ||
|  |   | ||
|  | osMessageQueueId_t mid_MsgQueue;                // message queue id
 | ||
|  |   | ||
|  | osThreadId_t tid_Thread_MsgQueue1;              // thread id 1
 | ||
|  | osThreadId_t tid_Thread_MsgQueue2;              // thread id 2
 | ||
|  |   | ||
|  | void Thread_MsgQueue1 (void *argument);         // thread function 1
 | ||
|  | void Thread_MsgQueue2 (void *argument);         // thread function 2
 | ||
|  |   | ||
|  | int Init_MsgQueue (void) { | ||
|  |   | ||
|  |   mid_MsgQueue = osMessageQueueNew(MSGQUEUE_OBJECTS, sizeof(MSGQUEUE_OBJ_t), NULL); | ||
|  |   if (mid_MsgQueue == NULL) { | ||
|  |     ; // Message Queue object not created, handle failure
 | ||
|  |   } | ||
|  |   | ||
|  |   tid_Thread_MsgQueue1 = osThreadNew(Thread_MsgQueue1, NULL, NULL); | ||
|  |   if (tid_Thread_MsgQueue1 == NULL) { | ||
|  |     return(-1); | ||
|  |   } | ||
|  |   tid_Thread_MsgQueue2 = osThreadNew(Thread_MsgQueue2, NULL, NULL); | ||
|  |   if (tid_Thread_MsgQueue2 == NULL) { | ||
|  |     return(-1); | ||
|  |   } | ||
|  |   | ||
|  |   return(0); | ||
|  | } | ||
|  |   | ||
|  | void Thread_MsgQueue1 (void *argument) { | ||
|  |   MSGQUEUE_OBJ_t msg; | ||
|  |   | ||
|  |   while (1) { | ||
|  |     ; // Insert thread code here...
 | ||
|  |     msg.Buf[0] = 0x55U;                                         // do some work...
 | ||
|  |     msg.Idx    = 0U; | ||
|  |     osMessageQueuePut(mid_MsgQueue, &msg, 0U, 0U); | ||
|  |     osThreadYield();                                            // suspend thread
 | ||
|  |   } | ||
|  | } | ||
|  |   | ||
|  | void Thread_MsgQueue2 (void *argument) { | ||
|  |   MSGQUEUE_OBJ_t msg; | ||
|  |   osStatus_t status; | ||
|  | 
 | ||
|  |   while (1) { | ||
|  |     ; // Insert thread code here...
 | ||
|  |     status = osMessageQueueGet(mid_MsgQueue, &msg, NULL, 0U);   // wait for message
 | ||
|  |     if (status == osOK) { | ||
|  |       ; // process data
 | ||
|  |     } | ||
|  |   } | ||
|  | } |