🛠 Programmer les cores PRU : le clignotement temps réel déterministe
Objectifs
Le vrai pouvoir de l'AM335x : deux cores PRU-ICSS 32 bits à 200 MHz câblés directement sur les broches d'entrée-sortie, capables de bit-banging et d'asservissements déterministes pendant que Linux tourne à côté. Vous allez assembler un clignotement PRU en assembleur, le charger via le driver remoteproc mainline, et mesurer la stabilité de la période. Le SRM le rappelle : TI n'a jamais supporté cette chaîne sur cette plateforme — c'est l'écosystème communautaire (am335x_pru_package) qui porte le sujet.
Matériel
- 1 BeagleBone Black
- Oscilloscope ou analyseur logique sur la broche de sortie (ou un simple LED + résistance pour l'œil)
- Paquets : build-essential, device-tree-compiler ; toolchain communautaire am335x_pru_package
Code complet
; blink.pasm — bascule la broche PRU0 R30.7 (à muxer vers une broche
; de nappe via un overlay gpmux)
.origin 0
.cinit
INIT SET R30, 0 ; efface le registre de sortie
LOOP SET R30.t7 ; bit 7 haut -> broche haute
CALL DELAY
CLR R30.t7 ; bit 7 bas -> broche basse
CALL DELAY
JMP LOOP
DELAY MOV R0, 200000000 ; ~1 s à l'horloge 200 MHz du PRU
WAIT SUB R0, R0, 1
QBEQ DONE, R0, 0
JMP WAIT
DONE HALT
# Assemblage avec la toolchain communautaire
git clone https://github.com/beagleboard/am335x_pru_package
cd am335x_pru_package && make -C pru_sw/app_loader && cd ..
export PATH=$PWD/pru_sw/utils:$PATH
clpr blink.pasm && link_pru blink.obj blink_out
sudo cp blink_out /lib/firmware/am335x-pru0-fw
# Chargement via remoteproc mainline (les noms exacts varient selon le noyau)
ls /sys/class/remoteproc/
echo start | sudo tee /sys/class/remoteproc/remoteproc0/state
cat /sys/class/remoteproc/remoteproc0/state # attendu : running
Vérification attendue
L'état remoteproc passe à running et l'oscilloscope montre un créneau parfaitement régulier : la période ne dépend PAS de la charge Linux (tester avec stress-ng --cpu 1 à côté : le créneau ne bouge pas d'un cycle). C'est la démonstration du co-processeur temps réel.
Erreurs fréquentes
- Oublier le muxing de la broche : R30.7 ne devient un signal de nappe que si un overlay (gpmux) le route ; sinon le PRU tourne dans le vide.
- Le nom du firmware doit être exactement am335x-pru0-fw (ou am335x-pru1-fw) pour que le driver remoteproc le trouve.
- Les indices remoteproc0/1 changent selon les noyaux : scripter par nom de core, pas par numéro.
- Confondre les chaînes d'outils : SDK TI, paquet communautaire et mainline se marchent sur les pieds ; figer une source de toolchain.
- Le SRM est explicite : « This feature is not supported by Texas Instruments » — en cas de bug, c'est la communauté (et la doc fragmentée) qui répond, pas le support TI.
Autres tutoriels pour cette carte
- Premier boot de la BeagleBone Black avec un seul câble mini-USB
- Comprendre les triggers en pilotant les 4 LED utilisateur
- Bouton et LED avec Adafruit_BBIO, la bibliothèque historique
- Lire l'ADC 12 bits sans griller le SoC : la règle des 1,8 V
- Ajouter une horloge temps réel sur le bus I2C des capes
- Micro-HDMI : exploiter les limites d'affichage de la BBB
Exemples de code pour cette carte
clignotante.pyPythonbouton-gpio.pyPythoncapteur-i2c.shBashsurveillance-temperature.shBashcapteur-dht11.pyPythonservo-pwm-sysfs.shBash