- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个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)
这是一个非常简单的位爆炸,但我注意到如果我使用写入将数据发送到 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 时,我都创建了文件描述符
所以这就是为什么很慢。同时关闭一些其他程序,传输时间从 1 小时 30 分钟飙升至 3 分钟(使用 write())。对此表示感谢和抱歉
最佳答案
如果您追求性能,我认为spi-bitbang 驱动程序是最佳解决方案。从用户空间进行 bit-bang 是一件痛苦的事情,因为对于每一位数据你至少有 3 个系统调用。系统调用是一项昂贵的操作。
FYI Can't use kernel driver spi because the hardware was connected to gpios and it is a mandatory requirement to use bit bang but i accept any suggestion
这就是 spi-bitbang 驱动程序存在的原因。您可以轻松配置 spi-bitbang 驱动程序以使用您的 GPIO。
然后,一旦您有了spi-bitbang 驱动程序,您就可以编写一个字符设备,接受整个数据 block 作为输入并将其传输到内核空间。使用此解决方案,您将获得 bit-bang 界面的最大性能。
关于linux - Bit Bang with SPI(fwirte,写入性能),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30789296/
我有一个bit bang 代码,它允许我通过 SPI 线发送大约 4 兆的数据。它的嵌入式代码用于使用 Linux 内核的自定义硬件。 问题是需要很长时间才能完成(4 小时),这很可能是因为内核正在做
我是一名优秀的程序员,十分优秀!