🛠 Programmer les cores PRU : le clignotement temps réel déterministe
Objetivos
El verdadero poder del AM335x: dos núcleos PRU-ICSS de 32 bits a 200 MHz conectados directamente a los pines de entrada/salida, capaces de realizar bit-banging y controles deterministas mientras Linux se ejecuta en paralelo. Vas a ensamblar un parpadeo PRU en ensamblador, cargarlo mediante el controlador remoteproc de la rama principal (mainline) y medir la estabilidad del periodo. El SRM lo recuerda: TI nunca ha admitido esta cadena en esta plataforma; es el ecosistema comunitario (am335x_pru_package) el que sostiene el tema.
Material
- 1 BeagleBone Black
- Osciloscopio o analizador lógico en el pin de salida (o un simple LED + resistencia para la vista)
- Paquetes: build-essential, device-tree-compiler; toolchain comunitaria am335x_pru_package
Código completo
; 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
Verificación esperada
El estado de remoteproc pasa a running y el osciloscopio muestra una señal perfectamente regular: el periodo NO depende de la carga de Linux (pruébalo con stress-ng --cpu 1 en paralelo: la señal no se mueve ni un ciclo). Esta es la demostración del coprocesador en tiempo real.
Errores frecuentes
- Olvidar el multiplexado (muxing) del pin: R30.7 solo se convierte en una señal de bus si un overlay (gpmux) lo enruta; de lo contrario, el PRU se ejecuta en el vacío.
- El nombre del firmware debe ser exactamente am335x-pru0-fw (o am335x-pru1-fw) para que el controlador remoteproc lo encuentre.
- Los índices remoteproc0/1 cambian según los núcleos: scriptéalo por nombre de núcleo, no por número.
- Confundir las cadenas de herramientas: el SDK de TI, el paquete comunitario y la rama principal (mainline) se pisan entre sí; fija una única fuente de toolchain.
- El SRM es explícito: «This feature is not supported by Texas Instruments» — en caso de error, es la comunidad (y la documentación fragmentada) la que responde, no el soporte de TI.
Otros tutoriales para esta placa
- 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
Ejemplos de código para esta placa
clignotante.pyPythonbouton-gpio.pyPythoncapteur-i2c.shBashsurveillance-temperature.shBashcapteur-dht11.pyPythonservo-pwm-sysfs.shBash