🛠 Programmer les cores PRU : le clignotement temps réel déterministe

BeagleBone Black (TI Sitara AM3358) · avance · Schéma : IMG-beaglebone-black-avance-2-pru-blink-cores-temps-reel.svg — schéma bloc du PRU-ICSS de l'AM335x (2 cores 200 MHz, 8 Ko de mémoire d'instructions chacun, RAM partagée 12 Ko) relié directement aux broches d'entrée-sortie, Linux tournant à côté sans y toucher.

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

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

Autres tutoriels pour cette carte

Exemples de code pour cette carte

← Retour à la fiche 🛠 Tous les tutoriels