Bit Bang с SPI (fwirte, производительность записи)

У меня есть код 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 минут (с записью()). Спасибо и извините за это


person Alfred Espinosa    schedule 11.06.2015    source источник
comment
Что не так с использованием spi-bitbang?   -  person Ignacio Vazquez-Abrams    schedule 11.06.2015
comment
Вы можете найти ответ в эта нить Бит-бэнкинг влечет за собой накладные расходы программного обеспечения, потребляющие циклы ЦП, которые в противном случае вы могли бы использовать для других целей. Это может оказать заметное влияние на реакцию системы на другие события, а в системе жесткого реального времени может существенно повлиять на способность системы соблюдать сроки в реальном времени.   -  person Alfred Espinosa    schedule 11.06.2015
comment
Да, но альтернативой является отключение каждого переключателя и в целом занимает больше времени.   -  person Ignacio Vazquez-Abrams    schedule 11.06.2015
comment
Да, но сейчас мне нужно ускорить передачу данных для этих 4 мегабайт данных, это обновление прошивки, поэтому не имеет значения, пострадают ли другие задачи.   -  person Alfred Espinosa    schedule 11.06.2015
comment
Если неважно, что другие задачи страдают, почему бы не использовать spi-bitbang?   -  person tangrs    schedule 12.06.2015


Ответы (1)


Я думаю, что драйвер spi-bitbang — лучшее решение, если вам нужна производительность. Выполнение бит-взрыва из пользовательского пространства - это боль, потому что у вас есть как минимум 3 системных вызова для каждого бита данных. Системный вызов — дорогостоящая операция.

FYI Не могу использовать spi драйвера ядра, потому что оборудование было подключено к gpios, и это обязательное требование для использования bit bang, но я принимаю любое предложение.

Вот почему существует драйвер spi-bitbang. Вы можете легко настроить драйвер spi-bitbang для работы с вашими GPIO.

Затем, когда у вас есть драйвер spi-bitbang, вы можете написать символьное устройство, которое принимает на вход весь ваш блок данных и передает его в пространство ядра. С этим решением вы получите максимальную производительность для битового интерфейса.

person Federico    schedule 11.06.2015
comment
Спасибо за ваш комментарий, я обновил свое описание, указав, в чем была моя проблема, большое спасибо - person Alfred Espinosa; 12.06.2015