Linux su Arduino: – E’ possibile farlo funzionare?

Linux Arduino

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!

Linux Arduino

 

Join our groups on Telegram…

… and don’t forget our social channels!

Definire ciò che si è non risulta mai semplice o intuitivo, in specie quando nella vita si cerca costantemente di migliorarsi, di crescere tanto professionalmente quanto emotivamente. Lavoro per contribuire al mutamento dei settori cardine della computer science e per offrire sintesi ragionate e consulenza ad aziende e pubblicazioni ICT, ma anche perche’ ciò che riesco a portare a termine mi dà soddisfazione, piacere. Così come mi piace suonare (sax, tastiere, chitarra), cantare, scrivere (ho pubblicato 350 articoli scientfici e 3 libri sinora, ma non ho concluso ciò che ho da dire), leggere, Adoro la matematica, la logica, la filosofia, la scienza e la tecnologia, ed inseguo quel concetto di homo novus rinascimentale, cercando di completare quelle sezioni della mia vita che ancora appaiono poco ricche.

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.