MCPcopy Create free account
hub / github.com/ARMmbed/DAPLink / svcRtxMessageQueueGet

Function svcRtxMessageQueueGet

source/rtos2/RTX/Source/rtx_msgqueue.c:468–544  ·  view source on GitHub ↗

Get a Message from a Queue or timeout if Queue is empty. \note API identical to osMessageQueueGet

Source from the content-addressed store, hash-verified

466/// Get a Message from a Queue or timeout if Queue is empty.
467/// \note API identical to osMessageQueueGet
468static osStatus_t svcRtxMessageQueueGet (osMessageQueueId_t mq_id, void *msg_ptr, uint8_t *msg_prio, uint32_t timeout) {
469 os_message_queue_t *mq = osRtxMessageQueueId(mq_id);
470 os_message_t *msg;
471 os_thread_t *thread;
472 uint32_t *reg;
473 const void *ptr;
474 osStatus_t status;
475
476 // Check parameters
477 if ((mq == NULL) || (mq->id != osRtxIdMessageQueue) || (msg_ptr == NULL)) {
478 EvrRtxMessageQueueError(mq, (int32_t)osErrorParameter);
479 //lint -e{904} "Return statement before end of function" [MISRA Note 1]
480 return osErrorParameter;
481 }
482
483 // Get Message from Queue
484 msg = MessageQueueGet(mq);
485 if (msg != NULL) {
486 MessageQueueRemove(mq, msg);
487 // Copy Message
488 memcpy(msg_ptr, &msg[1], mq->msg_size);
489 if (msg_prio != NULL) {
490 *msg_prio = msg->priority;
491 }
492 EvrRtxMessageQueueRetrieved(mq, msg_ptr);
493 // Free memory
494 msg->id = osRtxIdInvalid;
495 (void)osRtxMemoryPoolFree(&mq->mp_info, msg);
496 // Check if Thread is waiting to send a Message
497 if (mq->thread_list != NULL) {
498 // Try to allocate memory
499 //lint -e{9079} "conversion from pointer to void to pointer to other type" [MISRA Note 5]
500 msg = osRtxMemoryPoolAlloc(&mq->mp_info);
501 if (msg != NULL) {
502 // Wakeup waiting Thread with highest Priority
503 thread = osRtxThreadListGet(osRtxObject(mq));
504 osRtxThreadWaitExit(thread, (uint32_t)osOK, TRUE);
505 // Copy Message (R2: const void *msg_ptr, R3: uint8_t msg_prio)
506 reg = osRtxThreadRegPtr(thread);
507 //lint -e{923} "cast from unsigned int to pointer"
508 ptr = (const void *)reg[2];
509 memcpy(&msg[1], ptr, mq->msg_size);
510 // Store Message into Queue
511 msg->id = osRtxIdMessage;
512 msg->flags = 0U;
513 msg->priority = (uint8_t)reg[3];
514 MessageQueuePut(mq, msg);
515 EvrRtxMessageQueueInserted(mq, ptr);
516 }
517 }
518 status = osOK;
519 } else {
520 // No Message available
521 if (timeout != 0U) {
522 EvrRtxMessageQueueGetPending(mq, msg_ptr, timeout);
523 // Suspend current Thread
524 if (osRtxThreadWaitEnter(osRtxThreadWaitingMessageGet, timeout)) {
525 osRtxThreadListPut(osRtxObject(mq), osRtxThreadGetRunning());

Callers

nothing calls this directly

Calls 15

EvrRtxMessageQueueErrorFunction · 0.85
MessageQueueGetFunction · 0.85
MessageQueueRemoveFunction · 0.85
osRtxMemoryPoolFreeFunction · 0.85
osRtxMemoryPoolAllocFunction · 0.85
osRtxThreadListGetFunction · 0.85
osRtxThreadWaitExitFunction · 0.85
osRtxThreadRegPtrFunction · 0.85
MessageQueuePutFunction · 0.85

Tested by

no test coverage detected