实时操作系统(RTOS)中带有信令的多生产者一个消费者方案

时间:2018-07-06 08:33:45

标签: multithreading oop synchronization rtos mbed

我正在通过使用mbed-OS(用于ARM体系结构的RTOS)开发实时系统。我不是软件工程师,我想知道以下解决方案是否可行,以及如何进行改进。

如图所示,软件的元素如下:

  1. 三个不同的类(ClassA,...)描述了低级别 用于从三个不同模块收集数据的外围设备,这些模块的实例通过引用传递给三个不同的线程(线程a,...)。
  2. 通过使用三个队列(queueA,...),我正在将数据发送到 线程d ,该线程正在从其他3个线程中收集数据,以将它们组合起来以形成所需格式的字符串(合成)。
  3. 合并的数据将排队到线程e 中,如果有的话 情况(发生在前三个线程中)满足时,数据被发送到线程g

现在的问题是:

  • 第三个线程正在以不同的更新速率收集数据;如何在线程d 中同步它们?
  • 了解其他线程(事件或信号?!)的最佳信令解决方案是什么
  • 提到的体系结构实用吗?

谢谢。

Block Diagram

1 个答案:

答案 0 :(得分:1)

  

第三个线程正在以不同的更新速率收集数据;如何在线程d中同步它们?

是否需要同步?线程d可能会根据来自所有三个队列的最新数据来合成输出C。您可能只是在A / B / C到达时更新它们的当前数据,并且当它们到达时都从当前数据生成D。如果必须保证数据是“新的”,则可以为数据到达打上时间戳,并且只有在所有数据足够新时才使用它。如果必须从所有三个数据中收集新数据,则可以为所有三个数据保留一个标志,在到达时进行设置,并在同时设置所有三个标志的情况下生成D,以清除下一组数据的标志。您如何执行此操作实际上取决于应用程序的需求,并且您的抽象描述并不建议特定的解决方案。

  

了解其他线程(事件或信号?!)的最佳信令解决方案是什么

消息队列正在阻止IPC,因此,如果您等待单个队列,则数据到达发出信号。我对Mbed RTOS并不特别熟悉,但是大多数RTOS仅允许在单个队列上进行阻塞。您可以将所有三个队列A,B和C合并为一个,并在消息中包含数据源标识符-这可能会更简单。但是,通常有充分的理由要使用单独的队列,并且要等待来自多个队列的数据,您可以使用信号灯或任务事件标志,该标志在A,B或C将数据放入其输出队列时给出,然后D将等待信号/事件,然后以零超时轮询所有三个队列,直到所有三个都为空,然后再返回等待。

对于具有两个输入队列的线程E,您也会遇到相同的问题。

  

上述架构是否可行?

似乎是合理的-您的描述的抽象性质无法确定它在您的特定应用中是可行的还是适当的,但至少不是疯狂的。