阻止 RTOS 中的任务间通信
blocking Inter task communication in RTOS
我正在编写一个模块,其中包含一个具有最高优先级的任务,它应该处于阻塞状态,直到它收到来自其他任务的消息,开始作为最高优先级任务履行其职责。它使用信箱机制进行信令。
我的问题是
我想要任务 - 向更高的任务发送信号 - 在阻塞模式下返回消息
这是我的问题
我应该post通过邮箱1然后从邮箱2取回还是有更好的解决方案?
如果有帮助我就用"FreeRTOS"
编辑
我觉得我描述的问题很糟糕
我的意思是我需要 2 个邮箱才能在任务与任务之间或 ISR 与任务之间进行通信,还是我可以只使用一个邮箱与其他实现!!??
很简单。例如使用的队列和 freeRTOS。
任务等待队列。处于阻塞状态
while(1)
{
xQueueReceive(queue, &object, portMAX_DELAY);
....
另一个任务将数据发送到队列。
xQueueSend(queue, &object, timeout);
收到数据后,任务将获得控制权。然后它检查队列中是否有任何东西。如果不是,它会在阻塞状态下等待。
对于您编辑的问题:
您必须使用两个消息队列。每个任务一个,否则您将无法正确等待。
因此,对于您的阻止消息传输,代码如下所示:
高优先级任务:
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);
我正在编写一个模块,其中包含一个具有最高优先级的任务,它应该处于阻塞状态,直到它收到来自其他任务的消息,开始作为最高优先级任务履行其职责。它使用信箱机制进行信令。
我的问题是 我想要任务 - 向更高的任务发送信号 - 在阻塞模式下返回消息
这是我的问题
我应该post通过邮箱1然后从邮箱2取回还是有更好的解决方案?
如果有帮助我就用"FreeRTOS"
编辑
我觉得我描述的问题很糟糕
我的意思是我需要 2 个邮箱才能在任务与任务之间或 ISR 与任务之间进行通信,还是我可以只使用一个邮箱与其他实现!!??
很简单。例如使用的队列和 freeRTOS。
任务等待队列。处于阻塞状态
while(1)
{
xQueueReceive(queue, &object, portMAX_DELAY);
....
另一个任务将数据发送到队列。
xQueueSend(queue, &object, timeout);
收到数据后,任务将获得控制权。然后它检查队列中是否有任何东西。如果不是,它会在阻塞状态下等待。
对于您编辑的问题:
您必须使用两个消息队列。每个任务一个,否则您将无法正确等待。 因此,对于您的阻止消息传输,代码如下所示:
高优先级任务:
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);