2

我正在使用嵌入式 RTOS (CMX),但我认为这适用于任何嵌入式 RTOS。我想在各种任务之间传递消息。问题是一个任务有时会在很长一段时间(几秒钟)内“锁定”所有其他任务。

由于我不再等待大约 100 毫秒左右的消息被确认,如果我在这段时间内发送邮箱消息,发送消息的任务不再等待它的回复,但接收任务会得到消息并尝试对其采取行动。问题是接收任务有一个指向消息的指针,但是由于发送任务已经移动,指针不再指向消息,这可能会导致巨大的问题。

一旦消息在队列中,我就无法删除它们。我怎样才能优雅地处理这个错误?

4

1 回答 1

4

这个问题实际上涵盖了几个不同的问题/点。

首先,我想知道为什么一个任务有时会一次占用 CPU 几秒钟。通常,这表明存在设计问题。但我不知道你的系统,可能有一个合理的解释,所以我不会去那个兔子洞。

因此,根据您的描述,您正在排队指向消息的指针,而不是消息的副本。这本身并没有错。但是您可能会遇到您描述的问题。

这个问题至少有2个解决方案。在不了解更多的情况下,我不能说其中哪一个可能更好。

第一种方法是传递消息的副本,而不是指向它的指针。例如,VxWorks 消息队列(显然不是 CMX 队列)让您将消息的副本排入队列。我不知道 CMX 是否支持这样的模型,也不知道你是否有带宽/内存来支持这样的方法。通常我会尽可能避免这种方法,但有时它也有它的位置。

第二种方法,我在这种情况下尽可能使用,是让发送者分配一个消息缓冲区(通常来自我自己的 msg/buffer 池,通常是固定大小内存块的链表 - 但这是一种实现详细信息-有关我正在谈论的内容的说明,请参见“内存池”的说明)不管怎样——在分配之后,发送者填写消息数据,将一个指向消息的指针加入队列,并释放对内存块(即消息)的控制(所有权)。接收者现在负责在阅读完消息后释放/归还内存

在这个问题中可能会提出其他问题,例如,如果发送者将消息“广播”给多个接收者怎么办?接收器如何协调/通信以便只有最后一个读取器释放内存(垃圾收集)?但希望根据您的要求,第二种解决方案对您有用。

于 2010-09-26T04:01:11.970 回答