需要有关编程方法的建议

时间:2012-06-23 08:56:38

标签: c++ multithreading tcp embedded beagleboard

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

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

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

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

  4. 我已经实现了上述功能,详情如下:

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

    2. 我已经为数据转储到MySQL数据库创建了一个单独的线程。

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

    4. 我的问题是:

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

      2. 有更好的方法吗?

      3. 你能建议我一个方法,以便我可以同时通过串口读写。我是否需要再次在单独的线程中放置读写功能?

2 个答案:

答案 0 :(得分:1)

  

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

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

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

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

  • 他们需要context-switching。如果过于频繁,则会导致性能显着下降。
  • 他们使调试更加困难。

如果您没有计划接近平台的性能限制,我没有受过教育的猜测是,您现在应该没有三个线程。


  

有更好的方法吗?

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

例如,您可以实现多个进程,而不是多个线程。多处理有自己的一组pros and cons

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


  

你能建议我一个方法,以便我可以同时通过串口读写。我是否需要再次在单独的线程中放置读写功能?

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

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


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

答案 1 :(得分:0)

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

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

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

这确实意味着它总是占用一个核心100%的时间,除非轮询循环可以在短时间内休眠。

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

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