Linux su una MCU a 8-bit? Perchè no?!

Far girare un sistema operativo a 32-bit come Linux su un microcontrollore a 8-bit sembrerebbe, a priori, un'impresa alquanto ardua, se non impossibile. Un appassionato di elettronica e informatica, Dmitry Grinberg, si è cimentato in questa impresa, con risultati tutto sommato lusinghieri. Non sarà sicuramente velocissimo, però Linux può girare anche su una MCU a 8-bit.

Quando poco tempo fa ho letto questa notizia, ho provato contemporaneamente diverse sensazioni: sorpresa, stupore, curiosità. Ammettiamolo, a nessuno di noi (o quasi) sarebbe mai venuta in mente un'idea simile, eppure Dmitry si è buttato a capofitto in questa impresa, portandola avanti sino alla fine. Questo progetto, anche se ha un'utilità solamente propedeutica, contiene degli aspetti e delle soluzioni molto interessanti, sia dal punto di vista hardware che da quello software.

Introduzione

Vediamo allora in cosa consiste questa "dimostrazione" fornita da Dmitry, la cui caratteristica principale non è tanto quella di emulare un sistema su un altro sistema "ospite" (detto anche host), quanto quella di eseguire questa emulazione basandosi su delle risorse hardware inferiori a quelle da emulare. Normalmente avviene l'opposto, si emula cioè un'architettura hardware utilizzando un sistema più performante, in modo tale da riuscire a garantire un livello di prestazioni paragonabile a quello originale. Dmitry ha invece seguito la strada opposta, quella cioè di emulare un processore ARM a 32-bit basandosi esclusivamente su un normale microcontrollore AVR a 8-bit. Il porting di Linux su un sistema embedded è una delle aspettative maggiormente frequenti tra i progettisti e gli appassionati di elettronica, prima o poi capita a tutti di chiedersi se questa operazione sia da noi fattibile e quali siano i requisiti minimi richiesti sul piano hardware. La risposta a questa domanda è solitamente di questo tipo: occorre un microcontrollore o processore con un'architettura a 32-bit, una Memory Management Unit (MMU), almeno 1 Mb di memoria RAM per ospitare l'immagine del kernel. Il progetto concepito e realizzato da Dmitry si è prefisso l'obiettivo di frantumare queste aspettative. La scheda visibile nell'immagine di apertura dell'articolo è infatti basata su una MCU a 8-bit ATmega1284p (ma è stata testata con successo anche una versione basata sul modello ATmega644a) ed è in grado di caricare una versione di Linux 2.6.34. Non solo, è anche in grado di caricare una versione del sistema Ubuntu, comprese (se si ha abbastanza pazienza) le interfacce X e gnome.

La RAM

Per caricare ed eseguire Linux, anche solo a livello di shell dei comandi, occorre invitabilmente disporre di una buona quantità di memoria RAM. Come ben visibile nell'immagine seguente, il sistema realizzato da Dmitry è equipaggiato con un vecchio esemplare di memoria SIMM a 30-pin (quelle utilizzate sui primi modelli di PC), la quale si interfaccia direttamente con l'ATmega. Dmitry ha interamente scritto il codice per accedere alla memoria e per eseguirne il refresh in accordo con le specifiche hardware (le memorie SDRAM richiedono infatti un rinfresco continuo delle informazioni, pena la loro perdita). A quale frequenza viene eseguito il refresh della memoria? Ogni 62ms viene gestito un interrupt associato all'operazione di refresh, e l'esecuzione della ISR richiede non più di 1,5ms, il che corrisponde a circa il 3% di utilizzo della CPU. L'accesso alla memoria RAM viene eseguito, per esigenze di semplicità del codice, un byte alla volta. Ne consegue che l'ampiezza massima di banda relativa all'accesso della memoria RAM è pari a circa 300 Kb al secondo.

La memoria di massa

