Su una scheda da 45 dollari, la BeagleBone Black mette due microcontrollori a 200 MHz — le PRU — accanto al core ARM Cortex-A8 che fa girare Linux. Tra le single-board computer di pari prezzo del 2013 è un tratto raro. Il resto della scheda — 512 MB di DDR3, 2 GB di eMMC, uscita HDMI, Ethernet 10/100 — è quello che ci si aspetta da una SBC ARM nel 2013. Le PRU no.

Contesto

BeagleBoard.org vende schede con i SoC Sitara di Texas Instruments dal 2008. La linea BeagleBone, più piccola ed economica delle BeagleBoard originali, era già arrivata nel 2011 con la prima versione: intorno ai 90 dollari, costruita sull’AM3359. Già quella scheda montava un SoC della famiglia AM335x e integrava il sottosistema PRU-ICSS con due core a 200 MHz. Le PRU non nascono con la Black. La Black, annunciata ad aprile 2013, scende a 45 dollari adottando l’AM3358 — un fratello dello stesso AM335x — e aggiunge la flash a bordo.

Il confronto naturale, nel 2013, è il Raspberry Pi Model B, uscito un anno prima a 35 dollari. Le due schede si rivolgono a pubblici in parte diversi: il Pi nasce per la didattica e il multimediale (il SoC Broadcom BCM2835 ha una GPU VideoCore IV molto capace), la BeagleBone Black mette in primo piano l’I/O verso il mondo fisico. La differenza si vede meno nei numeri della CPU e più in quello che le sta intorno.

Architettura

Il cuore è il TI AM335x, un Cortex-A8 a 1 GHz: core singolo, in-order, con NEON e VFP — la stessa classe del Cortex-A8 che si trova su molte schede dell’epoca. Accanto al core principale, sullo stesso silicio, il SoC integra il sottosistema PRU-ICSS (Programmable Real-Time Unit and Industrial Communication SubSystem): due core a 32 bit, 200 MHz, ciascuno con un proprio set di istruzioni, memoria locale dedicata e accesso diretto ai pin di I/O.

Le PRU non condividono la pipeline del Cortex-A8 e non passano per lo scheduler di Linux. Eseguono codice in modo deterministico: ogni istruzione dura un ciclo (5 ns a 200 MHz), salvo gli accessi alla memoria esterna. Così un loop scritto sulla PRU commuta un pin con jitter trascurabile, mentre lo stesso loop sul Cortex-A8 — che attraversa kernel, interruzioni e scheduler — accumula latenze variabili nell’ordine dei microsecondi o peggio.

La scheda porta fuori i segnali su due header da 46 pin (i connettori P8 e P9). Su quei 92 contatti, tolte alimentazioni e riferimenti, convergono GPIO general-purpose, fino a sette UART, SPI, due bus I2C, generatori PWM hardware (eHRPWM), moduli di cattura (eCAP), un controller CAN e sette ingressi di un ADC a 12 bit. Molti pin sono multiplexati: la funzione effettiva si sceglie via pinmux, e nella Black del 2013 alcune sono già occupate dalle linee verso l’eMMC e l’HDMI.

Sui 2 GB di eMMC la scheda arriva con un’immagine Ångström preinstallata, toolchain e strumenti di sviluppo già pronti. Si avvia da eMMC senza microSD; lo slot resta libero per immagini alternative o per riscrivere l’eMMC stessa.

Il punto critico

Il problema pratico delle PRU, nel 2013, è il software. Due core deterministici sul silicio non bastano: vanno programmati, caricati e messi a dialogare con il Linux che gira sul Cortex-A8.

La toolchain di riferimento è quella di Texas Instruments: l’assemblatore pasm e il PRU Assembly, più la libreria prussdrv (in userspace, sopra il driver uio_pruss) per caricare il firmware nella memoria istruzioni della PRU, avviarla, fermarla e scambiare dati attraverso la memoria condivisa. Chi ha già lavorato con DSP o coprocessori si ritrova: si scrive un piccolo firmware, lo si compila a parte, lo si carica e lo si sincronizza con l’applicazione principale.

I dati passano per regioni di RAM mappate — la data RAM di ciascuna PRU più una memoria condivisa — e per un meccanismo di interrupt che le PRU sollevano verso l’host. Sulla PRU non c’è un sistema operativo né astrazioni: si lavora a registri e indirizzi. Per chi viene dai microcontrollori è terreno noto; per chi conosce solo il Linux applicativo è un altro modo di ragionare, e la documentazione del 2013 è frammentaria — buona parte della pratica circola sui forum e negli esempi della community più che in un manuale unico.

Resta poi il device tree. Il kernel della Black usa i Device Tree Overlay per riconfigurare il pinmux a runtime e attivare le periferiche su P8/P9. Un overlay sbagliato, nel caso migliore, lascia un pin che non commuta; nel peggiore, entra in conflitto con una linea già assegnata all’eMMC.

Implicazioni

Dove serve un timing rigido, la PRU sposta il problema fuori da Linux invece di combatterlo con patch real-time del kernel. Generare treni di impulsi per motori passo-passo, decodificare un protocollo seriale non standard, pilotare strisce LED con timing al nanosecondo, leggere un encoder ad alta frequenza: sono compiti in cui un Cortex-A8 sotto Linux fatica per la latenza non deterministica, mentre un core dedicato li risolve senza giri.

L’altro effetto riguarda il posizionamento. CAN, ADC, PWM hardware e PRU spingono la BeagleBone Black verso il controllo e l’acquisizione — il terreno in cui finora si sarebbe affiancato un microcontrollore a un calcolatore. Qui i due mondi stanno sullo stesso SoC: Linux per rete, logica applicativa e interfaccia, le PRU per il contatto stretto con i segnali.

Limiti

Le PRU non sono general-purpose: niente cache, niente unità a virgola mobile, niente sistema operativo. Tutto deve stare nei pochi kilobyte di memoria istruzioni ed essere scritto a basso livello. Per molti progetti il gioco non vale la candela, e gestire l’I/O direttamente dal Cortex-A8 accettandone il jitter va benissimo.

Documentazione e tooling, ad aprile 2013, sono la parte più acerba. L’AM335x e il suo PRU-ICSS sono descritti bene nel Technical Reference Manual di TI, ma dalla teoria a un firmware che gira si passa raccogliendo informazioni sparse. Chi adotta la scheda per le PRU mette in conto tempo di apprendimento e qualche sessione a leggere registri.

Sul fronte multimediale, infine, l’AM335x privilegia l’I/O sulla grafica: l’accelerazione 3D è limitata e l’HDMI serve più per una console di servizio che per il video pesante. Contro le schede dalle GPU più capaci il confronto non è alla pari, ma è una scelta coerente con quello che la scheda vuole fare.


Immagine di copertina: Vista dall’alto della scheda BeagleBone Black con il SoC al centro, i due header neri di pin P8 e P9 lungo i bordi lunghi, porta… — foto di Gareth Halfacree, CC BY-SA 2.0 — https://commons.wikimedia.org/wiki/File:Beaglebone_Black_-_Top_(14491195107).jpg