Corso su ARM: BOOTLOADER e OpenSDA @work

codewarrior

La scorsa settimana abbiamo iniziato la nostra lunga avventura nel fantastico mondo della programmazione della FRDM-KL46Z grazie all'utilizzo di programmi quali CodeWarrior e Processor Expert. Oggi cerchiamo di andare ancora più nel dettaglio per spiegare alcuni passaggi della scorsa puntata e analizzare ancora meglio il funzionamento. Oggi approfondiamo Bootloader ed OpenSDA. Siete pronti?

Lo scopo dell'altra volta era quello di darvi una visione chiara di come potesse essere semplice realizzare un'applicazione basilare con poco sforzo. Ora che ci siamo riusciti però è il caso di approcciarci in maniera più critica e cercare di capire come è stato possibile e soprattutto perché.
Alla fine di questa puntata vi daremo anche un utile suggerimento, una dritta, se volete, nel caso doveste avere problemi.

Inizializzare la scheda

Per poterla utilizzare l'unica cosa che serve davvero è un cavo USB da connettere al computer. Non appena la connessione sarà stata effettuata, la scheda comparirà tra i dispositivi USB sul sistema operativo. Non ho fatto una prova su Linux, in effetti, ma su Windows ha funzionato al primo colpo. In ogni caso, per poterla utilizzare al meglio, è indispensabile che la scheda abbia al suo interno i driver OpenSDA.
Per ottenere questo risultato la procedura è molto semplice:
  • localizzare la porta USB OpenSDA (guardando la scheda con lo slide verso il basso, e quella sulla sinistra);
  • tenere premuto il pulsante di reset (in mezzo alle due porte USB);
  • collegare la scheda;
  • rilasciare il pulsante.
Quando la scheda sarà stata rilevata, troverete tra le periferiche del computer la voce "Bootloader", esattamente come vi abbiamo fatto vedere la scorsa volta. A questo punto dovrete fare quello che vi abbiamo fatto vedere, cioè copiare il file corretto all'interno della scheda per poi premere nuovamente il pulsante di reset oppure scollegarla per collegarla nuovamente.
Tutto abbastanza semplice, in effetti, ma indispensabile perché altrimenti non sarebbe possibile utilizzare questi driver ma soprattutto programmare la scheda.

La demo

Altra cosa di cui non abbiamo parlato la scorsa volta è il programma demo, precaricato all'interno della scheda, che serve per mostrare da subito all'utente appena "arrivato" tutte le potenzialità di questa straordinaria piattaforma di sviluppo.
Ci sono una serie di mini programmi di dimostrazione che servono a rendere subito operativi tutti i sensori disponibili a bordo, naturalmente non contemporaneamente. Per visualizzarle tutte viene utilizzato il pulsante SW1 come switch tra un programma ed il successivo.
Il primo programma dimostrativo serve semplicemente per visualizzare sul display un conteggio per cui tutte le cifre del display vengono incrementate contemporaneamente di uno e poi la routine ricomincia.
Premendo il pulsante si accede alla prima simulazione che interagisce con sensore che dimostra il funzionamento dello slide/touch. Sul display vedrete, quindi, un'indicazione percentuale della posizione e scorrendo il dito, la vedrete variare. Notate la sensibilità…!
La successiva simulazione mette al lavoro il magnetometro per cui ruotando la scheda verrà indicato un valore in gradi di distanza dal Nord. Vi accorgerete, probabilmente, immediatamente che appena partita questa simulazione non mostra direttamente numeri ma la prima cifra è una "C": quella che state vedendo è la fase di calibrazione ed è necessario, solo in questo momento, muovere la scheda per qualche secondo fin a quando la fase non termina.
Se premete, a questo punto, il pulsante verrà eseguita una routine che indica il livello di luminosità all'interno della stanza, sfruttando proprio il sensore a bordo.

CodeWarrior applicato

