У меня есть код bit bang, который позволяет мне отправлять 4 мегабайта данных по линиям SPI. Его встроенный код для пользовательского оборудования с использованием ядра Linux.
Проблема в том, что это занимает ОЧЕНЬ много времени (4 часа), это, скорее всего, связано с тем, что ядро делает больше. В основном мой код выглядит примерно так (приблизительно):
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
, вот почему это было медленно. Также отключите некоторые другие программы, и время передачи резко возрастет до 3 минут вместо 1 часа 30 минут (с записью()). Спасибо и извините за это