3 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
4 // ==== Message Queue Management ====
6 @addtogroup CMSIS_RTOS_Message Message Queue
8 @brief Exchange messages between threads in a FIFO-like operation.
10 \b Message \b passing is another basic communication model between threads. In the message passing model, one thread sends
11 data explicitly, while another thread receives it. The operation is more like some kind of I/O rather than a direct access to
12 information to be shared. In CMSIS-RTOS, this mechanism is called s \b message \b queue. The data is passed from one thread
13 to another in a FIFO-like operation. Using message queue functions, you can control, send, receive, or wait for messages. The
14 data to be passed can be of integer or pointer type:
16 \image html "MessageQueue.png" "CMSIS-RTOS Message Queue"
18 Compared to a \ref CMSIS_RTOS_PoolMgmt, message queues are less efficient in general, but solve a broader range of problems.
19 Sometimes, threads do not have a common address space or the use of shared memory raises problems, such as mutual exclusion.
21 Working with Message Queues
22 ---------------------------
23 Follow these steps to create and use a message queue:
24 -# Setup the message queue:
26 osMessageQueueId_t MsgQ_Id; // Define a message queue ID
28 -# Then, create the message queue in a thread:
30 MsgQId_Isr = osMessageQueueNew (16, sizeof(uint32_t), NULL); // Instance a message queue for 16 elements of uint32_t
32 -# Fill the message queue with data:
36 osMessageQueuePut(MsgQ_Id, data, 0, 0);
38 -# From the receiving thread access the data using:
41 osMessageQueueGet(MsgQ_Id, &msg, NULL, 0);
46 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
48 \def osMessageQueueId_t
52 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
54 \struct osMessageQueueAttr_t
56 Attributes structure for message queue.
59 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
61 \fn osMessageQueueId_t osMessageQueueNew (uint32_t msg_count, uint32_t msg_size, const osMessageQueueAttr_t *attr)
65 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
67 \fn osStatus_t osMessageQueuePut (osMessageQueueId_t mq_id, const void *msg_ptr, uint8_t msg_prio, uint32_t timeout);
72 #include "cmsis_os2.h" // CMSIS RTOS header file
74 /*----------------------------------------------------------------------------
75 * Message Queue creation & usage
76 *---------------------------------------------------------------------------*/
78 void Thread_MsgQueue1 (void *argument); // thread function 1
79 void Thread_MsgQueue2 (void *argument); // thread function 2
80 osThreadId_t tid_Thread_MsgQueue1; // thread id 1
81 osThreadId_t tid_Thread_MsgQueue2; // thread id 2
83 #define MSGQUEUE_OBJECTS 16 // number of Message Queue Objects
85 typedef struct { // object data type
90 osMemoryPoolId_t mpid_MemPool2; // memory pool id
91 osMessageQueueId_t mid_MsgQueue; // message queue id
93 int Init_MsgQueue (void) {
95 mid_MsgQueue = osMessageQueueNew(MSGQUEUE_OBJECTS, sizeof(MSGQUEUE_OBJ_t), NULL);
97 ; // Message Queue object not created, handle failure
100 tid_Thread_MsgQueue1 = osThreadNew (Thread_MsgQueue1, NULL, NULL);
101 if (!tid_Thread_MsgQueue1) return(-1);
102 tid_Thread_MsgQueue2 = osThreadNew (Thread_MsgQueue2, NULL, NULL);
103 if (!tid_Thread_MsgQueue2) return(-1);
108 void Thread_MsgQueue1 (void *argument) {
109 MSGQUEUE_OBJ_t pMsg = 0;
112 ; // Insert thread code here...
113 pMsg->Buf[0] = 0x55; // do some work...
115 osMessageQueuePut (mid_MsgQueue, &pMsg, NULL, NULL);
116 osThreadYield (); // suspend thread
120 void Thread_MsgQueue2 (void *argument) {
122 MSGQUEUE_OBJ_t pMsg = 0;
125 ; // Insert thread code here...
126 status = osMessageQueueGet (mid_MsgQueue, &pMsg, NULL, NULL); // wait for message
127 if (status == osOK) {
135 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
137 \fn osStatus_t osMessageQueueGet (osMessageQueueId_t mq_id, void *msg_ptr, uint8_t *msg_prio, uint32_t timeout)
141 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
143 \fn uint32_t osMessageQueueGetCapacity (osMessageQueueId_t mq_id)
147 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
149 \fn uint32_t osMessageQueueGetMsgSize (osMessageQueueId_t mq_id)
153 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
155 \fn uint32_t osMessageQueueGetCount (osMessageQueueId_t mq_id)
159 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
161 \fn uint32_t osMessageQueueGetSpace (osMessageQueueId_t mq_id)
165 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
167 \fn osStatus_t osMessageQueueReset (osMessageQueueId_t mq_id)
171 /*=======0=========1=========2=========3=========4=========5=========6=========7=========8=========9=========0=========1====*/
173 \fn osStatus_t osMessageQueueDelete (osMessageQueueId_t mq_id)