首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >关于程序设计方法的建议

关于程序设计方法的建议
EN

Stack Overflow用户
提问于 2012-06-23 08:56:38
回答 2查看 299关注 0票数 1

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

  1. 从串行端口获取数据,在我的例子中,串行端口是一个虚拟COM端口,使用Linux版本中预先存在的FTDI驱动程序。XBEE模块连接到USB端口,USB端口通过Zigbee协议接收并串行发送到Beagle板。
  2. 将上述数据转储到MySQL DB中。
  3. 听来自平板电脑的指令,它通过TCP/IP协议发送命令,并通过TCP/IP发送请求的信息。在某些情况下,它可能只是一个小数据,而在某些情况下,它可能是连续的数据流。

我已实施上述功能,详情如下:

  1. 我用于串行读写的代码使用了以下网站http://www.teuniz.net/RS-232/提供的头文件。它使用一个while(1)循环来连续读取串口来获取值。我已经为此创建了一个单独的线程。
  2. 我已经为数据转储到MySQL DB创建了一个单独的线程。
  3. TCP/IP服务器的另一个线程。当将来添加接受多个客户端连接的功能时,该线程可能会产生更多的线程。

我的问题是:

  1. 这种生成多线程的编程方法是一种很好的编程方法,考虑到它是在一个具有1 1GhZ 7核的嵌入式平台上运行的?
  2. 有更好的方法吗?
  3. ,你能建议我一种方法,这样我就可以同时通过串口读写。是否需要再次将读和写功能放在单独的线程中才能做到这一点?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-23 10:52:59

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

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

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

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

  • 他们需要语境转换。如果做得太频繁,就会导致大幅度的业绩下降。
  • 它们使调试变得更加困难。

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

有更好的方法吗?

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

例如,可以实现多个进程,而不是多个线程。多处理有它自己的一组赞成与反对

  • 它在上下文上更重。而且,通常情况下,IPC更复杂。
  • 它更稳定。一个进程中的错误不能影响另一个进程。

你能告诉我一种方法吗?这样我就可以同时通过串口读写了。是否需要再次将读和写功能放在单独的线程中才能做到这一点?

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

尽管如此,我认为将串行通信线程分成两个单独的线程(Rx和Tx)是有效的(也是正确的)建议。我参与过许多项目,这些项目就是这样实现的,而且随着串行协议变得更加复杂,它通常证明是有益的。

我不明白的是,您的串口是USB还是RS-232。

不管怎样,我希望我的回答能证明我的回答是有帮助的和有洞察力的。祝好运。

票数 1
EN

Stack Overflow用户

发布于 2012-06-23 11:09:11

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

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

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

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

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

此外,这并不妨碍您有其他线程为您的程序的其他部分,或实际上其他程序运行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11168167

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档