我正在开发一个相当复杂的微控制器应用程序C,我对如何将不同任务/线程之间的共享数据“链接”而不耦合它们存在一些疑问。如何在任务/线程之间共享数据而不耦合它们?
到现在为止,我已经使用了时间片调度程序来运行我的应用程序,因此不需要数据保护。但是我想让应用程序正确,我想在稍后为多线程操作系统做好准备。
我试图通过使用完全不同的系统,而不是我正在工作的实际系统来简化我的问题。我无法添加图片,因为我是新用户,但生病尝试并解释:
我们得到4个任务/线程:3个输入线程,通过硬件抽象层(HAL)从不同传感器读取一些传感器数据。 。收集的传感器数据存储在任务域(即:他们不会是全球性的!)。 现在我们还有1个输出任务,我们称之为“调节器”。调节器必须使用(读取)从所有3个传感器收集的传感器数据才能生成正确的输出。
问题:Regulator如何读取存储在不同输入任务中的采集数据而不与其他任务耦合?
调节器只能通过参考知道输入任务及其数据(即:不包含,不耦合)。
到目前为止,Regulator已经有了一个指向每个所需传感器数据的指针,并且该指针在初始化时设置。由于数据保护,这不会在多线程应用程序中工作。
我可以做一些getSensorValue()
功能,它利用信号量,为每个传感器值,然后用函数指针将这些函数链接到调节器。但是这会占用很多内存!有没有更好的方法来做到这一点?我只是在寻找投入。
我希望这一切都是可以理解的:)
你在运行什么硬件?微控制器系列对可以完成的工作产生很大的影响。例如在许多微控制器上没有虚拟内存。在其他控制器的“线程”中实际上并不是线程,而只是看门狗交换的堆栈指针。 – Pyrce
目前我在PSoC5上运行,我计划进行端口/转换为STM32? – Jolle
这些家族看起来有真正的线程/虚拟内存表。当你说数据保护会阻止应用程序读取线程特定的数据时,你的意思是说这些'线程'是作为进程而不是线程启动的吗?因为线程可以读取其他线程的内存,除非你用'__thread'等线程本地关键字来显式地限制内存。你认为什么内存很多,3个信号灯应该只占用几个字节的内存。或者由于传感器的读取速度,线程不能被延长时间阻塞? – Pyrce