我正在使用嵌入式RTOS(CMX),但我认为这适用于任何嵌入式RTOS。我想在各种任务之间传递消息。问题是,一项任务有时会将所有其他任务“锁定”很长一段时间(几秒钟)。
由于我在大约100毫秒左右后不再等待消息被确认,如果我在此期间发送邮箱消息,发送消息的任务不再等待它回复,而是接收任务将获取消息并尝试对其进行操作。问题是接收任务有一个指向消息的指针,但由于发送任务已经移动,指针不再指向可能导致巨大问题的消息。
我没有在队列中删除邮件的方法。如何优雅地处理此错误?
答案 0 :(得分:4)
这个问题实际上涵盖了几个不同的问题/点。
首先,我想知道为什么有时候一个任务会在几秒钟内占用CPU。通常,这是设计问题的指示。但我不知道你的系统,可能是有一个合理的解释,所以我不会去那个兔子洞。
因此,根据您的描述,您将指向消息的指针排队,而不是消息的副本。没有什么本质上错误的。但是你可以完全遇到你描述的问题。
此问题至少有 2个 2解决方案。不知道更多,我不能说哪些可能更好。
第一种方法是传递消息的副本,而不是指向它的指针。例如,VxWorks消息队列(显然不是CMX队列)让您将消息的副本排入队列。我不知道CMX是否支持这样的模型,我不知道你是否有带宽/内存来支持这种方法。一般来说,我尽可能避免这种做法,但它有时会占有一席之地。
我在这种情况下使用的第二种方法是让发送方分配一个消息缓冲区(通常来自我自己的msg /缓冲池,通常是固定大小的内存块的链表 - 但是是一个实现细节 - 请参阅“内存池”的this description以了解我正在谈论的内容。无论如何 - 在分配之后,发送者填写消息数据,将指向消息的指针排列,并释放存储器块的控制(所有权)(即消息)。 接收器现在负责在阅读消息后释放/返回内存。
在这个问题中还可以提出其他问题,例如,如果发件人将msg“广播”到多个接收器,该怎么办?接收器如何协调/通信,以便只有最后一个读取器释放内存(垃圾回收)?但希望根据你的要求,第二个解决方案对你有用。