| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- #include "cmsis_os2.h" // CMSIS RTOS header file
- /*----------------------------------------------------------------------------
- * Message Queue creation & usage
- *---------------------------------------------------------------------------*/
- void Thread_MsgQueue1 (void *argument); // thread function 1
- void Thread_MsgQueue2 (void *argument); // thread function 2
- osThreadId_t tid_Thread_MsgQueue1; // thread id 1
- osThreadId_t tid_Thread_MsgQueue2; // thread id 2
- #define MSGQUEUE_OBJECTS 16 // number of Message Queue Objects
- typedef struct { // object data type
- uint8_t Buf[32];
- uint8_t Idx;
- } MEM_BLOCK_t;
- typedef struct { // object data type
- uint8_t Buf[32];
- uint8_t Idx;
- } MSGQUEUE_OBJ_t;
- osMemoryPoolId_t mpid_MemPool2; // memory pool id
- osMessageQueueId_t mid_MsgQueue; // message queue id
- int Init_MsgQueue (void)
- {
- mpid_MemPool2 = osMemoryPoolNew(MSGQUEUE_OBJECTS, sizeof(MSGQUEUE_OBJ_t), NULL);
- if (!mpid_MemPool2) {
- ; // MemPool object not created, handle failure
- }
- mid_MsgQueue = osMessageQueueNew(MSGQUEUE_OBJECTS, sizeof(MSGQUEUE_OBJ_t), NULL);
- if (!mid_MsgQueue) {
- ; // Message Queue object not created, handle failure
- }
- tid_Thread_MsgQueue1 = osThreadNew (Thread_MsgQueue1, NULL, NULL);
- if (!tid_Thread_MsgQueue1) {
- return(-1);
- }
- tid_Thread_MsgQueue2 = osThreadNew (Thread_MsgQueue2, NULL, NULL);
- if (!tid_Thread_MsgQueue2) {
- return(-1);
- }
- return(0);
- }
- void Thread_MsgQueue1 (void *argument)
- {
- MEM_BLOCK_t *pMsg = 0;
- while (1) {
- ; // Insert thread code here...
- pMsg = (MEM_BLOCK_t *)osMemoryPoolAlloc (mpid_MemPool2, NULL); // get Mem Block
- if (pMsg) { // Mem Block was available
- pMsg->Buf[0] = 0x55; // do some work...
- pMsg->Idx = 0;
- osMessageQueuePut (mid_MsgQueue, &pMsg, NULL, NULL);
- }
- osThreadYield (); // suspend thread
- }
- }
- void Thread_MsgQueue2 (void *argument)
- {
- osStatus_t status;
- MEM_BLOCK_t *pMsg = 0;
- while (1) {
- ; // Insert thread code here...
- status = osMessageQueueGet (mid_MsgQueue, &pMsg, NULL, NULL); // wait for message
- if (status == osOK) {
- if (pMsg) {
- ; // process data
- osMemoryPoolFree (mpid_MemPool2, pMsg); // free memory allocated for message
- }
- }
- }
- }
|