我有一个 bit bang 代码,允许我通过SPI线路发送4兆的数据。它使用Linux内核为自定义硬件嵌入代码。
问题在于需要花费很长时间才能完成(4小时),这很可能是因为内核正在做更多的事情。基本上我的代码是这样的(aprox):
unsigned char data=0xFF;
BB_SPI_Init();
SPI_start();//activates chipselect(enable)
for(i=0;i<8;i++){
if(data & 0x80){
gpio_set_value(SPI_MOSI,1);
}else{
gpio_set_value(SPI_MOSI,0);
}
//send pulse clock
gpio_set_value(SPI_CLK,0);
gpio_set_value(SPI_CLK,1);
data<<=1;
}
SPI_stop();//deactivates chipselect(disable)
所以这是一个非常简单的位爆炸,但我注意到如果我使用write将数据发送到linux gpio处理程序/sys/class/gpio/gpioXX/value
(其中XX是任何gpio编号),则需要4个小时。
但如果我使用fwrite()
发送到同一台设备则需要3个小时。
但是,如果您仅将write()
用于启用(SPI_stop()
和SPI _ start()
)和fwrite()
以发送到MISO,那么它只需要1小时30分钟。
所以,以此作为基础,有人可以向我解释这是怎么回事?我的想象力说是线程的处理方式,并且在每个软件周期中它都会解析2个线程(fwrite()
和write()
)而不是只使用其中一个函数,但现在我还在调查有人能让我知道任何信息吗?有没有更好的方法来解决这个问题?
FYI 无法使用内核驱动程序spi,因为硬件连接到gpios并且强制要求使用bit bang但我接受任何建议
提前致谢
修改
嘿伙计感谢您的评论,似乎我有一个问题(非常愚蠢)我每次创建文件描述符时都要将数据发送到sys/class/gpio/gpioxx/value
,这就是为什么这么慢。同时关闭一些其他程序和转移冲程到3分钟而不是1小时30分钟(写())。谢谢,抱歉,
答案 0 :(得分:4)
如果您正在寻找性能,我认为 spi-bitbang 驱动程序是最佳解决方案。从用户空间进行比特操作是一件很痛苦的事情,因为每个数据位至少有3个系统调用。系统调用是一项昂贵的操作。
FYI无法使用内核驱动程序spi,因为硬件已连接到gpios,并且强制要求使用bit bang但我接受任何建议
这就是 spi-bitbang 驱动程序存在的原因。您可以轻松配置 spi-bitbang 驱动程序以使用您的 GPIO。
然后,一旦你有了一个 spi-bitbang 驱动程序,就可以编写一个char设备,接受整个数据块的输入并将其传输到内核空间。使用此解决方案,您将获得最佳性能的爆炸接口。