La volta scorsa abbiamo visto come iniziare a lavorare con questo incredibile programma, come sia estremamente facile realizzare un'applicazione in brevissimo tempo. Si tratta di un'IDE basata su Eclipse per cui se ne avete familiarità, probabilmente nulla potrà disorientarvi. Se siete riusciti, inoltre, a muovervi con disinvoltura la scorsa volta non avrete alcuni tipo di difficoltà.
È importante notare che se volete lavorare con le applicazioni demo precompilate che si trovano all'interno dei pacchetti di cui vi abbiamo dato indicazione, esse sono disponibile in un formato decisamente "atipico": *.srec.
Alcuni degli esempi disponibili nella documentazione contengono nel nome la parola "tower"; se avete familiarità con i sistemi Freescale probabilmente saprete che si tratta di un sistema modulare piuttosto complesso, espandibile e di grandi potenzialità. Supporta diversi sensori, display LCD, un numero impressionante di schede basate sui processori più disparati.
Vi consigliamo, se mai dovesse averne la possibilità, di provare questi sistemi in maniera tale da scoprire una piattaforma di sviluppo affascinante e completa.
Vi diciamo questo perché alcuni di questi esempi qui non funzionano per cui essa non farebbe nulla se li utilizzaste.
Tutto questo anche perché tra gli esempi precompilati quello di cui abbiamo parlato in precedenza non c'è.
A questo punto non resta che provare a costruirlo, visto che dalla scorsa settimana la scheda non è stata programmata nuovamente.
Per tutti quelli che cominciano, approfondiamo l'inizio di questa esperienza di programmazione. Installate il programma nella cartella C:\Freescale oppure in C:\Program Files. In realtà non conta molto, quello che è davvero importante è dove saranno i codici che andrete a scrivere. Al primo avvio, infatti, l'ambiente vi dirà che è arrivato il momento di deciderlo. La cartella prescelta sarà del tipo
C:\root\projects\workspace
ma naturalmente starà a voi determinare quale vi interessa.
Il codice di esempio che vi sarete procurati verrà importato all'interno di una cartella che, per comodità, potrebbe avere il nome di FRDMKL46_Demo ma questa azione non popola direttamente il codice sorgente all'interno dello stesso workspace perché ci si aspetta che i file si trovino anche in altre cartelle.
Le impostazioni del progetto possono essere modificate ma il progetto utilizza una serie di file include per le impostazioni per cui questo è sconsigliabile.
Il prossimo problema è quello di generare i file in formato *.srec piuttosto che il più canonico *.elf.
Se non dovesse riuscire tramite l'IDE, questo stesso passaggio può essere eseguito da linea di comando:
cd “C:\root\projects\CW_space\FRDMKL46_Demo\FLASH”

"C:\Freescale\CW MCU v10.4\Cross_Tools\arm-none-eabi-gcc-4_7_3\arm-none-eabi\bin\objcopy.exe" -O srec FRDMKL46_Demo.elf FRDMKL46_Demo.srec
Il codice così ottenuto è funzionante.
Nell'archivio con tutti gli esempi precompilati di cui avevamo parlato, troverete "FRDMKL46_Demo_freedom.srec", un file all'interno del quale sono scritte tutte le istruzioni proprio del programma demo di cui abbiamo parlato.
Per poterlo utilizzare dovrete assicurarvi che in modalità Bootloader abbiate copiato il file MSD Flash Programmer, scollegato la scheda e che una volta collegata nuovamente, essa sia indicata con il suo nome completo.
A questo punto potete effettuare al suo interno la copia del file di cui stavamo parlando, scollegare la scheda e una volta alimentata nuovamente leggerete esattamente tutti i valori relativi alla simulazione di cui abbiamo parlato. 
 
Visto che ci siamo, ecco alcuni ulteriori dettagli sulle modalità operative.
In Bootloader mode, lo stato Idle, senza errori, prevede il lampeggio del LED di durata un secondo con pari periodi di ON ed OFF. Se c'è un errore in questa modalità, esso resta spento per due secondi per poi lampeggiare rapidamente otto volte.
Durante l'Application Mode, invece, se tutto sta funzionando normalmente il LED è acceso, fisso. Se c'è attività, per esempio trasferimento di dati, via USB, allora lampeggia. Se c'è un errore, invece, la modalità di segnalazione è esattamente la stessa di cui abbiamo parlato in precedenza.
Ulteriori dettagli potete trovarli qui, un riferimento utile per approfondire i dettagli dell'OpenSDA.
 
Un'ottima caratteristica delle schede della serie Freedom, ma ve lo avevamo già accennato negli articoli precedenti, è che contengono al loro interno (a bordo) il programmer (E DEBUGGER!) OpenSDA. Non sottovalutate assolutamente questo enorme vantaggio perché è possibile utilizzare questa funzionalità per programmare i microcontrollori sulle schede e di fare il debug! C'è da notare che, per alcune di queste, c'è un connettore dedicato ma non un cavo fornito nella confezione della scheda per il suo utilizzo. D'altronde, un cavo distribuito dal produttore avrebbe dei costi che probabilmente non sarebbe utile per l'azienda sostenere dal momento che potete realizzare il connettore voi stessi in maniera molto semplice. Ed è anche un bell'esercizio per fare pratica quindi non sottovalutatelo assolutamente.
Fate conto che sulla KL46Z c'è un jumper che va sotto il nome di J18 che servirà proprio a lavorare sulla programmazione. Si tratta dell'analogo J11 presente sulla KL25Z, altra scheda della stessa famiglia della quale probabilmente avrete già sentito parlare.

