Дмитрий
Дмитрий
877 просмотров4 комментариев

gpiod VS SysFS VS /dev/mem способы работы с GPIO на Python

И так как-то давно задались вопросом почему “Малина“ делает свою библиотеку для работы с 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 которые необходимы в боевых проектах, функционал будет примерно одинаков.

Данная статья будет дополняться по блока


Комментарии (4)

Для участия в обсуждении вы должны быть авторизованным пользователем
Владимир  

Очень любопытные результаты теста! Давно хотел потестить скорость дерганья ножками на H5.
А будет продолжение с тестами на ядре RT ?
https://repka-pi.ru/#operation-system-anchor-kernel-rt

Дмитрий
Дмитрий  

Обновил статью

k_s_corp
k_s_corp  

Как вы применяли /dev/mem? есть краткое руководство?

Дмитрий
Дмитрий  

https://gitflic.ru/project/repka_pi/repkapigpio
Вот есть либа, на момент комментария она была еще в разработки. Ну и сейчас в тестирование

Навигация

ВойтиРегистрацияТемы