【发布时间】:2016-09-07 00:10:10
【问题描述】:
这可能是一个非常基本的问题/设计,但我正在努力寻找正确的方法来处理我将在此处定义的系统。
我有一个带有单个客户端 (PC) 的系统,它将通过 TCP/IP 协议连接到嵌入式 Linux 板 (Raspberry Pi)。这将是一个命令/响应系统,PC 将在其中请求某些内容,而树莓派将响应结果。
例如:
CMD => 读取/返回 ADC 通道 X
RSP => ADC 通道 X 数据
对于这种类型的系统,我已经定义了一个允许这种交互的数据包协议。我的问题是如何在 Raspberry PI 上处理这个问题。我设想有一个处理 TCP 连接的线程;将传入数据放入线程安全队列并从线程安全队列中提取传出数据。然后主线程将定期轮询队列以查找数据。当找到数据时,将处理命令并生成响应。所有命令都有响应。
主线程还将执行其他时间关键任务(PID 控制循环),因此它不能等待传入或传出数据。
我的猜测是这种类型的系统相当普遍,并且可能有一种很好的方法来实现这种类型的系统。我对 Linux 编程非常陌生,但我一直在编写高度嵌入式系统(无操作系统)。只是在为这种类型的设计寻找正确的方法。
注意我选择 TCP/IP 是因为它会在失败时处理重绑定。在我的情况下,每个命令都有一个响应,因此如果它使设计更容易/更灵活,则可以使用 UDP。
非常感谢任何帮助。
【问题讨论】:
-
还应该提到,命令的数量和数据包的大小会有很大的不同。所以这个系统需要在应用程序运行的整个过程中运行。可能并不总是有客户端连接。
-
关键线程是否会保留这些数据?还是必须获取/计算它才能对请求做出反应?如果数据已经可用,那么处理客户端的线程可以只执行一个简单的读/处理/写循环,而不需要队列。 “进程”部分只会从一些线程安全的存储中访问数据。
-
这个问题有点宽泛。如果您尝试,您将获得更高质量的答案,并写一篇关于您觉得不满意的原因的帖子。
-
@jxh 我完全同意你的看法,只是不知道从哪里开始。我想我会尝试 sashan 下面详述的选择方法,看看是否可行。如果它不符合我的需求,我会发布跟进。
-
在 linux 上查看
epoll,它比select性能更高,并且在用户空间中需要更少的存储空间。我实现了a server library using epoll 并对它的性能感到满意(即使HTTP 层有一些未对齐的内存访问,它运行得非常顺利)。多线程是一个偏好和要求的问题。 RasPI 的 ARM CPU 是否具有多核或线程?我怀疑如果你坚持事件设计,单线程可能会更好。
标签: c linux multithreading sockets