Windows Embedded CE 6.0 : Cloning public component

Introduzione

L’installazione di Windows CE 6.0 R3 prevede la distribuzione dei codici sorgenti e dei file binari nelle tre seguenti sottocartelle della root di installazione (variabile d’ambiente _WINCEROOT, tipicamente C:\WINCE600) :

  • PRIVATE : codice sorgente del sistema operativo (Microsoft Shared Source);
  • PUBLIC : componenti hardware indipendent, ossia che non hanno alcun legame con il target device su cui l’immagine del sistema operativo sarà calata;
  • PLATFORM : tutte le BSP (Board Support Package) installate e quindi tutto ciò che è hardware dipendent (OAL, drivers, bootloader e file di configurazione per una specifica board);

Capita in molti casi di voler modificare uno o più componenti pubblici; ovviamente questa è un’operazione da non fare assolutamente per i seguenti principali motivi :

  • La Microsoft rilascia mensilmente i pacchetti di aggiornamento QFE (Quick Fix Engineering), che potrebbero sovrascrivere le vostre modifiche, qualora l’update interessasse proprio un componente pubblico da voi modificato;
  • Sviluppando progetti diversi per target device differenti, vorreste poter mantenere il componente pubblico originario per alcuni progetti e quello modificato per altri; l’unica soluzione sarebbe quella di creare più copie della cartella PUBLIC (es. PUBLIC_OSDesign1, PUBLIC_OSDesign2, …);
  • Ultima ma non meno importante motivazione è legata al fatto che modificando il contenuto della cartella PUBLIC, l’operazione di build dell’immagine può impiegare anche alcune ore;

La tecnica che viene utilizzata in questi casi, prevede la clonazione (cloning) del componente da voler modificare. Di seguito affronteremo le varie fasi di questa operazione, supponendo di voler modificare l’applicazione ping.exe (appunto un componente pubblico) per apportarvi delle modifiche.

In alcuni casi, questa attività può essere eseguita direttamente dall’ambiente di sviluppo cliccando con il tasto destro sul componente nella Catalog Items View e selezionando dal menù contestuale la voce “Clone Catalog Item”. Questa semplice funzionalità non è sempre disponibile e per questo motivo, esporrò quella la tecnica più lunga e complessa ma l’unica da poter adottare in tutti gli altri casi.

Prima di iniziare, sottolineo che nel mio ambiente ho clonato la BSP del device emulator (creando la cartella %_WINCEROOT%\PLATFORM\DEVICEEMULATOR_CLONE); questa è un’operazione che va sempre fatta nel momento in cui si inizia un progetto per un nuovo target device e si vuole adottare una certa BSP. In questo modo, potremmo modificare la BSP clonata senza alterare quella originale che potrà essere ulteriormente clonata per altri progetti. L’operazione di clonazione di una BSP è possibile utilizzando la seguente voce di menù Tools –> Platform Builder for CE 6.0 –> Clone BSP.

Copia dei codici sorgenti

Il primo passo prevede la copia del componente da clonare all’interno di una cartella della nostra BSP. Nella fattispecie, l’applicazione ping.exe si trova al seguente percorso :

%_WINCEROOT%\PUBLIC\COMMON\OAK\DRIVERS\NETSAMP\PING

Tipicamente, nell’eseguire il cloning, si preferisce separare la cartella contenente i codici sorgenti , attraverso la quale verrà generata una libreria statica (.lib), dalla cartella con le direttive per la compilazione dell’eseguibile (.exe) ottenuto linkando la libreria statica suddetta e tutte le altre eventuali librerie di cui necessita il componente clonato.

Nel nostro caso, suppongo di voler clonare il componente al seguente percorso :

%_WINCEROOT%\PLATFORM\DEVICEEMULATOR_CLONE\SRC\APPS

Creiamo in corrispondenza di esso, una sottocartella PING e due relative sottocartelle : src ed exe. All’interno della prima cartella, copiamo tutto il contenuto della cartella PING originale.

7673.cloning1_79A3DBF7

1106.cloning2_6F2307D7

Compilazione della libreria statica

A questo punto, è necessario modificare il file sources della nuova directory copiata (PING\src), aggiungendo la linea RELEASETYPE=PLATFORM oppure modificando il valore di RELEASETYPE a PLATFORM se essa già esiste. Questa opzione è necessaria per fare in modo che il componente compilato, venga poi copiato in una sottocartella della directory %_TARGETPLATROOT% che contiene i componenti eseguibili strettamente legati alla BSP. Nel nostro esempio abbiamo che %_TARGETPLATROOT% sarà C:\WINCE600\PLATFORM\DEVICEEMULATOR_CLONE e che la riga suddetta va aggiunta.

