2014-09-10 87 views
1

在我的项目中,我必须不断从固件FIFO中读取一堆数据。我一次读1个单词,读完115个单词后,它都被解析为一个结构体。有两种方法,我可以去这样做:在内核空间和用户空间中工作

1)实施驱动器,使得它给我回一个字的时间,并做所有的包装在用户空间

2)通结构传递给驱动程序,通过IOCTL,驱动程序执行115次读取,然后传回填充的结构。

Number 2吸引我,因为它保持用户空间代码更清洁,但我不确定要在驱动程序中完成所有这些工作。从标准实践角度和性能角度来看,哪种方法更好?

+0

我假设在2中,如果FIFO至少有115个字,那么只会调用驱动程序,如果不是,它会立即返回一个错误?这个'解析',它是不平凡的,或从'memcpy'中删除一个步骤? – Yakk 2014-09-10 21:06:07

+0

是的,驱动程序会检查是否有115个单词可用,如果不是,则返回。解析过程将会进行大量按位添加和移位等操作。没有浮点操作或任何东西。 – nrcrast 2014-09-10 21:08:06

+0

顺便说一句:它会永远是115字吗?为了通用性,可以允许用户空间说出应该读多少个? (也许验证它是预期的编号,现在...) – Deduplicator 2014-09-10 21:10:46

回答

2

我认为这取决于驱动程序是否是硬件特定的。如果希望驱动程序了解设备的协议(它是与某些通用驱动程序相对的设备特定的驱动程序),那么#2可能是您最好的选择,因为它可以最大限度地减少用户空间程序和内核之间的通信量。如果驱动程序应该是硬件不可知的,那么#1应该是你应该实现的(例如,如果它是通信协议的驱动程序,如SPI/I2C而不是设备的驱动程序)。

对于性能,#2几乎肯定会更好,因为它需要1次系统调用而不是115次系统调用。

+0

是的,这是我写的硬件特定的自定义驱动程序。不通用。谢谢你的建议。 – nrcrast 2014-09-10 21:09:37

1

在用户空间中保持复杂度的同时减少用户到内核空间通信的一种方法是让用户空间在一次调用中一次请求全部230个字节的数据。

然后在用户空间中进行位和字节操作。

根据操作的工作原理,它甚至可以在原地完成。你通过struct,得到它填充,然后打电话prepare_data这完成所有的位子摆弄。再往前走一步,你可以将它藏在一个库函数或者头文件函数中。

现在内核空间只提供请求的字节,用户空间包含任何和所有非平凡的逻辑。这使得不太可能的fencepost错误会导致您的机器停机。

+0

这是另一种好方法。感谢您的输入。 – nrcrast 2014-09-10 23:30:05

0

如果你的硬件允许它并没有你需要如何快速获取这些数据没有硬实时要求,这里是一个支持懒惰的方式做到这一点::-)

MMAP固件的IO地址进入用户空间。并从您的用户空间程序中读取它。

这对于“固件”每秒只产生1个数据的情况类型是很好的。

相关问题