Upload
sebastiana-grimaldi
View
239
Download
16
Embed Size (px)
Citation preview
11
Università degli Studi di MessinaUniversità degli Studi di MessinaFacoltà di IngegneriaFacoltà di Ingegneria
Visilab – Computer Vision and Image Processing LabVisilab – Computer Vision and Image Processing Lab
NanodesktopSoftware development kit per sistemi embedded
Uno sguardo agli internals
Corso di Sistemi Operativi IIMessina, 11/12/2009Seminario tenuto dall’ing. Filippo Battaglia
22
Nella scorsa lezione abbiamo iniziato a vedere le caratteristicheNella scorsa lezione abbiamo iniziato a vedere le caratteristiche
di Nanodesktop, un SDK per piattaforme embedded di Nanodesktop, un SDK per piattaforme embedded
sviluppato presso il laboratorio Visilab di questa sviluppato presso il laboratorio Visilab di questa
Università.Università.
In questa lezione, analizzeremo alcuni aspetti relativi agliIn questa lezione, analizzeremo alcuni aspetti relativi agli
internals di Nanodesktop.internals di Nanodesktop.
Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy
Nanodesktop tecnology
33
Ricordiamo che l’ultima volta avevamo analizzato la Ricordiamo che l’ultima volta avevamo analizzato la
Nanodesktop System Architecture. Nanodesktop System Architecture.
Avevamo detto che il nucleo del sistema nd è diviso in due Avevamo detto che il nucleo del sistema nd è diviso in due
parti: l’HAL, parti: l’HAL, Hardware Abstraction Layer, Hardware Abstraction Layer, che ha la funzioneche ha la funzione
di nascondere agli strati superiori del software le caratteristichedi nascondere agli strati superiori del software le caratteristiche
specifiche della piattaforma, ed il livello CODE, che contienespecifiche della piattaforma, ed il livello CODE, che contiene
le parti che non sono specifiche per l’hardwarele parti che non sono specifiche per l’hardware
Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy
Nanodesktop tecnology
44Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy
Nanodesktop tecnology
55
Nanodesktop tecnology
66
Problema: Problema:
Come possiamo realizzare un window manager che sia veloceCome possiamo realizzare un window manager che sia veloce
ed efficiente ?ed efficiente ?
Ci poniamo dei requisiti.Ci poniamo dei requisiti.
Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy
Nanodesktop tecnology
77
Il nostro window manager:Il nostro window manager:
- deve rinunciare alla compatibilità con X-Window e con Window GDI.- deve rinunciare alla compatibilità con X-Window e con Window GDI.
Eventuali estensioni (SDL) verranno aggiunte solo in seguito e Eventuali estensioni (SDL) verranno aggiunte solo in seguito e
gireranno gireranno sul sul codice nativo attraverso codice nativo attraverso un layer di traduzione;un layer di traduzione;
- deve gestire un numero di finestre limitato a n (e non infinito);deve gestire un numero di finestre limitato a n (e non infinito);
- deve gestire un limitato numero di effetti (trasparenze, wallpapers ok, ma niente supporto per finestre 3d, temi del deve gestire un limitato numero di effetti (trasparenze, wallpapers ok, ma niente supporto per finestre 3d, temi del desktop odesktop o
tab ad esempio);tab ad esempio);
- deve supportare i font TrueType tramite la libreria FreeType;deve supportare i font TrueType tramite la libreria FreeType;
- deve supportare il puntatore del mouse;deve supportare il puntatore del mouse;
- deve supportare gli sprite;deve supportare gli sprite;
- deve fornire delle dialog box già a disposizione degli sviluppatorideve fornire delle dialog box già a disposizione degli sviluppatori
per compiti specifici (per esempio, per la selezione di un file)per compiti specifici (per esempio, per la selezione di un file)
Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy
Nanodesktop tecnology
88
- deve gestire i menudeve gestire i menu- deve essere accelerato in hardwaredeve essere accelerato in hardware- deve avere il supporto per il char overscreen;deve avere il supporto per il char overscreen;- deve gestire una finestra di default per l’output StdOut/StdErrdeve gestire una finestra di default per l’output StdOut/StdErr
Molti window manager (specie sotto Unix) sono lenti a causa diMolti window manager (specie sotto Unix) sono lenti a causa discelte architetturali particolari (comunicazione tramite socket scelte architetturali particolari (comunicazione tramite socket Unix tra X-client ed X-server).Unix tra X-client ed X-server).
Una libreria C, piccola, compatta ed efficiente permette di Una libreria C, piccola, compatta ed efficiente permette di ottenere prestazioni superiori: il prezzo che si paga è un ottenere prestazioni superiori: il prezzo che si paga è un aspetto spartano e la perdita di compatibilità con il softwareaspetto spartano e la perdita di compatibilità con il softwarepreesistentepreesistente
Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy
Nanodesktop tecnology
99
Cerchiamo di capire come funziona, a grandi linee, il sistemaCerchiamo di capire come funziona, a grandi linee, il sistema
grafico di Nanodesktopgrafico di Nanodesktop
Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy
Nanodesktop tecnology
1010
I dati relativi ad ogni singola finestra sono memorizzati inI dati relativi ad ogni singola finestra sono memorizzati inuna struct chiamata una struct chiamata WindowData. WindowData.
Questa struct contiene dei puntatori a delle aree di memoriaQuesta struct contiene dei puntatori a delle aree di memoriache contengono il contenuto della finestra. che contengono il contenuto della finestra.
Queste aree si chiamano:Queste aree si chiamano:
- charmap;charmap;- color char map;color char map;- window space (WS)window space (WS)- service space (SS)service space (SS)- winsprite screen (WSPR)winsprite screen (WSPR)- logical page (LP)logical page (LP)
Queste aree vengono allocate/deallocate dinamicamente dalla libreriaQueste aree vengono allocate/deallocate dinamicamente dalla libreriasulla base delle richieste dei programmi e delle esigenze effettive.sulla base delle richieste dei programmi e delle esigenze effettive.
Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy
Nanodesktop tecnology
1111
Anche ciò che è presente sullo sfondo delle finestre èAnche ciò che è presente sullo sfondo delle finestre è
memorizzato in apposite aree di memoria gestitememorizzato in apposite aree di memoria gestite
dinamicamente. dinamicamente.
Esse sono:Esse sono:
- il base screen (BS)il base screen (BS)
- lo sprite screen (SPR)lo sprite screen (SPR)
Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy
Nanodesktop tecnology
1212
Analizziamo il sorgente di un programma NanodesktopAnalizziamo il sorgente di un programma Nanodesktop
#include <nanodesktop.h>#include <nanodesktop.h>
int ndMain()int ndMain()
{{
int CounterX, CounterY, WndHandle;int CounterX, CounterY, WndHandle;
ndInitSystem();ndInitSystem();
WndHandle=ndLP_CreateWindow (5, 5, 400, 250, "Prova", COLOR_WHITE, COLOR_LBLUE,WndHandle=ndLP_CreateWindow (5, 5, 400, 250, "Prova", COLOR_WHITE, COLOR_LBLUE,
COLOR_BLACK, COLOR_WHITE, 0);COLOR_BLACK, COLOR_WHITE, 0);
if (WndHandle>=0)if (WndHandle>=0)
{{
ndLP_MaximizeWindow (WndHandle);ndLP_MaximizeWindow (WndHandle);
for (CounterY=0; CounterY<4; CounterY++)for (CounterY=0; CounterY<4; CounterY++)
{{
for (CounterX=0; CounterX<4; CounterX++)for (CounterX=0; CounterX<4; CounterX++)
{{
ndWS_DrawRtRectangle (40+60*CounterX, 30+50*CounterY, 30, 30,ndWS_DrawRtRectangle (40+60*CounterX, 30+50*CounterY, 30, 30,
ndWndColorVector [4*CounterY+CounterX], COLOR_YELLOW,ndWndColorVector [4*CounterY+CounterX], COLOR_YELLOW,
NDKEY_BORDER_SIZE (5) | ND_ROUNDED | NDKEY_ROTATE (45),NDKEY_BORDER_SIZE (5) | ND_ROUNDED | NDKEY_ROTATE (45),
WndHandle, NORENDER);WndHandle, NORENDER);
}}
}}
XWindowRender (WndHandle);XWindowRender (WndHandle);
}}
}}
Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy
Nanodesktop tecnology
1313
che dà il seguente risultato:che dà il seguente risultato:
Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy
Nanodesktop tecnology
1414
Il sistema grafico di Nanodesktop si basa su un sistema diIl sistema grafico di Nanodesktop si basa su un sistema di
renderer. renderer. Questi si distinguono in renderer di primo e di Questi si distinguono in renderer di primo e di
secondo livello. I renderer di secondo livello vengono richiamati secondo livello. I renderer di secondo livello vengono richiamati
dal programma applicativo in C tramite apposite routine:dal programma applicativo in C tramite apposite routine:
XWindowRender (WndHandle);XWindowRender (WndHandle);
WinSpritesRender (WndHandle);WinSpritesRender (WndHandle);
BaseScreenRender ();BaseScreenRender ();
SpritesRender ();SpritesRender ();
I renderer di secondo livello richiamano internamente il rendererI renderer di secondo livello richiamano internamente il renderer
di primo livello:di primo livello:
WindowsRender ();WindowsRender ();
Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy
Nanodesktop tecnology
1515
In Nanodesktop, l’aspetto globale di una finestra (titolo,In Nanodesktop, l’aspetto globale di una finestra (titolo,
contenuto, pulsanti di chiusura e di ridimensionamentocontenuto, pulsanti di chiusura e di ridimensionamento
ecc. ecc.) è contenuto dentro un array chiamato ecc. ecc.) è contenuto dentro un array chiamato
pagina logica pagina logica (LP, logical page). (LP, logical page).
Ogni finestra ha assegnata una propria logical page.Ogni finestra ha assegnata una propria logical page.
WindowsRender()WindowsRender() analizza i dati presenti nelle varie analizza i dati presenti nelle varie
pagine logiche e ricostruisce il frame video finale in una pagine logiche e ricostruisce il frame video finale in una
pagina nascosta del framebuffer della PSP.pagina nascosta del framebuffer della PSP.
Al termine, una commutazione della pagina video attiva faAl termine, una commutazione della pagina video attiva fa
apparire il frame istantaneamente (tecnica del apparire il frame istantaneamente (tecnica del double bufferingdouble buffering))
Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy
Nanodesktop tecnology
1616
Per capire l'attività del renderer di livello LP, è sufficiente guardare questa figura:Per capire l'attività del renderer di livello LP, è sufficiente guardare questa figura:
Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy
Nanodesktop tecnology
1717
L’algoritmo usato da WindowsRender è molto sofisticato.L’algoritmo usato da WindowsRender è molto sofisticato.
Infatti, Nanodesktop deve gestire Infatti, Nanodesktop deve gestire ad ogni frame: ad ogni frame:
- sovrapposizione di finestresovrapposizione di finestre
- spritessprites
- trasparenzetrasparenze
- wallpaperswallpapers
Per incrementare la velocità di rendering, Nanodesktop usa unoPer incrementare la velocità di rendering, Nanodesktop usa uno
speciale algoritmo chiamato speciale algoritmo chiamato accelerazione NanoTile. accelerazione NanoTile.
Tale algoritmo fa uso del chip grafico della PSP per incrementareTale algoritmo fa uso del chip grafico della PSP per incrementare
la velocità di renderingla velocità di rendering
Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy
Nanodesktop tecnology
1818
Nanodesktop divide ogni frame in diverse tessere (Nanodesktop divide ogni frame in diverse tessere (tilestiles). ).
Quando si esegue WindowsRender(), Nanodesktop esegue unaQuando si esegue WindowsRender(), Nanodesktop esegue una
serie di chiamate al chip grafico della PSP, visualizzando adserie di chiamate al chip grafico della PSP, visualizzando ad
una ad una le varie tileuna ad una le varie tile
Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy
Nanodesktop tecnology
1919
Il chip grafico della PSP è estremamente veloce. La copia di datiIl chip grafico della PSP è estremamente veloce. La copia di dati
è molto più rapida quando eseguita con è molto più rapida quando eseguita con sceGuCopyImage() sceGuCopyImage()
piuttosto che quando viene eseguita via software. piuttosto che quando viene eseguita via software.
Quindi, grazie a NanoTile, noi possiamo ridurre il problema delQuindi, grazie a NanoTile, noi possiamo ridurre il problema del
rendering del frame ad una successione di chiamate all’acceleratorerendering del frame ad una successione di chiamate all’acceleratore
grafico. (Sotto PSPE, l’unità hardware blitter non è presente,grafico. (Sotto PSPE, l’unità hardware blitter non è presente,
quindi l’HAL la emula via software). quindi l’HAL la emula via software).
L’algoritmo NanoTile è progettato in modo che, se solo una parteL’algoritmo NanoTile è progettato in modo che, se solo una parte
dello schermo viene modificata, Nanodesktop renderizzerà solo quella.dello schermo viene modificata, Nanodesktop renderizzerà solo quella.
Le altre parti dello schermo non vengono renderizzate se non Le altre parti dello schermo non vengono renderizzate se non
sono cambiate. Questo approccio migliora le prestazioni. sono cambiate. Questo approccio migliora le prestazioni.
Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy
Nanodesktop tecnology
2020
E’ necessario comprendere che WindowsRender() è solo unaE’ necessario comprendere che WindowsRender() è solo una
routine a basso livello. Raramente i software applicativi laroutine a basso livello. Raramente i software applicativi la
richiamano direttamente. richiamano direttamente.
Le applicazioni di solito richiamano dei render di secondo livello,Le applicazioni di solito richiamano dei render di secondo livello,
come come XWindowRender() XWindowRender() che agiscono su una singola finestrache agiscono su una singola finestra
e che, al termine del lavoro, richiamano internamentee che, al termine del lavoro, richiamano internamente
WindowsRender() riunendo il contenuto delle varie finestre inWindowsRender() riunendo il contenuto delle varie finestre in
un singolo frame.un singolo frame.
Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy
Nanodesktop tecnology
2121
La chiamataLa chiamata
XWindowRender (WndHandle)XWindowRender (WndHandle)
avvia il rendering nella finestra con handle WinHandle.avvia il rendering nella finestra con handle WinHandle.
Il compito di XWindowRender() è quello di eseguire il mergingIl compito di XWindowRender() è quello di eseguire il merging
dei contenuti, relativi ad una sola finestra, dei seguenti spazi: dei contenuti, relativi ad una sola finestra, dei seguenti spazi:
- char mapchar map
- color char mapcolor char map
- window spacewindow space
- service spaceservice space
- winsprite spacewinsprite space
Alla fine, viene ottenuto l’aggiornamento della pagina logica Alla fine, viene ottenuto l’aggiornamento della pagina logica
assegnata alla finestra. E’ a questo punto che XWindowRender()assegnata alla finestra. E’ a questo punto che XWindowRender()
richiama internamente WindowsRender() e tutto il frame vienerichiama internamente WindowsRender() e tutto il frame viene
renderizzato sullo schermo.renderizzato sullo schermo.
Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy
Nanodesktop tecnology
2222
Questo schema spiega meglio l’attività di XWindowRender().Questo schema spiega meglio l’attività di XWindowRender().
Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy
Nanodesktop tecnology
XWindowRender
WindowsRender
2323
Problema: che cosa accade se siamo in una applicazioneProblema: che cosa accade se siamo in una applicazione
multithreading ?multithreading ?
Come possiamo rendere il sistema grafico di NanodesktopCome possiamo rendere il sistema grafico di Nanodesktop
thread-safe ?thread-safe ?
La risposta è La risposta è Phoenix Graphic Subsystem.Phoenix Graphic Subsystem.
Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy
Nanodesktop tecnology
2424
Supponiamo che due thread eseguano XWindowRender() Supponiamo che due thread eseguano XWindowRender()
contemporaneamente o, meglio, che il thread 1 inizi uncontemporaneamente o, meglio, che il thread 1 inizi un
XWindowRender mentre il thread 2 non ha ancora terminatoXWindowRender mentre il thread 2 non ha ancora terminato
la sua chiamata alla medesima routine. la sua chiamata alla medesima routine.
Poichè XWindowRender e WindowsRender usano un unicoPoichè XWindowRender e WindowsRender usano un unico
set di variabili ed un unico acceleratore grafico, il tentativo diset di variabili ed un unico acceleratore grafico, il tentativo di
eseguire le 2 operazioni di rendering senza un meccanismoeseguire le 2 operazioni di rendering senza un meccanismo
di accodamento porterebbe ad un crash del sistema.di accodamento porterebbe ad un crash del sistema.
Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy
Nanodesktop tecnology
2525
Potreste pensare allora ad un Potreste pensare allora ad un mutex (semaforo) mutex (semaforo) che risolva ilche risolva il
problema:problema:
il thread 1 viene sospeso, finchè il thread 2 non ha terminatoil thread 1 viene sospeso, finchè il thread 2 non ha terminato
la sua richiesta di rendering. la sua richiesta di rendering.
Questo approccio è detto di tipo Questo approccio è detto di tipo bloccante bloccante (blocking).(blocking).
Il problema è che porta a delle perdite di prestazioni: in alcuniIl problema è che porta a delle perdite di prestazioni: in alcuni
casi, potrebbe essere conveniente che sia il thread 1 che ilcasi, potrebbe essere conveniente che sia il thread 1 che il
thread 2 possano eseguire l’aggiornamento dello schermothread 2 possano eseguire l’aggiornamento dello schermo
nell’ambito della nell’ambito della stessastessa chiamata al renderer di primo livello. chiamata al renderer di primo livello.
Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy
Nanodesktop tecnology
2626
Il sistema di rendering Phoenix di Nanodesktop risolve ilIl sistema di rendering Phoenix di Nanodesktop risolve il
problema in modo elegante.problema in modo elegante.
La routine WindowsRender() viene divisa in 2 parti:La routine WindowsRender() viene divisa in 2 parti:
- un componente client;un componente client;
- un componente server;un componente server;
All’avvio, Nanodesktop fa partire un thread ad alta prioritàAll’avvio, Nanodesktop fa partire un thread ad alta priorità
((PhoenixGraph threadPhoenixGraph thread) che esegue un ciclo continuo, ponendosi) che esegue un ciclo continuo, ponendosi
in attesa di richieste di rendering da parte dei thread deiin attesa di richieste di rendering da parte dei thread dei
programmi applicativi. programmi applicativi.
La componente server di XWindowRender sarà fisicamente La componente server di XWindowRender sarà fisicamente
eseguita eseguita solosolo da questo thread di sistema. da questo thread di sistema.
Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy
Nanodesktop tecnology
2727
I thread applicativi si limitano ad eseguire la componente clientI thread applicativi si limitano ad eseguire la componente client
di WindowsRender(). Quando un thread esegue tale routine,di WindowsRender(). Quando un thread esegue tale routine,
viene posto in attesa ed il controllo viene passato ai threadviene posto in attesa ed il controllo viene passato ai thread
successivi. successivi.
Anche questi potrebbero eseguire dei WindowsRender()Anche questi potrebbero eseguire dei WindowsRender()
mettendosi in stato di attesa. mettendosi in stato di attesa.
Ad un certo istante t, ci saranno n thread in attesa che hannoAd un certo istante t, ci saranno n thread in attesa che hanno
registrato la propria richiesta di rendering in un appositoregistrato la propria richiesta di rendering in un apposito
registro interno di nd, ed il controllo passerà al registro interno di nd, ed il controllo passerà al PhoenixPhoenix
Graph Thread. Graph Thread.
Quest’ultimo leggerà i registri di richiesta rendering, e Quest’ultimo leggerà i registri di richiesta rendering, e
soddisferà le richieste soddisferà le richieste in un’unica istanza. in un’unica istanza. Alla fine, i threadAlla fine, i thread
clienti vengono riattivati uno alla voltaclienti vengono riattivati uno alla volta
Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy
Nanodesktop tecnology
2828
Questo schema mostra quanto detto:Questo schema mostra quanto detto:
Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy
Nanodesktop tecnology
2929
Grazie al Phoenix Graph Thread ed all’accelerazione NanoTile,Grazie al Phoenix Graph Thread ed all’accelerazione NanoTile,
possiamo eseguire un’applicazione in cui viene visualizzatopossiamo eseguire un’applicazione in cui viene visualizzato
un filmato in una finestra mentre in un’altra viene scaricato unun filmato in una finestra mentre in un’altra viene scaricato un
file. Tutto ciò senza blocchi o conflitti.file. Tutto ciò senza blocchi o conflitti.
Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy
Nanodesktop tecnology
3030
Passiamo ora ad un altro problema: Passiamo ora ad un altro problema:
la gestione degli eventila gestione degli eventi
Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy
Nanodesktop tecnology
3131
Tutti i desktop manager hanno bisogno di un sistema di gestioneTutti i desktop manager hanno bisogno di un sistema di gestione
degli eventi. Questo deve essere programmabile dallo sviluppatoredegli eventi. Questo deve essere programmabile dallo sviluppatore
finale.finale.
Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy
Nanodesktop tecnology
Cosa accade se eseguiamo un doppio click su una icona ?Cosa accade se eseguiamo un doppio click su una icona ?
3232Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy
Nanodesktop tecnology
Cosa accade se selezioniamo una voce del menu ?Cosa accade se selezioniamo una voce del menu ?
3333
Il sistema di gestione degli eventi di Nanodesktop è basato suIl sistema di gestione degli eventi di Nanodesktop è basato su
delle delle callback. callback.
Una callback è una routine che viene eseguita quando vieneUna callback è una routine che viene eseguita quando viene
attivato un certo elemento grafico sullo schermo (pulsante,attivato un certo elemento grafico sullo schermo (pulsante,
textbox, icona sul desktop, voce del menu ecc. ecc. ecc.)textbox, icona sul desktop, voce del menu ecc. ecc. ecc.)
Le callback sono programmabili: è lo sviluppatore che stabilisceLe callback sono programmabili: è lo sviluppatore che stabilisce
cosa deve accadere quando un certo elemento grafico vienecosa deve accadere quando un certo elemento grafico viene
attivato.attivato.
Quando si decide che un evento grafico sia gestito tramiteQuando si decide che un evento grafico sia gestito tramite
callback, si dice che esso è callback, si dice che esso è interno interno o “o “callback based”.callback based”.
Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy
Nanodesktop tecnology
3434
Il cuore del sistema di gestione degli eventi di Nanodesktop siIl cuore del sistema di gestione degli eventi di Nanodesktop si
basa su una routine, chiamata basa su una routine, chiamata MouseControl(). MouseControl().
Quando un thread incontra questa routine, viene posto in statoQuando un thread incontra questa routine, viene posto in stato
di sospensione, il puntatore del mouse appare sullo schermo, e di sospensione, il puntatore del mouse appare sullo schermo, e
Nanodesktop è pronto ad eseguire qualsiasi callback siaNanodesktop è pronto ad eseguire qualsiasi callback sia
associata ad elementi che siano selezionati dall’utente nelassociata ad elementi che siano selezionati dall’utente nel
sistema grafico corrente. sistema grafico corrente.
Il thread chiamante ripartirà solo in presenza di particolariIl thread chiamante ripartirà solo in presenza di particolari
eventi (detti eventi (detti eventi esternieventi esterni) che non possono essere gestiti) che non possono essere gestiti
internamente da nd oppure a livello di callback. internamente da nd oppure a livello di callback.
Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy
Nanodesktop tecnology
3535
In caso di evento esterno, è il thread che ha chiamato In caso di evento esterno, è il thread che ha chiamato
MouseControl() MouseControl() che deve gestire la situazione. A tale scopo,che deve gestire la situazione. A tale scopo,
esso riceve un messaggio (una particolare sequenza di codiciesso riceve un messaggio (una particolare sequenza di codici
che viene memorizzata in una che viene memorizzata in una struct ndEvent_Typestruct ndEvent_Type),),
e può prendere le decisioni che meglio ritiene opportune. e può prendere le decisioni che meglio ritiene opportune.
Questo meccanismo di programmazione è un pò particolare,Questo meccanismo di programmazione è un pò particolare,
ma si consideri che da almeno un anno nd fornisce routine,ma si consideri che da almeno un anno nd fornisce routine,
come come ndProvideMeTheMouse_Until(), ndProvideMeTheMouse_Until(), che richiamanoche richiamano
internamente internamente MouseControl() MouseControl() ma permettendo di usarema permettendo di usare
il sistema degli eventi in modo molto più semplice.il sistema degli eventi in modo molto più semplice.
Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy
Nanodesktop tecnology
3636
A questo meccanismo si affianca il A questo meccanismo si affianca il Phoenix Mouse Thread. Phoenix Mouse Thread.
Questo thread viene lanciato automaticamente da nd quando Questo thread viene lanciato automaticamente da nd quando
viene fatto apparire sullo schermo il puntatore del mouse.viene fatto apparire sullo schermo il puntatore del mouse.
E’ questo thread che provvede a leggere lo stato dei registri delE’ questo thread che provvede a leggere lo stato dei registri del
pad della PSP ogni t millisecondi, aggiornando la posizionepad della PSP ogni t millisecondi, aggiornando la posizione
del puntatore del mouse.del puntatore del mouse.
Il PMT provvede anche a richiedere a WindowsRender() loIl PMT provvede anche a richiedere a WindowsRender() lo
spostamento/ridimensionamento delle finestre, ed ad eseguirespostamento/ridimensionamento delle finestre, ed ad eseguire
le callback legate agli eventi del sistema grafico.le callback legate agli eventi del sistema grafico.
Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy
Nanodesktop tecnology
3737
Questo schema ci mostra come funziona il sistema degli eventi di nd Questo schema ci mostra come funziona il sistema degli eventi di nd
Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy
Nanodesktop tecnology
3838
Ogni volta che deve essere eseguita una callback, NanodesktopOgni volta che deve essere eseguita una callback, Nanodesktop
può gestire la situazione in 2 modi. può gestire la situazione in 2 modi.
a) Può eseguire il codice della callback nell’ambito del a) Può eseguire il codice della callback nell’ambito del PhoenixPhoenix
Mouse Thread. Mouse Thread. E’ la soluzione che di solito si adotta per piccoleE’ la soluzione che di solito si adotta per piccole
routineroutine
b) Può lanciare un thread apposito, chiamato CBE (Callbackb) Può lanciare un thread apposito, chiamato CBE (Callback
executor thread) che dovrà eseguire la callback autonomamente.executor thread) che dovrà eseguire la callback autonomamente.
Viene usato per routine complesse, che a loro volta dovrannoViene usato per routine complesse, che a loro volta dovranno
creare altre finestre e porsi in attesa di altri eventi da partecreare altre finestre e porsi in attesa di altri eventi da parte
del sistema grafico. Al termine dell’esecuzione della callback, ildel sistema grafico. Al termine dell’esecuzione della callback, il
CBE thread viene terminato e cancellato.CBE thread viene terminato e cancellato.
Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy
Nanodesktop tecnology
3939
Si noti che in condizioni ideali, noi avremo nel sistema Si noti che in condizioni ideali, noi avremo nel sistema
n callback, ciascuna con un certo compito e con certe finestre,n callback, ciascuna con un certo compito e con certe finestre,
ognuna delle quali gira in un suo thread CBE (potremmo dire...ognuna delle quali gira in un suo thread CBE (potremmo dire...
in un proprio in un proprio contestocontesto) ed ognuna delle quali accede al sistema) ed ognuna delle quali accede al sistema
grafico in modo indipendente. grafico in modo indipendente.
Ciò non è un problema, perchè abbiamo visto che il sistemaCiò non è un problema, perchè abbiamo visto che il sistema
grafico di nd può gestire senza problemi l’accesso concorrentegrafico di nd può gestire senza problemi l’accesso concorrente
di più thread al sistema grafico.di più thread al sistema grafico.
Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy
Nanodesktop tecnology
4040
Poniamoci ora una domanda: questa architettura potrebbe Poniamoci ora una domanda: questa architettura potrebbe
essere usata in futuro per creare un piccolo sistema operativoessere usata in futuro per creare un piccolo sistema operativo
con interfaccia grafica e multiprocesso ?con interfaccia grafica e multiprocesso ?
La risposta è no. O, almeno, non del tutto.La risposta è no. O, almeno, non del tutto.
Infatti, Nanodesktop deve sottostare ad una pesante limitazioneInfatti, Nanodesktop deve sottostare ad una pesante limitazione
del sistema operativo della PSP. del sistema operativo della PSP.
Lo scheduler del PSP-OS fornisce un multitasking di tipoLo scheduler del PSP-OS fornisce un multitasking di tipo
preemptive, preemptive, ma l’assenza della MMU nel processore MIPSma l’assenza della MMU nel processore MIPS
della PSP implica l’impossibilità di ottenere i requisiti della PSP implica l’impossibilità di ottenere i requisiti
di di isolamento isolamento e e protezione protezione tipici degli os multiprocesso. tipici degli os multiprocesso.
Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy
Nanodesktop tecnology
4141
In altre parole, quando un processo cerca di scrivere al di fuoriIn altre parole, quando un processo cerca di scrivere al di fuori
del proprio spazio di indirizzamento, il microprocessore nondel proprio spazio di indirizzamento, il microprocessore non
solleva un’eccezione (a differenza di quanto accade con i solleva un’eccezione (a differenza di quanto accade con i
processori Intel o Motorola). processori Intel o Motorola).
E’ anche a causa di questa caratteristica che sulla PSP nonE’ anche a causa di questa caratteristica che sulla PSP non
sono state portate le normali distribuzioni Linux. sono state portate le normali distribuzioni Linux.
L’unica che finora è stata portata (ma attualmente non esegueL’unica che finora è stata portata (ma attualmente non esegue
programmi diversi da quelli eseguibili da CLI) è uCLinuxprogrammi diversi da quelli eseguibili da CLI) è uCLinux
(http://www.uclinux.org/)(http://www.uclinux.org/)
uCLinux è una distribuzione Linux dedicata specificamente aiuCLinux è una distribuzione Linux dedicata specificamente ai
dispositivi senza MMU. Non supporta X, nè Gnome, nè KDE.dispositivi senza MMU. Non supporta X, nè Gnome, nè KDE.
Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy
Nanodesktop tecnology
4242
La compatibilità POSIXLa compatibilità POSIX
Dal corso di Sistemi operativi sappiamo che lo standard POSIXDal corso di Sistemi operativi sappiamo che lo standard POSIX
(Portable Operating System Interface) è un insieme di specifiche(Portable Operating System Interface) è un insieme di specifiche
emanate dall’instituto IEEE per definire in che modo devonoemanate dall’instituto IEEE per definire in che modo devono
comportarsi alcuni sistemi operativi (in particolare, i sistemicomportarsi alcuni sistemi operativi (in particolare, i sistemi
operativi della famiglia Unix). operativi della famiglia Unix).
Lo standard stabilisce alcune specifiche riguardo al tipo diLo standard stabilisce alcune specifiche riguardo al tipo di
interfaccia con gli applicativi, al sistema di gestione dei interfaccia con gli applicativi, al sistema di gestione dei
thread, dei segnali, e dei semafori, nonchè alla strutturathread, dei segnali, e dei semafori, nonchè alla struttura
del file system e delle pipe.del file system e delle pipe.
Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy
Nanodesktop tecnology
4343
Avere un buon layer di compatibilità POSIX è essenziale perchèAvere un buon layer di compatibilità POSIX è essenziale perchè
molti software del mondo x86 fanno uso di funzionalità chemolti software del mondo x86 fanno uso di funzionalità che
sono definite proprio dallo standard. sono definite proprio dallo standard.
Per esempio, quando un’applicazione del mondo Unix/LinuxPer esempio, quando un’applicazione del mondo Unix/Linux
vuole create un thread, usa la funzionevuole create un thread, usa la funzione
int pthread_createint pthread_create (pthread_t *(pthread_t *threadthread, const pthread_attr_t *, const pthread_attr_t *attrattr, ,
void *(*void *(*start_routinestart_routine)(void*), void *)(void*), void *argarg); );
e per distruggerlo usa:e per distruggerlo usa:
int pthread_cancel(pthread_t thread);int pthread_cancel(pthread_t thread);
Se queste funzioni non sono presenti, l’applicazione non è portabile.Se queste funzioni non sono presenti, l’applicazione non è portabile.
Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy
Nanodesktop tecnology
4444
Il PSPSDK fornisce una API per la gestione di thread e Il PSPSDK fornisce una API per la gestione di thread e
semafori. Ma è molto diversa da quella prevista dallosemafori. Ma è molto diversa da quella prevista dallo
standard POSIX. Per esempio, per creare un thread:standard POSIX. Per esempio, per creare un thread:
SceUIDSceUID sceKernelCreateThreadsceKernelCreateThread (const char *name, SceKernelThreadEntry entry, (const char *name, SceKernelThreadEntry entry,
int initPriority, int stackSize, int initPriority, int stackSize,
SceUInt attr, SceUInt attr,
SceKernelThreadOptParam *option)SceKernelThreadOptParam *option)
Mentre perMentre per terminare e distruggere un thread: terminare e distruggere un thread:
sceKernelTerminateDeleteThread (SceUID thid)sceKernelTerminateDeleteThread (SceUID thid)
E’ chiaro che era necessario intervenire per garantire laE’ chiaro che era necessario intervenire per garantire la
compatibilità POSIXcompatibilità POSIX
Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy
Nanodesktop tecnology
4545
Sotto Nanodesktop, il problema è stato risolto tramite il porting diSotto Nanodesktop, il problema è stato risolto tramite il porting di
una libreria, chiamata EmbPThread. una libreria, chiamata EmbPThread.
(http://sourceforge.net/projects/pthreads-emb/)(http://sourceforge.net/projects/pthreads-emb/)
Questa libreria si comporta come un layer di traduzione eQuesta libreria si comporta come un layer di traduzione e
fornisce alle applicazioni nd quasi tutte le funzioni relativefornisce alle applicazioni nd quasi tutte le funzioni relative
alle funzionalità previste dallo standard POSIX thread.alle funzionalità previste dallo standard POSIX thread.
In questo modo diventa possibile eseguire sulla PSPIn questo modo diventa possibile eseguire sulla PSP
normali applicazioni per x86 che richiedono un certonormali applicazioni per x86 che richiedono un certo
grado di compatibilità POSIXgrado di compatibilità POSIX
Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy
Nanodesktop tecnology
4646
Parallelizzazione dei calcoli attraverso la VFPUParallelizzazione dei calcoli attraverso la VFPU
Infine, volevo soffermarmi un attimo sulla tecnologia di Infine, volevo soffermarmi un attimo sulla tecnologia di
parallelizzazione dei calcoli che viene usata da Nanodesktop. parallelizzazione dei calcoli che viene usata da Nanodesktop.
Come detto nel nostro precedente incontro, la parallelizzazioneCome detto nel nostro precedente incontro, la parallelizzazione
dei calcoli ha consentito di eseguire algoritmi di visionedei calcoli ha consentito di eseguire algoritmi di visione
artificiale estremamente sofisticati su un dispositivoartificiale estremamente sofisticati su un dispositivo
portatile come la PSP. portatile come la PSP.
Alla base di questo risultato c’è la VFPU, il componente Alla base di questo risultato c’è la VFPU, il componente
hardware integrato nel processore della PSP, e capace dihardware integrato nel processore della PSP, e capace di
performance superiori a 2 Gflops/sec. performance superiori a 2 Gflops/sec.
Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy
Nanodesktop tecnology
4747
La VFPU fornisce 128 registri in virgola mobile a 32 bit. La VFPU fornisce 128 registri in virgola mobile a 32 bit.
I registri sono divisi in 8 matrici da 4x4 registri.I registri sono divisi in 8 matrici da 4x4 registri.
La VFPU, inoltre, possiede istruzioni che consentono di eseguireLa VFPU, inoltre, possiede istruzioni che consentono di eseguire
la somma, la differenza, la moltiplicazione scalare di duela somma, la differenza, la moltiplicazione scalare di due
matrici di 4x4 elementi con pochi cicli di clock.matrici di 4x4 elementi con pochi cicli di clock.
Ora, supponete di avere una singola istruzione che sommi Ora, supponete di avere una singola istruzione che sommi
due matrici 4x4 elementidue matrici 4x4 elementi
Appare evidente che potete agire su 16 elementi alla volta! (SIMD)Appare evidente che potete agire su 16 elementi alla volta! (SIMD)
Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy
Nanodesktop tecnology
1 5 0 4
0 3 1 4
5 3 4 3
2 1 5 0
2 2 3 1
0 3 1 10
1 1 1 1
3 -1 5 0
3 7 3 5
0 6 2 14
6 4 5 4
5 0 10 0
4848
Normalmente la VFPU della PSP dovrebbe essere programmataNormalmente la VFPU della PSP dovrebbe essere programmata
direttamente in linguaggio assembler. direttamente in linguaggio assembler.
Tuttavia, Nanodesktop integra un componente che consente diTuttavia, Nanodesktop integra un componente che consente di
eseguire le operazioni richieste direttamente dal linguaggio C:eseguire le operazioni richieste direttamente dal linguaggio C:
si chiama EMI (Enhanced Mathematical Interface).si chiama EMI (Enhanced Mathematical Interface).
Sotto PSPE la VFPU non è emulata, quindi viene usato unSotto PSPE la VFPU non è emulata, quindi viene usato un
altro componente, chiamato EMIEMU che provvede adaltro componente, chiamato EMIEMU che provvede ad
emulare via software le operazioni necessarie.emulare via software le operazioni necessarie.
La cosa non è comunque un problema, perchè lo sviluppatore puòLa cosa non è comunque un problema, perchè lo sviluppatore può
usare un wrapper chiamato ndHAL_XFPU che richiama la funzioneusare un wrapper chiamato ndHAL_XFPU che richiama la funzione
giusta sia sotto PSPE che sotto PSPgiusta sia sotto PSPE che sotto PSP
Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy
Nanodesktop tecnology
4949
Nel programma che ora vi mostrerò, noi eseguiamo laNel programma che ora vi mostrerò, noi eseguiamo la
formulaformula
x^2 + 1x^2 + 1
per x che va da 0 a 15per x che va da 0 a 15
Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy
Nanodesktop tecnology
5050
Il programma è questo:Il programma è questo:#include <nanodesktop.h>#include <nanodesktop.h>
#define MATRIX0 0#define MATRIX0 0
#define MATRIX1 1#define MATRIX1 1
#define MATRIX2 2#define MATRIX2 2
int ndMain()int ndMain()
{{
float FloatBufferA [16], FloatBufferB [16], FloatBufferRes [16];float FloatBufferA [16], FloatBufferB [16], FloatBufferRes [16];
int Counter;int Counter;
ndInitSystem ();ndInitSystem ();
for (Counter=0; Counter<16; Counter++) FloatBufferA [Counter] = Counter;for (Counter=0; Counter<16; Counter++) FloatBufferA [Counter] = Counter;
for (Counter=0; Counter<16; Counter++) FloatBufferB [Counter] = 1;for (Counter=0; Counter<16; Counter++) FloatBufferB [Counter] = 1;
ndHAL_XFPU_Load16FloatsToMatrix (MATRIX0, &FloatBufferA);ndHAL_XFPU_Load16FloatsToMatrix (MATRIX0, &FloatBufferA);
ndHAL_XFPU_Load16FloatsToMatrix (MATRIX1, &FloatBufferB);ndHAL_XFPU_Load16FloatsToMatrix (MATRIX1, &FloatBufferB);
ndHAL_XFPU_MatrixTrvMul (MATRIX0, MATRIX0, MATRIX0);ndHAL_XFPU_MatrixTrvMul (MATRIX0, MATRIX0, MATRIX0);
ndHAL_XFPU_MatrixSum (MATRIX0, MATRIX1, MATRIX2);ndHAL_XFPU_MatrixSum (MATRIX0, MATRIX1, MATRIX2);
ndHAL_XFPU_Store16FloatsFromMatrix (MATRIX2, &FloatBufferRes);ndHAL_XFPU_Store16FloatsFromMatrix (MATRIX2, &FloatBufferRes);
for (Counter=0; Counter<16; Counter++) printf ("sqr(%d) + 1 = %f \n", Counter, FloatBufferRes [Counter]);for (Counter=0; Counter<16; Counter++) printf ("sqr(%d) + 1 = %f \n", Counter, FloatBufferRes [Counter]);
ndHAL_WaitKey (0);ndHAL_WaitKey (0);
}}
Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy
Nanodesktop tecnology
5151
Vediamo il risultato:Vediamo il risultato:
Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy
Nanodesktop tecnology
Funziona! E si può anche verificare che sulla vera PSP è molto veloceFunziona! E si può anche verificare che sulla vera PSP è molto veloce
5252
La programmazione tramite ndHAL_XFPU è unLa programmazione tramite ndHAL_XFPU è un
argomento molto complesso. argomento molto complesso.
Per ora vi rimando al capitolo 28 dellaPer ora vi rimando al capitolo 28 della
Nanodesktop User GuideNanodesktop User Guide
Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy
Nanodesktop tecnology
5353
GRAZIEGRAZIE
Visilab – Computer Vision and Image Processing LabUniversity of Messina - Italy
Nanodesktop tecnology