2016-05-06 12 views
-1

Я сделал драйвер устройства на Linaro, который запускал zedboard для управления коммутаторами и светодиодами из Linux.Медленный ввод-вывод с GNU-радио по сравнению с реализацией C

Они установлены в/Proc/zedLeds и/Proc/zedSwitches

Когда итеративно чтения и записи соответствующих драйверов из программы C-порожденной там рядом без задержки. Когда переключатель переключается, соответствующий светодиод горит немедленно.

Я построил модули GNU Radio (источник переключателя и раковину), чтобы сделать то же самое с GNU Radio. Они соединены дросселем образца 32 тыс. При работе с этим дизайном, чем дольше он работает, тем больше задержки происходит от переключения -> освещения.

Мой метод по существу такой же, как с использованием метода C, поэтому я не уверен, откуда происходит крайняя задержка. Я пробовал это как с дросселем, так и без него.

Возможно ли, что использование GNU просто слишком много ресурсов, отстающих от операций?


Это github со всеми файлами проекта.

https://github.com/minersrevolt/zedboard_gnuradio

Состав:

├── gr-zedboard     # gnu radio blocks 
    ├── lib      # GRC Block source code 
     ├──led_sink_impl.cc  # source code for LED Sink block 
     ├──switces_source_impl.cC# source code for Switch Source block    
├── switch_led_drivers   # dev drivers for switch and leds 
    ├── BOOT      # files for BOOT partition of SD Card 
    ├── led_driver    # contains LED device driver 
    ├── switch_driver    # contains Switch device driver 
    ├── testLED_SWITCH_DRIVERS.c # C code showing functionality of dev drivers 
├── switch_led_test    # example GNU Radio Companion build 
+0

Я думаю, что проблема, скорее всего, связана с тем, как часто мне приходится открывать и закрывать соответствующие драйверы ... Я не знаю, как это происходит из контекста блоков GNU Radio. – gutelfuldead

+0

Вы не должны добавлять это как комментарий, но вместо этого улучшите свой код. –

ответ

1

Как обычно, открыть файл сразу, сохранить дескриптор файла в качестве частного члена вашего блока осущ, и использовать его. Мы обсуждали это в каждом Вопросе, который вы задали. Я не понимаю, почему вы все еще это делаете. Я думаю, что это будет последний вопрос, связанный с GR, который я отвечу, который включает в себя следующие шаги. Это просто плохой дизайн, и мы объясняли это несколько раз. Вы встроенный разработчик, поэтому действуйте как один.

Не может ли быть, что использование GNU просто занимает слишком много ресурсов, отстающих от операций?

Нет. Вы, наверное, не понимаете, что имея блок дроссельной заслонки делает - это гарантирует, что скорость образцов, проходящих через среднего идет о наборе скорости. Тем не менее, GNU Radio обрабатывает образцы в «кусках», то есть источник всегда будет заполнять столько буфера, сколько может. Теперь, блок дроссельной заслонки передается, скажем, 10 000 образцов одновременно; поэтому он рассчитывает, что он должен ждать 1/3,2 с, пока он не скопирует их из входов. Пока дроссель блокирует его работу, источник снова и снова просят произвести образцы, как можно быстрее. Эти образцы накапливаются до тех пор, пока выходной буфер вашего источника коммутатора не будет заполнен, а это означает, что дроссель сразу после обработки вашего первого фрагмента образцов встречается с большим количеством образцов, поэтому ждет долгое время и так далее.

В то же время вы вызываете метод приемника work; в вашем случае он потребляет 1 из этих 10 000 предметов, а затем сразу же вызывается снова с 9999 и так далее.

Вы можете уменьшить размер «куска», установив максимальное количество выходных выборок на блок дроссельной заслонки. Однако это не сработает до степени детализации 1 - это просто не то, для чего предназначалось GNU Radio.

Если вам необходимо ограничить скорость, вы должны реализовать это в своем источнике или в раковине или и то и другое, либо в пользовательской области, либо в драйвере.Throttle на самом деле просто инструмент для потоковых графиков, которые являются чистыми симуляторами, без аппаратных входов или выходов, ограничивающих скорости.

+0

Маркус, я взял ваше ругательство близко к сердцу и провел несколько дней, пройдя курс крушения на C++ и познакомившись с классами. Все, что я делал раньше, было попыткой разобраться в том, как я достиг этого в C на C++ - неэффективен. Я создал функции конструктора классов и деконструктора, чтобы держать драйвер открытым в течение всего потока. В настоящее время он считывает/записывает первое значение, а затем все последующие значения получают нулевой вывод. В любом случае просто хотел сказать спасибо за предыдущую помощь и жесткую любовь; это помогло. Все еще работаю над этим. – gutelfuldead