1

我有一个有点爆炸的代码,允许我通过 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、CLK,则只需 1 小时 30 分钟。

那么,以此为基础,有人可以向我解释这是怎么回事吗?我的想象力说这是处理线程的方式,并且在每个软件周期中它解析 2 个线程(fwrite()write())而不是如果只是使用的功能之一,但现在我仍在调查,有人可以让我知道任何类型的信息? 有没有更好的方法来处理这个?

仅供参考 ,不能使用内核驱动程序 spi,因为硬件已连接到 gpios,并且使用 bit bang 是强制性要求,但我接受任何建议

提前致谢

编辑

嘿,伙计们,感谢您的评论,看来我遇到了一个问题(非常愚蠢),我每次要向其发送数据时都创建了文件描述符,sys/class/gpio/gpioxx/value这就是为什么速度很慢。还要关闭一些其他程序,传输时间会飙升到 3 分钟而不是 1 小时 30 分钟(使用 write())。感谢和抱歉

4

1 回答 1

5

如果您正在寻找性能,我认为spi-bitbang驱动程序是最好的解决方案。从用户空间执行 bit-bang 是一件很痛苦的事情,因为每个数据位至少有 3 个系统调用。系统调用是一项昂贵的操作。

仅供参考,不能使用内核驱动程序 spi,因为硬件已连接到 gpios,并且使用 bit bang 是强制性要求,但我接受任何建议

这就是存在spi-bitbang驱动程序的原因。您可以轻松配置spi-bitbang驱动程序以使用您的GPIO。

然后,一旦你有了一个spi-bitbang驱动程序,你就可以编写一个字符设备来接受你的整个数据块作为输入并在内核空间中传输它。使用此解决方案,您将获得位爆炸接口的最大性能。

于 2015-06-11T23:09:47.217 回答