gpt4 book ai didi

c++ - 控制不同的硬件 : multithreading or something different?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:37:01 27 4
gpt4 key购买 nike

在 IoT 设备(Linux、ARM、C++)上工作。现在我正在创建样板代码和通用程序结构。该程序与不同的硬件通信:

  • 板上的 GPIO 引脚。
  • 几个单线传感器。
  • I2C 总线上的其他 GPIO 芯片和按键。
  • 通过RS232接口(interface)连接的设备

现在棘手的部分是 RS232 设备、1-wire 和 I2C 设备的响应速度不是那么快。这意味着如果我在单个线程上做这样的事情:

    while (!_isShutdown)
{
for (auto& device : _devices)
{
device.update();
}
}

我会浪费很多时间和资源,更重要的是,我无法及时完成任务,因为多个传感器可能需要长达 500 毫秒才能检索到最新值。

这个问题自然而然地让我想到了多线程。我可以为每个设备创建一个后台线程。这意味着我拥有的设备越多,我使用的线程和内存(我相信 1MB)就越多。在我的例子中,可能需要多达 30 个线程来管理硬件(我也有网络通信,这意味着更多线程)。

我认为也许存在更好的硬件管理方法。也许每次读取执行 block 时创建一个线程是一个糟糕的设计?如果是这样,有哪些替代方案?网上有很多简单的例子,但对复杂项目有用的资料很少。

在像 Raspberry 这样的设备上,内存和执行速度不是问题,但这可能会养成开发愚蠢和未优化代码的坏习惯。我请你澄清这一点。

最佳答案

从您的角度来看,您没有准确解释什么是“更好的方法”。既然如您所说,内存不是问题,那么为每个设备提供自己的线程也不错。尽管内存消耗过多,但这样的代码很容易阅读和调试。

为避免内存消耗,您可能希望从阻塞代码切换到解除阻塞。也就是说,线程不会等待 I/O 操作结束,而是硬件本身通知操作结束,例如带有硬件中断。中断处理程序然后向其监听器发送消息,这可能会导致任务调度在线程池上运行。 C++中最成熟的任务库是Intel® Threading Building Blocks .在任务中编程似乎比在线程中更复杂,但更有趣,因为可以生成更适合预期目标的代码。

关于c++ - 控制不同的硬件 : multithreading or something different?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47779500/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com