Introduzione al ChibiOS/RT

chibios

ChibiOS è uno dei più popolari sistemi operativi realtime (RTOS) del mondo open source. Vanta una crescente community di utenti ed è stato utilizzato con successo in molti prodotti commerciali dove velocità di esecuzione e compattezza del codice sono requisiti fondamentali. Il nome, non troppo “serio” per volere dell’autore Giovanni Di Sirio, è di origine giapponese e significa “piccolo bambino”. ChibiOS significa dunque “piccolo sistema operativo”. Allo stato attuale questo RTOS non è proprio un ragazzino, poiché è basato su un progetto nato nel 1992 e diventato open nel 2007. Al contrario di molti RTOS open source, ChibiOS non si limita a fornire solo scheduler, task, code e semafori, ma si presenta come un sistema operativo completo. E’ quindi un ottimo prodotto per applicazioni Automotive, Robot, Energy Management e DIY.

Board supportate

Nella distribuzione troviamo molti porting. Le architetture attualmente supportate sono: ARM Cortex M0, M3 e M4, ARM7/9, MSP430, Power Architecture, STM8, MegaAVR.

Tra le board ci sono: STMicroelectronics, Arduino, Embedded Artists LPCXpresso, Maple Mini, Olimex e Raisonance REva. Io ho scelto di utilizzare per i prossimi articoli la STM32F4 Discovery, perché è una board completa, sufficientemente potente per molti tipi di progetti e soprattutto economica!

Nota interessante è la presenza di un porting su PC, utile per simulare e debuggare su PC anche senza una vera board. Come download a parte è disponibile ChibiStudio, un IDE basato su Eclipse, che permette lo sviluppo completo ed il debugging dell’applicazione embedded. Fornisce anche funzionalità per il caricamento del binario del progetto sulla board.

OS

I moduli principali di ChibiOS sono il Kernel e l’HAL. I moduli sono composti da una parte di codice portabile e da un’altra parte strettamente dipendente dall’hardware. Inoltre è possibile aggiungere, rimuovere e configurare funzionalità dei moduli in base alle esigenze dell’applicazione da sviluppare.

Diamo un’occhiata veloce a Kernel e HAL, perchè questi argomenti saranno approfonditi nei prossimi articoli con il dettaglio che meritano.

Kernel

La parte del sistema operativo che si occupa di gestire in maniera sicura l’accesso alle risorse hardware è appunto il Kernel. ChibiOS è completamente statico, cioè non c’è memoria allocata o rilasciata. Sono disponibili alcuni allocatori, ma sono sottosistemi opzionali che non fanno parte del “core”. Questa è una delle peculiarità di design con cui stato progettato ChibiOS.

Un’altra importante caratteristica è la mancanza di condizioni di errore per le funzioni. Esse sono, infatti, progettate in modo da non fallire se vengono passati i parametri corretti.

Perchè il Kernel dovrebbe perdere tempo nel controllare se i parametri passati alle funzioni sono corretti? Questo è compito di chi utilizza il Kernel! Questo non vuol dire che non sia possibile fare dei controlli in fase di sviluppo. E’ infatti possibile attivare delle direttive di compilazione per assicurasi che si stia utilizzando le funzioni del Kernel in modo corretto. Questa direttiva può essere “spenta” quando il software è pronto per andare in modalità “Release”.

In generale le API sono pensate per essere semplici e fare quello che viene descritto senza troppi parametri da passare. Il Kernel ha dimensioni veramente compatte: per esempio, sulla STM32F4, utilizzando il compilatore GCC 4.6.8, la sua dimesione è di 6172 bytes.

Servizi Base

  • Gestione di sistema (inizializzazione, lock , gestione interruzioni, power management, gestione anomalie)
  • Timer
  • Scheduler
  • Thread

Sincronizzazione

  • Semafori
  • Mutex
  • Condition Variables (estensione Mutex)
  • Eventi
  • Messaggi
  • Mailbox

Gestione della memoria

  • core allocator
  • heap
  • memory pool
  • Thread dinamici

Stream e I/O

  • stream di dati
  • canali di I/O
  • code per I/O

HAL (Hardware Abstraction Layer)

