我正在编写一个模块,该模块包含一个具有最高优先级的任务,并且它应该处于阻塞状态,直到它从其他任务接收到一条消息为止,开始执行其作为最高优先级任务的职责。它使用邮箱机制进行信号传递。
我的问题是 我希望任务(向较高的任务发送信号)以阻塞模式返回消息
这是我的问题
我应该通过邮箱1发布,然后从邮箱2获取还是有更好的解决方案?
如果有帮助,我会使用“ FreeRTOS”
编辑
我认为我描述的问题很糟糕
我的意思是我需要2个邮箱才能在任务与任务之间或ISR与任务之间进行通信,或者我只能在其他实现中使用一个邮箱!
答案 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);
当接收到数据时,将对任务进行控制。然后,它检查队列中是否有任何内容。如果不是,它将以阻止状态等待。