C 嵌入式设备的服务器体系结构

C 嵌入式设备的服务器体系结构,c,linux,embedded,client-server,arm,C,Linux,Embedded,Client Server,Arm,我正在为嵌入式ARM平台开发服务器应用程序。ARM板连接到各种数字IO、ADC等,系统将始终轮询这些数字IO、ADC等。它目前正在运行一个Linux内核,其硬件接口作为驱动程序开发。其想法是拥有一个客户端应用程序,该应用程序可以连接到嵌入式设备,并在更新时接收传感数据,并向设备发出命令(关闭传感器1、重新启动传感器2等)。假设通过典型的ioctl访问感官设备 现在,我的问题涉及在嵌入式设备上运行的服务器应用程序的设计/体系结构。起初,我想使用类似于或的轻量级C事件处理库。应用程序将对传感器轮询事

我正在为嵌入式ARM平台开发服务器应用程序。ARM板连接到各种数字IO、ADC等,系统将始终轮询这些数字IO、ADC等。它目前正在运行一个Linux内核,其硬件接口作为驱动程序开发。其想法是拥有一个客户端应用程序,该应用程序可以连接到嵌入式设备,并在更新时接收传感数据,并向设备发出命令(关闭传感器1、重新启动传感器2等)。假设通过典型的ioctl访问感官设备

现在,我的问题涉及在嵌入式设备上运行的服务器应用程序的设计/体系结构。起初,我想使用类似于或的轻量级C事件处理库。应用程序将对传感器轮询事件进行优先级排序(然后在轮询完成后将信息发送给客户端),并在接收到客户端命令时(通过典型的TCP套接字)处理这些命令。服务器通常只有一个连接,但可能有十几个左右,而不是数千个连接。这是设计这样东西的最好方法吗?在我列出的两个事件处理库中,有一个更好地用于嵌入式应用程序,还是有其他替代方案

正在考虑的另一种方法是多线程应用程序,其中传感器轮询在优先/阻塞线程中完成,该线程读取感知数据,每个客户端连接在单独的线程中处理。感知数据被更新为某种缓冲区/数据结构,连接线程负责将数据发送到客户机并处理客户机命令(我认为在这些线程中仍然需要一个事件循环来监视传入的命令)。是否有任何库或典型的软件包可以帮助您设计这样的应用程序,或者您必须从头开始


你会如何设计我想要实现的目标

我会使用unix域套接字——我自己编写库,但我看不出使用libvent有什么好处,因为该应用程序与linux绑定,libevent也适用于数百个连接。您可以使用守护进程中的一个线程来完成所有您想做的事情。接吻

对于优先级队列,您不需要专用的主线程,只需要编写线程,以便它总是先处理高优先级事件


在库方面,您可能会受益于(用于序列化和表示协议)——但是它只对C++有第一类支持,而过线(序列化)格式有点简单地移位到数字数据。我怀疑这会增加任何严重的开销。但是,另一种选择是ASN.1()。

我的建议是对您的第二份提案进行修改。我将创建一个具有两个线程的服务器。一个线程轮询传感器,另一个线程轮询所有客户端连接。我在嵌入式设备(MIPS)库中使用过,效果很好

异步处理所有套接字连接的单个线程通常可以轻松地处理负载(当然,这取决于您有多少客户端)。然后,它将在共享缓冲区中提供它所拥有的数据。为了减少互斥量和复杂性,我将创建两个缓冲区,一个“活动”和另一个“非活动”,并创建一个标志来指示当前活动缓冲区。轮询线程将读取数据并将其放入非活动缓冲区。当它完成并创建“一致”状态时,它将翻转标志并交换活动和非活动缓冲区。这可以原子化完成,因此不需要比这更复杂的任何东西


这一切都很容易设置,因为您几乎只有两个线程对另一个线程一无所知。

协议问题也是我正在研究的问题。谷歌协议缓冲区实际上是我遇到的东西。还提供了一个仅限C语言的实现。您必须检查C库实现的质量——如果C-only在您的优先级列表中处于较高位置,我将认真研究asn.1。我认为这是我将要采取的方法。C中有类似于boost::asio的东西吗?我不知道有类似的东西,但我用POSIX的aio_read和friends做了一些异步IOs。我想你可以用aoi.h和poll/select来完成。