Che vuol dire utilizzare il debugger?

Dal momento che l'articolo sta cominciando a contare diversi argomenti cercherò di essere breve ma efficace. Utilizzeremo, come al solito, i commenti per ogni dubbio, domanda, perplessità o questione.
Diciamo che in linea di principio, come considerazioni di base, man mano che il software diventa più complicato, il numero di variabili aumenta, le istruzioni condizionali rendono il codice più lungo e complesso e la capacità che il sistema ha di permettere il debug lo differenzia da un hardware scarsamente interessante. Questo genere di problemi avviene frequentemente con Arduino che pertanto, dimostra tutte le sue carenze proprio quando volete che il vostro programma abbia "quel qualcosa in più". Oltre al fatto che con OpenSDA riuscirete certamente a fare debug di basso livello lavorando anche sul codice in maniera molto migliore. Le printf, i try-catch oppure le librerie, se siete più alto livello, sono degli esempi tipici.
OpenSDA vi permetterà di eseguire oppure mettere in pausa oppure di interrompere l'esecuzione del codice sul microcontrollore per osservare con grande attenzione qual è l'esatta linea di codice alla quale siete arrivati, eventualmente, il problema che si è verificato e così potrete isolare la singola problematica essendo molto precisi. E tutto questo è completamente integrato dentro CodeWarrior.
 
Il supporto di questa funzionalità rende questo ambiente di sviluppo assolutamente irrinunciabile e che proprio per questo motivo che ve lo abbiamo consigliato.
Ad essere completi, le schede Freedom (FRDM) hanno due microcontrollori dei quali uno è dedicato proprio all'OpenSDA. L'altro è quello che "conferisce" la lettera alla sigla, in questo caso, naturalmente, la "L" ed è quello che può essere utilizzato nell'esecuzione delle applicazioni.
Quando viene alimentata, come abbiamo visto, l'USB opera in maniera tale che la scheda sia un dispositivo di archiviazione di massa, o almeno sia al suo pari. Questo permette alla scheda di "somigliare" ad una chiavetta USB in maniera tale da rendere possibili i trasferimenti "drag & drop". Questo si può fare con degli esempi preconfezionati oppure con codice che avete generato voi e rappresenta la maniera davvero più semplice per programmare la scheda.
Se volete effettuare il debug della vostra applicazione, il microcontrollore di controllo deve essere riprogrammato, esattamente come vi avevamo mostrato in quella procedura grazie alla quale avrete accesso alla scheda riconosciuta con il nome di "BOOTLOADER".
Ci sono anche, all'interno del drive USB, dei file che possono essere utilizzati per scoprire ulteriori dettagli e studiare meglio la questione. Uno di questi è SDA_INFO.HTM. Esso vi indirizzerà direttamente alla pagina Internet dove potrete scaricare l'ultima versione del firmware OpenSDA. A tal proposito, infatti, trovate l'opzione "Firmware Apps".
Se avete problemi di driver, inoltre, qui potrete risolverli sia per Windows sia per Linux.
Quando estraete i file dall'archivio che avrete scaricato, vi accorgerete che esso contiene diversi elementi ma quelli di cui avrete davvero bisogno saranno DEBUG-APP_Pemicro_v108.SDA e MSD-FRDM-KL46Z48M_Pemicro_v112.SDA. Naturalmente è superfluo che vi faccia notare che i numeri potrebbero essere diversi a seconda della versione più aggiornata disponibile.
In ogni caso, come detto, potrete effettuare delle semplicissime operazioni di drag & drop per ottenere la riprogrammazione del microcontrollore di controllo. Disconnettete e riconnettete il cavo USB ed, all'interno dell'ambiente di sviluppo CodeWarrior, fate click su FRDMKL46_Demo tra i progetti che selezionate l'opzione Debug As->Debug Configurations. All'interno della finestra che apparirà, sulla sinistra, espandete l'opzione "CodeWarrior Attach" e selezionate gli elementi presenti all'interno.
Sulla destra c'è il Connection drop-down dove le frecce saranno elementi non attivi ma potrete selezionare l'opzione OpenSDA.
 
