Linux e Arduino possono funzionare assieme? Il microcontrollore di Arduino è abbastanza potente per far girare un sistema operativo completo?
Ci sono alcuni luoghi comuni del tipo “funzionerà” quando si tratta di microcontrollori, uno ad esempio è “funzionerà Doom?”, mentre un altro è “funzionerà Linux?”. Vediamo uno degli esempi di kernel Linux con le specifiche più semplici. Arv32-opt ha un kernel Linux aggiornato da avviare su un Arduino Uno vanilla. E nonostante il tutto appaia come magia, ci troviamo davanti ad un kernel compoleto piuttosto che il μClinux ridotto per microcontrollori.
Quelli di voi che da un po’ di tempo trafficano con i mocrocontrollori, probabilmente avranno indovinato come è stato fatto, dato che l’ATmega328 nell’Uno non ha MMU (un sistema per la gestione della memoria per diversi proccessi) ed è appena in grado di svolgere tale task per questo genere di lavoro. Il microcontrollore sta infatti eseguendo un emulatore, in questo caso RISC-V, e come è facile immaginare, è estremamente lento. Occorre attendere diverse ore per una shell con questa macchina.
Il codice è scritto in puro AVR C e vengono fornite istruzioni complete per la compilazione. Lo spazio di archiviazione proviene da una scheda SD, poiché i pochi 32k dell’ATmega non sono neanche lontanamente abbastanza vicini. CI troviamo di fronte ad un sistema peggiore del tristemente noto “Worst PC Ever” del 2012, che emulava ARM invece di RISC-V.
Come funziona
L’idea è davvero semplice: si paarte con un Arduino UNO (o atmega328p) per eseguire la logica dell’emulatore e si accede alla RAM dell’emulatore tramite lo scambio con una scheda SD (che viene utilizzata tramite l’interfaccia SPI, vedi più sotto). L’emulatore dispone inoltre di 3 cache da 512 byte (1 icache e 2 dcache intercambiabili) e un sistema di scrittura cache lazy/ritardata.
Il codice è scritto in puro C (e non in Arduino) per ridurre il sovraccarico di Arduino (se presente). Inizializza UART, SPI, scheda SD e un pin pullup di ingresso digitale per attivare il dump dello stato dell’emulatore. Infine inizializza la cache, poi mini-rv32ima e lascia che l’emulatore faccia il suo lavoro.
Quanto è veloce?
Circa 700 Hz per la maggior parte del tempo, picco 1500 Hz, minimo 70 Hz con codice -O3 su un Arduino UNO basato su atmega328p, con clock a 16 MHz, con una scheda SDHC di classe 4 collegata tramite interfaccia SPI a 1 bit. Il tempo di avvio completo (dall’inizio alla shell) è di circa 15 ore e 44 minuti.
Aggiornamento 24/9/2023: la velocità è raddoppiata/triplicata implementando icache
Aggiornamento 26/9/2023: La velocità è x1,5 implementando 3 cache + sistema di scrittura lazy
Il progetto è quindi attualmente mannutenuto. Vedremo se apparirà un kernel per Arduino R4!
Join our groups on Telegram…