Dans ce tutoriel, nous allons contrôler une LED avec le GPIO 17 du Raspberry Pi 5. Nous allons tester différentes librairies en Python et en C++ pour voir les performances qu’elles nous offrent.
Les codes des exemples sont tous à la fin de l’article.

Le premier code est réalisé en Python dans l’application Thonny. Cette application est disponible dans la section « programming »

Le code importe LED pour contrôler en sortie le GPIO 17. Il y a aussi une pause dans le code initiale mais on les retire pour mesurer la vitesse de commutation maximale. La fréquence mesurée est de 120kHz. Ce qui est très décevant si l’on considère le matériel utilisé.

La seconde librairie évaluée en Python est LGPIO. Elle est particulièrement intéressante car elle fonctionne dans Python et C++. Avec celle-ci, la fréquence augmente à 460 kHz, ce qui demeure quand même décevant.

Pour ajouter la librairie lgpio à votre installation, utilisez les commandes suivantes :
wget http://abyz.me.uk/lg/lg.zip
unzip lg.zip
cd lg
make
sudo make install
Pour les tests en C/C++, nous allons utiliser Geany, aussi disponible dans le menu « programming ».

Le premier code en C/C++ utilise la librairie LGPIO que nous avons utilisée dans le test précédent en Python. Le résultat est plus rapide, avec cette fois 765 kHz. Pour la même librairie, nous avions obtenu 460kHz avec Python.

Une autre librairie qui fonctionne actuellement pour le Pi 5 est la librairie WiringPi. Voici les commandes pour l’ajouter à votre installation :
sudo apt install git
git clone https://github.com/WiringPi/WiringPi.git
./build debian
mv debian-template/wiringpi_3.12_arm64.deb .
sudo apt install ./wiringpi_3.12_arm64.deb
Le résultat est encore plus rapide, avec environ 900kHz. Ça demeure toujours décevant, mais c’est presque le double que le meilleur résultat en Python.

Une question que vous pourriez vous poser est, est-ce que c’est uniquement pour les GPIO ou Python est en général plus lent que C++. Et bien pour répondre, voici un autre test où l’on fait un compteur dans les deux approches et où l’on mesure le temps d’exécution. Comme vous pouvez le voir, c’est 30 fois plus rapide en C++!

Pourquoi Python est si lent ? Il y a plusieurs raisons et je vous présente les 5 principales selon moi :
1.Langage interprété vs compilé
- Le programme Python est interprété au moment de son exécution
- C++ est déjà compilé et il est directement exécuté
2.Typage dynamique
- Avec Python le type des variables est déterminé à l’exécution ce qui ajoute au traitement
3.Optimisation
- L’optimisation avec Python est réduite du fait qu’il est interprété à l’exécution
4.Gestion de la mémoire
- L’approche avec le « garbage collector » de Python affecte parfois les performances
5.Bibliothèques et abstraction
- Le C++ permet de travailler plus près du matériel
Pour les curieux, il est possible de faire beaucoup mieux en C/C++. Dans un autre tutoriel, nous ferons un programme qui va accéder directement au matériel et atteindre 20MHz. Voici un petit extrait.

Codes des exemples en Python :
# Exemple 1
from gpiozero import LED
from time import sleep
led = LED(17)
while True:
led.on()
sleep(1)
led.off()
sleep(1)
# Exemple 2
import lgpio
OUT=17
h = lgpio.gpiochip_open(0)
lgpio.gpio_claim_output(h, OUT)
while True:
lgpio.gpio_write(h, OUT, 0)
lgpio.gpio_write(h, OUT, 1)
lgpio.gpio_write(h, OUT, 0)
lgpio.gpio_write(h, OUT, 1)
lgpio.gpio_write(h, OUT, 0)
lgpio.gpio_write(h, OUT, 1)
# Exemple 3
counter = 0
while (counter < 100000000):
counter+=1
print(counter)
Codes des exemples en C/C++:
// Exemple 1
#include <lgpio.h>
int main(void)
{
int h;
h = lgGpiochipOpen(0);
lgGpioClaimOutput(h,0,17,0);
while(1)
{
lgGpioWrite(h,17,1);
lgGpioWrite(h,17,0);
lgGpioWrite(h,17,1);
lgGpioWrite(h,17,0);
lgGpioWrite(h,17,1);
lgGpioWrite(h,17,0);
lgGpioWrite(h,17,1);
lgGpioWrite(h,17,0);
lgGpioWrite(h,17,1);
lgGpioWrite(h,17,0);
}
}
// Exemple 2
#include <stdio.h>
#include <wiringPi.h>
int main()
{
wiringPiSetupSys() ;
while(1)
{
digitalWrite (17, HIGH) ; // On
digitalWrite (17, LOW) ; // Off
digitalWrite (17, HIGH) ; // On
digitalWrite (17, LOW) ; // Off
digitalWrite (17, HIGH) ; // On
digitalWrite (17, LOW) ; // Off
digitalWrite (17, HIGH) ; // On
digitalWrite (17, LOW) ; // Off
}
return 0;
}
// Exemple 3
#include <iostream>
int main()
{
uint32_t counter = 0;
while (counter < 100000000)
counter++;
std::cout << counter << std::endl;
return 0;
}