Questa parte del sistema operativo si occupa di fornire le interfacce con le quali utilizzare le risorse hardware indipendentemente dalla piattaforma(dispositivo) utilizzata(o). La nostra applicazione non accederà direttamente ai registri del dispositivo usato ma lo farà per mezzo di HAL.

Cosa troviamo nell'HAL di CHIBIOS? Driver! I driver sono di tre tipi: normali, complessi e platform.

Un driver normale ha una parte chiamata “High Level Driver” HLD ed una detta “Low Level Driver” LLD.

La parte HLD è quella portabile, indipendente dalla piattaforma utilizzata, mentre la LLD è implementata in un sorgente dedicato al dispositivo che andremo ad usare.

Un driver complesso fornisce delle funzionalità complesse, utilizzando altri driver e non interagendo con l’hardware. Per esempio un driver per un protocollo su seriale può essere implementato con un driver complesso.

I driver Platform sono dedicati ad intere famiglie di MCU. Se è possibile utilizzare lo stesso codice per un driver che funziona su più dispositivi della stessa famiglia, allora questo driver sarà di tipo platform.

ChibiOS fornisce molti driver già pronti per essere utilizzati :

CAN Controller Area Network
EXT un generico EXT driver
GPT General Purpose Timer, un timer può essere programmato per chiamare una funzione dopo un tempo specificato o a intervalli regolari
I2C Inter-Integrated Circuit
ICU Input Capture Unit driver
MAC Media Access Control driver per controller Ethernet
MMC su SPI driver portabile MMC/SD che utilizza SPI per lo strato fisico
PAL questo driver fornisce un’iterfaccia astratta per utilizzare l’I/O digitale
PWM Pulse Width Modulation driver
RTC driver che fornisce un’interfaccia per Real Time Clock
SDC Secure Digital Card driver
Seriale driver Seriale full duplex
Seriale su USB driver per Seriale su USB Communication Device Class (CDC)
SPI Serial Peripheral Interface driver
UART generico driver UART
USB generico driver USB

Board

Questo componente fornisce le funzioni per inizializzare la board, HAL ed il Kernel, prima di eseguire l’applicazione. Configurando ChibiOS in modo opportuno e’ possibile anche definire un’inizializzazione custom, dove per esempio potremmo settare le periferiche che serviranno al nostro progetto secondo i nostri scopi.

Componenti Esterni

Nella distribuzione troviamo: uIP, stack TCP/IP lwIP, altro stack TCP/IP FatFs, modulo per filesystem FAT I componenti esterni e le librerie non vengono supportate direttamente da ChibiOS, ma vengono fornite piccole patch per un’integrazione ottimale. Nella distribuzione ci sono anche molte demo che utilizzano queste librerie, risulterà molto semplice prendere spunto per sviluppare la propria applicazione.

Varie

Sebbene ChibiOS sia interamente sviluppato in C (con qualche parte in assembly per il codice dipendente dall’hardware), è disponibile un wrapper in C++, per chi voglia sviluppare in tale linguaggio.

Un altro componente utilissimo è la command shell. Si tratta di shell accessibile via seriale (su USB) dalla quale è possibile eseguire comandi direttamente sulla board. La troviamo nelle demo ed un utilizzo veramente utile è quello per i test.

ChibiOS ha un mini framework per sviluppare test suite, tra l’altro sono disponibili le test suite di tutto l’OS. Dalla command shell possiamo lanciare i test di tutte le funzionalità della board ed eventualmente aggiungerne di altri. In questo modo avremo avremo a disposizione anche una misura sui tempi di esecuzione.

ChibiOS offre davvero tanto e nei prossimi articoli approfondiremo tutti gli aspetti teorici e pratici per scrivere le nostre applicazioni.

10 Comments

  1. Piero Boccadoro 15 gennaio 2014
  2. alex272 15 gennaio 2014
  3. Piero Boccadoro 15 gennaio 2014
  4. Piero Boccadoro 15 gennaio 2014
  5. alex272 15 gennaio 2014
  6. Rocco.Faldone 17 gennaio 2014
  7. Giorgio B. 18 gennaio 2014
  8. Giorgio B. 18 gennaio 2014
  9. Umberto Sorbo 19 gennaio 2014
  10. Rocco.Faldone 20 gennaio 2014

Leave a Reply