阻止RTOS中的任务间通信

时间:2019-04-27 17:38:18

标签: c unit-testing freertos rtos

我正在编写一个模块,该模块包含一个具有最高优先级的任务,并且它应该处于阻塞状态,直到它从其他任务接收到一条消息为止,开始执行其作为最高优先级任务的职责。它使用邮箱机制进行信号传递。

我的问题是 我希望任务(向较高的任务发送信号)以阻塞模式返回消息

这是我的问题

我应该通过邮箱1发布,然后从邮箱2获取还是有更好的解决方案?

如果有帮助,我会使用“ FreeRTOS”

编辑

我认为我描述的问题很糟糕

我的意思是我需要2个邮箱才能在任务与任务之间或ISR与任务之间进行通信,或者我只能在其他实现中使用一个邮箱!

2 个答案:

答案 0 :(得分:1)

针对您编辑的问题:

您必须使用两个消息队列。每个任务一个,否则您将无法正确等待。 因此,对于您的阻止邮件传输,代码如下所示:

高优先级任务:

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

低优先级任务:

 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);

来自ISR:

 xQueueSendFromISR(high_prio_queue, &msg, &unblocked);

答案 1 :(得分:0)

这很简单。例如,使用的队列和freeRTOS。

任务等待队列。它处于阻止状态

 while(1)
 {  
     xQueueReceive(queue, &object, portMAX_DELAY);
     ....

另一个任务将数据发送到队列。

  xQueueSend(queue, &object, timeout);

当接收到数据时,将对任务进行控制。然后,它检查队列中是否有任何内容。如果不是,它将以阻止状态等待。