1

我需要为一个家庭自动化项目编写一个程序,该项目将在运行 Ubuntu 12.04 的 Beagle Board 上运行。以下是该程序的功能:

  1. 从串行端口获取数据,在我的例子中,它是一个使用 Linux 版本中预先存在的 FTDI 驱动程序的虚拟 COM 端口。XBEE 模块连接到 USB 端口,该端口通过 Zigbee 协议接收数据并将其串行发送到 Beagle 板。

  2. 将上述数据转储到 MySQL 数据库中。

  3. 听从通过 TCP/IP 协议发送命令并通过 TCP/IP 发送请求信息的平板电脑的指令。在某些情况下,它可能只是一个小数据,而在某些情况下,它可能是连续的数据流。

我已经实现了上述功能,具体如下:

  1. 我用于串口读写的代码使用了以下网站http://www.teuniz.net/RS-232/提供的头文件。它使用 while(1) 循环连续读取串行端口以获取值。我为此创建了一个单独的线程。

  2. 我创建了一个单独的线程,用于将数据转储到 MySQL 数据库中。

  3. TCP/IP 服务器的另一个线程。当将来添加接受多个客户端连接的功能时,该线程可能会产生更多线程。

我的问题是:

  1. 考虑到它在具有 1GhZ ARM 7 内核的嵌入式平台上运行时,这种产生多个线程的编程方法是否是一种好的编程方法?

  2. 有没有更好的方法来做到这一点?

  3. 你能建议我一种方法,以便我可以同时通过串口进行读写。我是否需要再次将读写功能放在单独的线程中才能做到这一点?

4

2 回答 2

1

考虑到它在具有 1GhZ ARM 7 内核的嵌入式平台上运行时,这种产生多个线程的编程方法是否是一种好的编程方法?

你说你目前有三个线程:一个用于串口的监听线程、一个数据库管理线程和一个用于 TCP/IP 的线程。

这里的答案是,这真的取决于你想从硬件中挤出的性能。每个线程消耗多少 CPU 资源?

在我看来,线程简化了软件的设计和外观(在大多数情况下)。然而,它们是有代价的:

  • 它们需要上下文切换。如果过于频繁,则会导致性能显着下降。
  • 它们使调试变得更加困难。

如果您不打算接近平台的性能限制,我未受过教育的猜测是您现在应该可以使用三个线程。


有没有更好的方法来做到这一点?

这与您之前的问题非常相关。我不熟悉您项目的瓶颈和限制。也许有几个,也许根本没有,所以很难说是否有更好的方法来做到这一点。这也取决于您真正想要实现的目标。当然,还有其他方法可以做到这一点。

例如,您可以实现多个进程,而不是多个线程。多处理有其自身的优点和缺点

  • 它在上下文中更重。此外,通常IPC更复杂。
  • 它更稳定。一个进程中的错误不会导致另一个进程崩溃。


你能建议我一种方法,以便我可以同时通过串口进行读写。我是否需要再次将读写功能放在单独的线程中才能做到这一点?

可以将串行通信线程实现为一个平面while(1)旋转循环,处理读取和写入(读取数据块,写入数据块,读取数据块,写入数据块,等等。 .)。

也就是说,我认为将串行通信线程分成两个单独的线程(Rx 和 Tx)是一个有效(且正确)的建议。我参与了许多这样实现的项目,随着串行协议变得越来越复杂,它通常被证明是有益的。
我不明白你的串口是USB还是RS-232。


无论如何,我希望我的回答对您有所帮助和有见地。祝你好运。

于 2012-06-23T10:52:59.017 回答
0

多线程的替代方案是多状态机。

多个状态机背后的理论是单个线程轮询多个状态机,因此对状态机的每次调用都必须“运行到完成”并尽快返回。

状态机比多线程更容易测试和调试。

这确实意味着它总是消耗一个内核 100% 的时间,除非轮询循环可以休眠一小段时间。

因此,您可以为 RS232 读取、RS232 写入、DB 访问和 TCP 轮询中的每一个设置一个状态机。

此外,这不会阻止您为程序的其他部分使用其他线程,或者实际上其他程序正在运行。

于 2012-06-23T11:09:11.463 回答