我正在开发一种用于机器人应用的高速,高分辨率摄像机。由于各种原因,我需要采用千兆以太网(1Ge)或10Ge来将我的相机连接到PC。无论是那个还是我需要开发我自己不想做的PCIe卡(更多工作,再加上我必须创建驱动程序)。
在阅读linux文档后,我有两个问题我不确定。
#1:我想要的以太网帧是:
8-byte interpacket pad + sync byte
6-byte MAC address (destination)
6-byte MAC address (source)
2-byte packet length (varies 6KB to 9KB depending on lossless compression)
n-byte image data (number of bytes specified in previous 2-byte field)
4-byte CRC32
问题是,如果应用程序告诉linux期望AF_PACKETs(假设应用程序可以告诉linux这个),linux会接受这个数据包吗?如果控制摄像机的应用程序(向其发送数据包)并以数据包形式接收图像数据,则必须以root权限运行。
#2:哪个会更快:
A: linux sockets with AF_PACKET protocol
B: libpcap application
速度至关重要,因为数据包将以很小的空间到达,因为每个数据包包含我自己的无损压缩格式的一个水平行像素(除非我能找到一个更好的算法,也可以在FPGA中实现时间速度)。帧之间会有一个暂停,但这是在1200或更多水平行(以太网帧数据包)之后。
因为应用程序是机器人技术,所以每个水平行将立即解压缩并存储在RGBA像素的简单打包数组中,就像OpenGL接受纹理一样。因此,当图像逐行到达时,机器人软件可以立即检查每个图像,并且可能尽可能快地做出反应。
每行中第一个RGBA像素的数据紧跟在前一行中的最后一个RGBA像素之后,因此在最后一个水平像素行的末尾,图像完成并准备好传输到GPU和/或保存到磁盘。每个水平行将是16个像素的倍数,因此不需要“填充”。
注意:摄像机必须直接插入RJ45插孔,而无需相机和PC之间的路由器或其他设备。
答案 0 :(得分:0)
我认为您必须更改以太网帧格式,以使用源和目标MAC之后的前两个字节作为类型,而不是长度。旧式长度必须小于1536,而更大的长度则被视为IEEE类型字段。如果您想要6K或更多,接收以太网芯片/ Linux数据包处理程序有可能会丢弃您的帧,因为它们格式错误。
至于表现,黄金法则是衡量,不要猜测。选择最简单的编程和尝试。
希望这有帮助。