Ieri pomeriggio, dopo anni che non compilavo un Kernel, ho cross-compilato (BeagleBoneBlack ha un processore ARM) il kernel 3.8 con l’opzione PREEMPT_RT. Ed è andato tutto a buon fine.
Direttamente dalle riminiscenze dell’esame di Sistemi Operativi, i kernel multitasking possono essere essenzialmente di due tipi: cooperative o preemptive.
Senza entrare troppo nel dettaglio delle nuove tecnologie quali multi-core e multi/hyper-threading, essenzialmente una CPU può eseguire una istruzione alla volta. Pertanto per realizzare sistemi operativi multitasking è necessario creare una sorta di “gestore” (la parte del kernel che si occupa della gestione dei processi) che invia alla CPU le istruzioni da eseguire.
Tornando alle due tipologie, “cooperative” significa che un processo, non appena preso il controllo della CPU, esegue le sue istruzioni e poi ne rilascia, volontariamente, il controllo. Una gestione di tipo “preemptive”, invece, assegna ad ogni processo uno slot definito di tempo nella CPU e, al termine, forza il processo in esecuzione a “cedere il passo”.
Ovviamente la realtà non è proprio così: i processi di scheduling sono molto più complessi ma diciamo che come visione generale può andare bene.
La domanda successiva che viene in mente è: ma perché installare un Kernel Preemptive ?
Beh, in certe situazioni (automazione, controllo industriale…) è necessario riuscire ad avere tempistiche precise sia di calcolo che di trasmissione dei segnali: solamente un kernel in “real time” permette di assicurare l’esecuzione di un processo in un certo arco temporale.
Tornando al progetto del Quadricottero, penso ad esempio al controllo degli ESC (Electronic Speed Controlo) che gestiscono i motori: è fondamentale avere sia il controllo che precise tempistiche di gestione degli stessi, altrimenti il quadricottero cade !
Comunque, per chi volesse sperimentare il “real time” su BBB, le istruzioni per farlo (ed anche per sostituire Angstrom con una Debian) sono qui: http://dev.ardupilot.com/wiki/building-for-beaglebone-black-on-linux/
Eventualmente, per i più ardimentosi, nel repository ufficiale è già disponibile anche il kernel 3.13 e relative patch: https://github.com/beagleboard/kernel
1 comment
Hi,
I am also a fun of BBB and I use it in my projects (www.canmoveit.com)
The most recent version of the kernel (3.14) is much easier to patch with PREEMP_RT.
And actually the mighty Robert C. Nelson provided a very convenient way in his last patch.
https://github.com/RobertCNelson/linux-dev/commit/bd69ecb7570865a29dd24fd779fa8568ffa39e5d
Regards
Davide