Search code examples
cunit-testingfreertosrtos

blocking Inter task communication in RTOS


I'm writing a module which contains a task with the highest priority and it should be in blocking until it receives a message from an other task the start doing its duty as a highest priority task. It uses mailbox mechanism for signaling .

My problem is I want the task -which send a signal to higher task- gets back message in blocking mode

Here is my question

should I post through mailbox 1 and then fetch from mailbox 2 or there is a better solution?

I use "FreeRTOS" if it helps

EDIT

I think I described the problem very bad

I mean do I need 2 mailbox in order to communicate between task to task or ISR to task or I can use just one mailbox with other implementation!!??


Solution

  • For your edited question:

    You have to use two message queues. One for each task otherwise you won't be able to wait correctly. So for your blocking message transfer, the code looks like this:

    High priority task:

     while(-1){ 
      xQueueReceive(high_prio_queue, &msg, portMAX_DELAY);
      [your complex code]
      xQueueSend(low_prio_queue, &return_msg, timeout);
     }
    

    Low priority task:

     xQueueSend(high_prio_queue, &msg, timeout);
     //will only wait if your high priority task gets blocked before sending
     xQueueReceive(low_prio_queue, &return_msg, portMAX_DELAY);
    

    From ISR:

     xQueueSendFromISR(high_prio_queue, &msg, &unblocked);