Thursday, October 26, 2023

Comparing libgpiod and gpiozero speeds on the Raspberry Pi 5 #RaspberryPi #RaspberryPi5

With the new Raspberry Pi 5 coming out, it is time to add support to Blinka, our CircuitPython library compatibility layer. One of the biggest changes to the Raspberry Pi 5 is the addition of a new southbridge chip, called the RP1, which now handles the GPIOs. Like many other projects, we have been using the RPi.GPIO library to handle the General Purpose Input/Outputs. The only issue is that RPi.GPIO does not work on the Raspberry Pi 5 due to a changed memory mapping. Whereas everything was handled by the /dev/gpiomem device before, now everything is dynamically split into multiple gpiomem devices. The 40-pin GPIO header happens to fall into /dev/gpiomem4.

So this means it’s time to look at a couple of new options that do work on the Raspberry Pi 5. The two biggest contenders are libgpiod and gpiozero, though there does appear to be a pure Python version of libgpiod called gpiod. RPi.GPIO was written in C, so it should run faster than a pure Python implementation, however as mentioned before, that no longer appears to be an option. So the replacement should be able to run as fast as possible.

On the surface, libgpiod appears to be the better option because of several different factors:

  • The Python bindings use the libgpiod library underneath, which itself is written in C
  • We already have multiple other libraries using libgpiod, so adding it is much simpler
  • Looking at the source, gpiozero appears to be a pure Python implementation

On the other hand, Raspberry Pi is recommending gpiozero as the replacement to use on the Raspberry Pi 5. So it’s time to compare them head to head on speed alone. In order to test the speed, each library will turn a GPIO on and off as rapidly as possible and the results will be measured with a logic analyzer…

Read the full Adafruit Playground Note here.

No comments:

Post a Comment