我需要为家庭自动化项目编写一个程序,该程序将在运行Ubuntu 12.04的Beagle Board上运行。以下是该计划的功能:
从串口获取数据,在我的情况下是使用Linux版本中预先存在的FTDI驱动程序的虚拟COM端口。 XBEE模块连接到USB端口,通过Zigbee协议接收并串行发送到Beagle板。
将上述数据转储到MySQL数据库中。
收听平板电脑的说明,该平板电脑通过TCP / IP协议发送命令,并通过TCP / IP发送请求的信息。在某些情况下,它可能只是一个小数据,而在某些情况下,它可能是连续的数据流。
我已经实现了上述功能,详情如下:
我用于串行读写的代码使用以下网站http://www.teuniz.net/RS-232/提供的头文件。它使用while(1)循环连续读取串行端口以获取值。我为此创建了一个单独的线程。
我已经为数据转储到MySQL数据库创建了一个单独的线程。
TCP / IP服务器的另一个线程。该线程可能会产生更多线程,以后将添加接受多个客户端连接的功能。
我的问题是:
当考虑到它运行在具有1GhZ ARM 7内核的嵌入式平台上时,这种产生多线程的编程方法是一种很好的编程方法吗?
有更好的方法吗?
你能建议我一个方法,以便我可以同时通过串口读写。我是否需要再次在单独的线程中放置读写功能?
答案 0 :(得分:1)
当考虑到它是在具有1GhZ ARM 7内核的嵌入式平台上运行时,这种产生多线程的编程方法是一种很好的编程方法吗?
你说你目前有三个线程:串口的监听线程,数据库管理线程和TCP / IP线程。
这里的答案是,它实际上取决于您想要挤出硬件的性能。每个线程消耗多少CPU资源?
在我看来,线程简化了软件的设计和外观(在大多数情况下)。但是,它们需要付出代价:
如果您没有计划接近平台的性能限制,我没有受过教育的猜测是,您现在应该没有三个线程。
有更好的方法吗?
这与您之前的问题非常相关。我不熟悉你的项目的瓶颈和限制。也许有几个,也许根本没有,所以很难说是否有更好的方式来做到这一点。这还取决于你真正想要达到的目标。当然,还有替代方法。
例如,您可以实现多个进程,而不是多个线程。多处理有自己的一组pros and cons:
你能建议我一个方法,以便我可以同时通过串口读写。我是否需要再次在单独的线程中放置读写功能?
可以将串行通信线程实现为一个平坦的while(1)
旋转循环,它可以处理读取和写入(读取一大块数据,写入一大块数据,读取一大块数据,写入一个块)数据,等等......)。
那就是说,我认为将串行通信线程分成两个独立的(Rx和Tx)是一个有效(和正确)的建议。我参与了很多像这样实现的项目,并且随着串行协议变得更复杂,它通常被证明是有益的。
我不明白你的串口是USB还是RS-232。
无论如何,我希望我的答案证明是有帮助的,有见地的。祝你好运。
答案 1 :(得分:0)
多线程的替代方案是多个状态机。
多个状态机背后的理论是单个线程轮询多个状态机,因此每次调用状态机必须“完成”。并尽快回来。
状态机比多线程更容易测试和调试。
这确实意味着它总是占用一个核心100%的时间,除非轮询循环可以在短时间内休眠。
因此,您可以为每个RS232读取,RS232写入,数据库访问和TCP轮询设置状态机。
这也不会阻止您为程序的其他部分或其他程序运行其他线程。