Risolto il problema della memoria RAM, occorre pensare a quale soluzione adottare per la memoria di massa (l'equivalente di un comune hard-disk su un sistema desktop o portatile). La soluzione scelta da Dmitry è stata quella più logica e conveniente, rappresentata dalle comuni schede di memoria SD. Le schede SD sono infatti gestibili attraverso una comune interfaccia di tipo SPI, proprio come fatto nel progetto di Dmitry. La dimensione della scheda SD utilizzata è pari a 1Gb, anche se sarebbe bastata una scheda da 512 Mb (sufficienti per contenere il particolare file system utilizzato, cioè Ubuntu Jaunty). Particolarmente interessante la soluzione prescelta dall'autore del progetto per gestire l'interfaccia SPI: anzichè utilizzare la periferica integrata disponibile sulla MCU ATMega, Dmitry ha preferito utilizzare la soluzione (meramente software) basata sul bit-banging. L'interfaccia risultante è ancora molto veloce (circa 200 Kb al secondo), e aggiunge una caratteristica peculiare al progetto: essa può essere implementata su un qualunque microcontrollore dotato di un numero sufficiente di pin, quindi anche privo della periferica SPI.

La CPU

Quel che resta dell'hardware richiesto, se così possiamo dire, è rappresentato dalla CPU a 32-bit e dal modulo MMU. Purtroppo, l'AVR non dispone di alcuna MMU, e inoltre ha un'architettura a soli 8-bit. Per superare quest'ostacolo, l'autore ha deciso di realizzare un emulatore ARM, l'architettura hardware con la quale aveva maggiore familiarità e dimistichezza.

Altre caratteristiche hardware

La scheda comunica con il mondo esterno tramite una comune interfaccia seriale. Sarebbe comunque possibile collegare alla scheda una tastiera e un display LCD, realizzando così un sistema stand-alone. Come visibile nelle immagini, la scheda è inoltre equipaggiata con due led che indicano gli accessi eseguiti alla memoria SD, uno per la lettura e l'altro per la scrittura. E' inoltre presente un pulsante: se viene premuto per almeno un secondo, il sistema emette sulla porta seriale la velocità effettiva della CPU emulata. L'AVR è comandata da un clock alla frequenza di 24 MHz, leggermente superiore al valore nominale pari a 20 MHz (un pò di overclocking non guasta..).

Le prestazioni

La board non è certo un fulmine (tenetevi forte): occorrono circa 2 ore per arrivare al prompt della shell bash, e altre 4 ore per caricare completamente Ubuntu (fino ad arrivare al login). Per lanciare l'interfaccia grafica X occorre ancora alro tempo. La velocità effettiva della CPU emulata corrisponde a 6,5 KHz, un valore comprensibile visto che si sta emulando una CPU e una MMU a 32-bit su un normale microcontrollore a 8-bit. E' tuttavia sorprendente notare come, una volta caricato, il sistema sia, entro certi limiti, ancora utilizzabile. E' infatti possibile digitare un comando e ottenere la relativa risposta entro 1 minuto. Ciò è sufficiente per affermare che il sistema può essere utilizzato. L'autore lo ha ad esempio impiegato per formattare una scheda di memoria SD. Come afferma lo stesso Dmitry, questo non sarà senz'altro il sistema Linux più veloce, ma sicuramente il più economico, lento, semplice da assemblare, e con il minore numero di componenti hardware richiesti. La scheda è filata, saldando direttamente i fili sui componenti, e non è stato nemmeno previsto un circuito stampato. Si veda al proposito l'immagine seguente.

L'emulatore

Il software di emulazione della CPU è abbastanza modulare, il che significa che esso può essere esteso per emulare altri SoC e configurazioni hardware. La CPU emulata è la ARMv5TE, mentre il SoC emulato è il PXA255. Grazie alla modularità del progetto, è possibile sostituire SoC.c e creare un nuovo SoC con lo stesso core ARMv5TE, oppure sostituire il core, o ancora sostituire le periferiche. Il software di emulazione implementa anche una i-cache (cache istruzioni) per velocizzare il processo. Non è stata ancora implementata una d-cache (cache dati) ma ciò potrebbe essere fatto in futuro.

E' possibile auto-costruirsi un esemplare di questo progetto? La risposta è affermativa, purchè esso venga utilizzato per scopi non commerciali. Al riguardo, sul sito del progetto è disponibile lo schema completo del circuito. Anche il codice sorgente è disponibile per il download presso lo stesso sito. E' disponibile anche il seguente video, girato dallo stesso autore. Il video originale durava circa tre ore e mezza ma, per esigenze di pubblicazione sui siti specialistici di condivisione dei video, è stata creata una versione "ottimizzata" in cui sono state estratte le parti più interessanti e riprodotte a velocità maggiore (fino a 3x). Nel video è visibile un orologio dal quale si può dedurre lo scorrere effettivo del tempo.

Linux su un micro a 8-bit

I prodotti Atmel sono disponibili nel catalogo Farnell

Scarica subito una copia gratis
Tags:

Una risposta

  1. Avatar photo Emanuele 4 Maggio 2012

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend