Ви не увійшли.
Python RPi.GPIO 0.3.0 / August 1, 2012 44 kHz
C Native library not applicable / July 3 and August 14, 2012 14-22 MHz
Python в 500 медленее ) в идеальных условиях конечно.
Python RPi.GPIO - 44 kHz
Как такое может быть? Пайтон это по сути и есть есть, он построен на СИ, как он может работать быстрее чем СИ? Сама библиотека RPi.GPIO написана на СИ
Самая быстрая работа с любыми I/O будет только если драйвер писать. Код, работающий в драйвере (читай - на уровне ядра операционной системы) может напрямую работать со всеми доступными аппаратными интерфейсами. Код, запускаемый в user space, напрямую обращаться к железу обычно не может (все это применимо к сложным процессорным архитектурам - x86, x86_64, ARM) и для работы вызывает различные API, предоставляемые ядром ОС. Вызов API, передача параметров, переключение контекста (user space -> kernel space), выполнение кода ядра, возвращение управления обратно в программу (снова переключение контекста kernel space -> user space), все это занимает такты процессора и влияет на скорость работы с любыми I/O операциями.
провокационный вопрос )
боюсь что нужно "курить" ядро гну линуха
мои соображения:
скрипты - раз. ( система должна понять что от нее требуется, обработка текста, не самый быстрый процесс )
низкий приоритет выполнения скрипта - два. (мои домыслы )
все операции по записи в файл выполняются ядром, по мере возможности. Опять же непонятно с каким приоритетом.
но есть очень хорошие + : гирлянду на елку можно прописать с консоли.
Ого, а чего такой медленный доступ из-под shell?
Всем привет, есть Raspberry Pi model B, устройство интересное, многофункциональное и не дорогое, + включил и работает, что тоже очень важно )
музыку послушали, мультики посмотрели, нужно что то посущественней - например моторами покрутить, картинки показать )
для таких дел есть GPIO ( напоминаю нагружать ноги запрещено, используйте шилд )
вариантов "подрыгать" ногами много , давайте рассмотрим скорость работы библиотек
в таблице максимально возможные частоты условного меандра
Language Library Version / tested Square wave
Shell /proc/mem access not applicable / July 3, 2012 3.4 kHz
Python RPi.GPIO 0.3.0 / August 1, 2012 44 kHz
Python wiringPi github @ August 14, 2012 20 kHz
C Native library not applicable / July 3 and August 14, 2012 14-22 MHz
C BCM 2835 1.3? / July 3, 2012 4.7 – 5.1 MHz
C wiringPi not available / August 14, 2012 6.9 – 7.1 MHz
Perl BCM 2835 1.0 / July 3, 2012 35 kHz
источник: Benchmarking Raspberry Pi GPIO Speed
библиотеки хороши, код легко читаем, легко и быстро писать, но скорость работы оставляет желать лучшего.
Поэтому только Native, только "хардкор" )
проверил, действительно, 20MHz на ура выдает
скорость работы важна, энергоносители нужно экономить, железяка должна греться поменьше, да и когда есть запас по скорости можно легко реализовывать "фичи" )
например: добавим ка градаций серого к ч/б индикатору (LCD Nokia 3310) :
к делу:
данный пример - простейшее "ногодрыганье", но на "малине" и не со стандартным железом
была необходимость выбрать индикатор, простой, недорогой, малопотребляюший, удобный по монтажу, выбор пал на RDX0032
особо то времени не было, за основу был взят проект UC1601s
выражаю благодарность Геннадию Чернову, основа запустилась сразу.
далее мелкие изменения в коде, для более легкого переноса примера на другие MCU
Индикатор подключается используя шину I2C
в моём примере он не совсем корректно подключен к GPIO, у меня была колодка заточенная под SPI на нее и подключил.
подключение простое (см. RDX0120 ):
где:
RST pin 25
SCK pin 11
SDA pin 9
пример для более удобного ( мне ) старта реализован в среде QT 4.8.2.
выбор среды пал на QT по причине кроссплатформенности + я его изучаю в фоновом режиме )
интерфейс удобный, подсветка идеальна )
установка QT
sudo apt-get install qt4-dev-tools
sudo apt-get install qtcreator
sudo apt-get install gcc
также нужно настроить toolchain
результат теста:
исходники посмотреть, UC1601s_LCD128x32 rev1.00 (30.05.2014) по хорошему нужно переделать на hardware I2C + DMA
пример выводит на дисплей среднюю нагрузку из top
getloadavg(load, 3)
getloadavg возвращает число процессов в системной очереди, усредненное по разным периодам времени, выводит 3 значения, представляя средние данные за последние 1, 5 и 15 минут соответственно.
управление "ногами"
SDAT_HI; SDAT_OUT; /* SDAT = 1 */
SCLK_HI; /* SCLK = 1 */
SDAT_LO; /* SDAT = 0 */
SCLK_LO; /* SCLK = 0 */
где
#define SCLK_LO GPIO_CLR = ( 1 << SCK)
#define SCLK_HI GPIO_SET = ( 1 << SCK)
#define RST 25
#define SCK 11
#define SDA 9
#define GPIO_SET *(gpio+7) // sets bits which are 1 ignores bits which are 0
#define GPIO_CLR *(gpio+10) // clears bits which are 1 ignores bits which are 0
см. BCM2835-ARM-Peripherals.pdf
там же документация на индикатор
RDX0032.pdf - общий вид LCD
uc1601s_a1.25.pdf - описание драйвера LCD
BCM2835-ARM-Peripherals.pdf - BCM2835 contains the following peripherals which may safely be accessed by the ARM:
• Timers
• Interrupt controller
• GPIO
• USB
• PCM / I2S
• DMA controller
• I2C master
• I2C / SPI slave
• SPI0, SPI1, SPI2
• PWM
• UART0, UART1