И так как-то давно задались вопросом почему “Малина“ делает свою библиотеку для работы с GPIO через интерфейс /dev/mem
и тут появилась идея провести небольшой тест, а также затронуть сравнения и по некоторым другим моментам трех библиотек.
Сразу ниже табличка с временными затратами на те или иные действия по которой уже можно сделать однозначный вывод и ответить на вопрос "Почему?"
По просьбе произвел замеры двух способов на RT (Real Time) системе с отключенной графической оболочкой multi-user.target.
Результат замеров чуть больше по времени, не знаю с чем это связано, может то что другая карта памяти, хотя в предыдущем тесте использовалась одна из худших карт, а в этом SanDisk.
Данные замеры были выполнены следующим простым способом
Для gpiod
import gpiod
from time import sleep, time_ns
start = time_ns()
chip = gpiod.chip(1)
led = chip.get_line(64)
config = gpiod.line_request()
config.request_type = gpiod.line_request.DIRECTION_OUTPUT
led.request(config)
print("Init OUT - "+str(time_ns()-start)+" нс")
start = time_ns()
led.set_value(1)
print("Set PIN - "+str(time_ns()-start)+" нс")
start = time_ns()
chip = gpiod.chip(1)
line = chip.get_line(2)
config = gpiod.line_request()
config.request_type = gpiod.line_request.DIRECTION_INPUT
line.request(config)
print("Init IN - "+str(time_ns()-start)+" нс")
start = time_ns()
line.get_value()
print("Get PIN - "+str(time_ns()-start)+" нс")
start = time_ns()
chip = gpiod.chip(1)
line = chip.get_line(8)
config = gpiod.line_request()
config.request_type = gpiod.line_request.DIRECTION_INPUT
config.flags = gpiod.line_request.FLAG_BIAS_PULL_UP
line.request(config)
print("Init IN PULL - "+str(time_ns()-start)+" нс")
Для RepkaPi.GPIO SysFS
from RepkaPi import GPIO
from time import sleep, time_ns
start = time_ns()
GPIO.setboard(GPIO.REPKAPI3)
GPIO.setmode(GPIO.SOC)
GPIO.setwarnings(False)
GPIO.setup(66, GPIO.OUT)
print("Init OUT - "+str(time_ns()-start)+" нс")
start = time_ns()
GPIO.output(66, 1)
print("Set PIN - "+str(time_ns()-start)+" нс")
start = time_ns()
GPIO.setboard(GPIO.REPKAPI3)
GPIO.setmode(GPIO.SOC)
GPIO.setwarnings(False)
GPIO.setup(3, GPIO.IN)
print("Init IN - "+str(time_ns()-start)+" нс")
start = time_ns()
GPIO.input(3)
print("Get PIN - "+str(time_ns()-start)+" нс")
Для RepkaPi.GPIO /dev/mem
from RepkaPi import GPIO
from time import sleep, time_ns
start = time_ns()
GPIO.setboard(GPIO.REPKAPI3)
GPIO.setmode(GPIO.SOC)
GPIO.setwarnings(False)
GPIO.setup(65, GPIO.OUT)
print("Init OUT - "+str(time_ns()-start)+" нс")
start = time_ns()
GPIO.output(65, 1)
print("Set PIN - "+str(time_ns()-start)+" нс")
start = time_ns()
GPIO.setboard(GPIO.REPKAPI3)
GPIO.setmode(GPIO.SOC)
GPIO.setwarnings(False)
GPIO.setup(6, GPIO.IN)
print("Init IN - "+str(time_ns()-start)+" нс")
start = time_ns()
GPIO.input(6)
print("Get PIN - "+str(time_ns()-start)+" нс")
start = time_ns()
GPIO.setboard(GPIO.REPKAPI3)
GPIO.setmode(GPIO.SOC)
GPIO.setwarnings(False)
GPIO.setup(10, GPIO.IN, pull_up_down=GPIO.PUD_UP)
print("Init IN PULL - "+str(time_ns()-start)+" нс")
Чуть так придерусь! Код на gpiod будет чуть больше и сложней. Ну это прям вот придрался к мелочи!
Функциональность #
И так тут ставим “+“ gpiod, она будет функциональна но данная функциональность больше конечно пригодиться на этапе изучения. RepkaPi.GPIO имеют только функции работы с GPIO которые необходимы в боевых проектах, функционал будет примерно одинаков.
Данная статья будет дополняться по блока
Очень любопытные результаты теста! Давно хотел потестить скорость дерганья ножками на H5.
А будет продолжение с тестами на ядре RT ?
https://repka-pi.ru/#operation-system-anchor-kernel-rt
Обновил статью
Как вы применяли /dev/mem? есть краткое руководство?
https://gitflic.ru/project/repka_pi/repkapigpio
Вот есть либа, на момент комментария она была еще в разработки. Ну и сейчас в тестирование