需要有关编程方法的建议

Need suggestions on Programming method

本文关键字:方法 编程      更新时间:2023-10-16

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

    从串行端口
  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. 您能否建议我一种方法,以便我可以通过串行端口同时读写。我是否需要再次将读取和写入功能放在单独的线程中才能执行此操作?

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

说您目前有三个线程:串行端口的侦听器线程、数据库管理线程和 TCP/IP 线程。

这里的答案是,这实际上取决于您要从硬件中挤出的性能。这些线程中的每一个消耗多少 CPU 资源?

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

  • 它们需要上下文切换。如果过于频繁地执行此操作,将导致性能显着降低。
  • 它们使调试变得更加困难。

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


有没有更好的方法?

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

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

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


您能否建议我一种方法,以便我可以通过串行端口同时读写。我是否需要再次将读取和写入功能放在单独的线程中才能执行此操作?

可以将

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

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


无论如何,我希望我的回答证明是有帮助和有见地的。祝你好运。

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

多状态机

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

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

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

因此,您可以为RS232读取,RS232写入,数据库访问和TCP轮询中的每个状态机。

此外,这不会阻止您为程序的其他部分或其他程序运行其他线程。