Inoltre va aggiunta l’impostazione WINCEOEM=1 che è necessaria ogni qual volta un componente utilizza dei file headers e delle librerie statiche che sono nella cartella PUBLIC. In questo modo, evitiamo errori sia in fase di compilazione che linking.

2045.cloning3_3316C622

Siamo pronti per eseguire il build per generare la libreria statica ping.lib. Affinché la nuova cartella creata sia visibile dal Solution Explorer in Visual Studio 2005, è necessario creare nella cartella PING un nuovo file dirs come riportato in figura.

8507.cloning4_1791C41F

0878.cloning5_0DE955E9

3817.cloning6_3306A055

NOTA : la presenza di (excluded from build) al fianco della cartella PING denota che tale cartella non è stata definita nella direttiva DIRS del file dirs della cartella apps; ciò vorrà dire che, per il momento, il componente sarà possibile compilarlo solo manualmente e non rientrerà nell’operazione di build complessivo dell’intera immagine.

L’operazione di build genera il file ping.lib all’interno di una sottocartella del percorso %_TARGETPLATROOT%\lib ed in particolare in C:\WINCE600\PLATFORM\DEVICEEMULATOR_CLONE\lib\ARMV4I\debug (dove ARMV4I indica la CPU target e debug indica la configurazione di build che sto adottando).

Utilizzo del tool Sysgen Capture

Poiché un componente pubblico può avere una serie di dipendenze da altri componenti, per evitare di dover riscrivere da zero il file sources, ci viene in aiuto il tool Sysgen Captureche esegue l’operazione per nostro conto (maggiori informazioni sono reperibili qui).

Avviamo una shell con tutte le variabili inizializzate dal menu Build –> Open Release Directory in Build Window e andiamo nella cartella %_WINCEROOT%\PLATFORM\DEVICEEMULATOR_CLONE\SRC\APPS\EXE dove ci aspettiamo di poter generare il file definitivo ping.exe. Avviamo il seguente comando :

sysgen_caputer ping

Al termine dell’operazione, troveremo una serie di file generati al percorso suddetto

7534.cloning7_4DA316A1

Compilazione del componente

Lasciando inalterati i file originali, facciamo una copia nella stessa cartella del filesources.ping, chiamandola sources ed apriamolo constatandone il seguente contenuto :

6724.cloning8_6F5EC965

Come possiamo osservare, il componente ha bisogno di alcune librerie statiche tra cui laping.lib. Quest’ultima, però, ha il percorso che punta alla libreria statica originale e non a quella precedentemente compilata da noi. E’ quindi necessario modificare tale percorso nel modo seguente :

5633.cloning9_7D6D9295

Personalmente, ho preferito non cancellare il riferimento originale ma l’ho incluso in un !if…!endif mai verificato (con condizione a 0). Infine, è necessario un makefile che possiamo prendere ad esempio dalla cartella APPS\PING\src. Tale operazione è lecita, in quanto la maggior parte dei makefile non fanno altro che includere il file makefile.def che troviamo in %_WINCEROOT%\PUBLIC\COMMON\OAK\MISC.

A questo punto possiamo buildare il componente per ottenere il file ping.exe al seguente percorso %_TARGETPLATROOT\target ed in particolare in C:\WINCE600\PLATFORM\DEVICEEMULATOR_CLONE\target\ARMV4I\debug.

Eseguendo esclusivamente l’operazione di Make Runtime Image, il nostro ping.exe verrà incluso nell’immagine del sistema operativo in luogo di quello originale. C’è da sottolineare che l’inclusione avviene in quanto dal Catalog Items ho selezionato il componente originale al seguente percorso Core OS –> Communication Services and Networking –> Networking – General –> Network Utilities con la differenza che il sistema di build ritroverà nella RelDir il nostro componente in luogo dell’originale.

Se non volessimo includere il catalog item suddetto, avremmo due possibili strade :

  • modificare il project.bib oppure il platform.bib per far includere il nostro ping.exenell’immagine;
  • creare un nuovo catalog item ed includerlo nell’immagine;

Per adesso, seguirò la prima strada e quindi deseleziono le Network Utilities dal Catalog Items (ovviamente perdendo le altre utilities tra cui il tracert) e modifico il platform.bib nel modo seguente :

6131.cloning10_221EAA0D

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s