Vi consigliavamo di prendere confidenza con CodeWarrior e con le sue visualizzazioni specie per il fatto che in alto sulla destra troverete diverse possibilità tra cui Resources e Debug. Più che prospettive sono in realtà intere palette di strumenti selezionabili all'occorrenza per poter lavorare sul progetto.
Eseguite Run -> Debug per effettuare questa operazione e cominciare la sessione.
Nella prossima immagine, vi mostriamo, proprio sul codice della scorsa volta, un indispensabile strumento di debug: il breakpoint, per chi non lo sapesse, una interruzione forzata dell'esecuzione del flusso di programma.
Queste indicazioni potranno essere più o meno utili a seconda della fase in cui sarete ogni volta per ciascun progetto per cui se avete delle domande specifiche, o anche generali, potremo chiarire eventuali dubbi direttamente all'interno dei commenti. 

Una breve indicazione tecnica

Per tutti coloro che volessero conoscere al meglio il processore più nello specifico, sappiate che nella sua documentazione ufficiale, troverete certamente tutto quello che state cercando. Il suo nome è KL46P121M48SF4 e riconoscete la documentazione corretta dalla sua descrizione che dovrebbe essere qualcosa tipo "KL46 Sub-Family Data Sheet – Supports the following: MKL46Z128VLH4, MKL46Z256VLH4, MKL46Z256VMP4, MKL46Z128VLL4, MKL46Z256VLL4, MKL46Z128VMC4, MKL46Z256VMC4". Sappiate che si tratta di un riferimento da 1000 pagine per cui utilizzatelo solamente se avete davvero bisogno di informazioni che non avete trovato altrove.
Se questo, invece, dovesse diventare il VOSTRO processore, allora probabilmente questo riferimento dovrete semplicemente impararlo a menadito.

Un problema capitato ad altri

In giro per la rete ho trovato alcune segnalazioni particolarmente curiose in cui si indicano problemi di lettura della scheda.
Sebbene non faccia assolutamente parte dell'esperienza che abbiamo avuto io ed altri colleghi, potrebbe succedere anche a voi che con schede della famiglia Freedom abbiate dei piccoli problemi; utilizzando la modalità Bootloader o MSD, le schede potrebbero non rispondere oppure non comportarsi esattamente come vi aspettate, o come vi abbiamo descritto. In questo caso, fate attenzione: potrebbe essere colpa del vostro antivirus.
Dovete pensare che, in questa circostanza, lo dovete trattare come se stesse giocando a qualche videogioco: gli antivirus di solito in queste situazioni vanno esclusi oppure disabilitati per un certo periodo di tempo. Provate a fare questa operazione.
Sarebbe anche consigliabile tenerlo disabilitato durante le operazioni OpenSDA MSD, per esempio caricando nuovi file oppure utilizzando il bootloader.
Se per caso questi problemi dovessero continuare a manifestarsi, potreste seriamente pensare di utilizzare Windows in "modalità provvisoria".
Perché è possibile che succeda tutto questo?
Perché alcuni scanner antivirus effettuano il controllo su qualunque dispositivo connesso al sistema, il che naturalmente include tutti i Mass Storage Devices (MSD è naturalmente il suo acronimo).
Questo vale soprattutto se la funzione di Auto-play, per il sistema operativo è abilitata.
Vi consiglio, a tal proposito, di mantenerla sempre disabilitata dal momento che è uno dei modi migliori per entrare in contatto con tante, diverse infezioni informatiche.
Il motivo di tutto questo è: OpenSDA firmware/bootloader emulano il comportamento di un dispositivo MSD pur non essendolo. Il processore dell'OpenSDA agisce esattamente come un file system e potrebbe essere più facilmente riconosciuto come una attività "strana".
Insomma, se vi trovate in questa situazione fate così:
  • disabilitate gli antivirus;
  • disabilitate qualsiasi protezione "in tempo reale" (vale anche per il firewall);
  • non utilizzate alcun tipo di "file commander" o "shell extensions";
  • eseguite le istruzioni OpenSDA tramite shell.
Non si tratta di un caso frequente ma abbiamo pensato che fosse utile proporvelo perché così sapete già, eventualmente, come provare a porre rimedio. Se per caso dovesse avere dubbi su questo problema, sul resto dell'articolo oppure sulla scheda più in generale, vi ricordo che i commenti sono il luogo migliore dove esprimerli.
 
Voglio spendere molto brevemente ancora due parole su questa scheda: è davvero stupenda! Non soltanto per il rapporto qualità prezzo e le numerose possibilità che apre quando cominciate ad utilizzarla ma anche per la semplicità con la quale si propone all'utente.
E con questi suggerimenti e osservazioni vi salutiamo.
Alla prossima puntata.

 

                    

Per ulteriori informazioni potete scrivere a questa email: ggalletti@arroweurope.com

2 Comments

  1. MarciTy 1 dicembre 2013
  2. Giorgio B. 18 novembre 2013

Leave a Reply