domenica , 17 Novembre 2019
iten
Home » Elettronica » Configurare una toolchain GCC/Eclipse per STM32Nucleo - Parte III

Configurare una toolchain GCC/Eclipse per STM32Nucleo - Parte III

Facciamo un attimo un riepilogo delle puntate precedenti. Nella prima parte di questa mini-serie abbiamo configurato Eclipse e la suite di GCC come cross compiler per la piattaforma ARM Cortex. Abbiamo poi visto come adoperare i plug-in GNU ARM di Eclipse per usare la suite GCC e generare un progetto minimale (il classico blinking LED) in grado di girare sulla piattaforma STM32. Abbiamo poi adoperato CubeMX per generare la corretta configurazione per il micro della nostra Nucleo e quindi generato il binario che abbiamo caricato sul micro target con l'ST Link Utility. Nella seconda parte abbiamo affrontato l'argomento debugging, installando e configurando OpenOCD e GDB e configurando opportunamente Eclipse per poter eseguire il debugging della nostra Nucleo.

In questa parte approfondiremo ancora l'aspetto debugging. Installeremo un plug-in che ci permetterà di accedere ai registri del processore e di poterli sia ispezionare sia modificare. Vedremo poi come adoperare il semihosting ARM, che ci permette di poter stampare sulla console di OpenOCD dei messaggi provenienti dal micro target della nostra board nucleo.

Installare EmbSysRegView

Quando si fa il debugging di un microcontrollore, soprattutto quando stiamo lavorando con le periferiche integrate (UART, SPI, CAN, ecc), può tornare molto utile accedere ai registri hardware. Un micro come l'STM32F4 ha un numero elevatissimo di registri interni, che a loro volta possono avere molte differenti configurazioni. Ad esempio, un determinato PIN può avere più funzioni periferiche diverse associate, che vengono abilitate in base ad un setting specifico di alcuni registri. Soprattutto quando si lavora le prime volte con il micro, è quasi scontato che ci si scontrerà con problemi di setting e quindi l'accesso ai registri è molto utile per fare debugging. EMBedded SYStems REGister VIEW (nel seguito solo EmbSysRegView) è un ottimo plug-in per Eclipse che permette di accedere ai registri mappati in memoria (ossia accessibili nello spazio di indirizzamento della memoria del micro) di micro a 32 bit a core ARM Cortex, tra cui gli STM32.

Per installare il plug-in, procediamo come segue. Andiamo su Help->Eclipse Marketplace... e nella casella "Find" inserire il testo "embsysregview". Dopo un po' apparirà il plug-in. Clicchiamo su "Install".

2014-12-26 10_35_47-Eclipse Marketplace

Nella pagina successiva spuntiamo tutte le voci e clicchiamo su "Confirm".

2014-12-26 10_37_57-Eclipse Marketplace

Accettiamo la licenza e poi clicchiamo su "Finish". Dopo un po' Eclipse installerà il plug-in. Riavviate l'IDE.

Il passo successivo consiste nel configurare EmbSysRegView per il nostro specifico microcontrollore target (nel caso della Nucleo in mio possesso STM32F401RE). Procediamo in questo modo. Andiamo su Window->Preferences e poi in C/C->Debug->EmbSys Register View. Ci apparirà una finestra di configurazione che ci permette di selezionare il nostro micro.

2014-12-26 10_43_02-Preferences

Fatto questo, lanciamo il debugging del nostro programma test1 (realizzato nella prima parte). Nella vista di debug non ci apparirà ancora la console di EmbSysRegView. Per visualizzarla andiamo su Window->Show View->Other.... Ci apparirà una finestra di selezione, dove nella sezione Debug troveremo la voce EmbSys Registers.

2014-12-26 10_47_16-Show View

Ci apparirà in basso nell'area della console la nostra vista, come mostrato di seguito.

2014-12-26 10_48_11-

Il plug-in è molto intuitivo da usare, tuttavia vediamo un esempio pratico. Andiamo nel file BlinkLed.c del nostro programma di test e inseriamo un breakpoint alla riga 23, nella funzione blink_led_init(), la riga in cui la porta A viene configurata in modo che il pin 5 (collegata al LED LD2) sia configurato come output.

2014-12-26 11_32_28-

Mandiamo in esecuzione il nostro programma tramite la procedura di debug descritta nella seconda parte di questa serie. Quando l'esecuzione si bloccherà su quell'istruzione, apriamo la console di EmbSysRegView, scegliamo la voce GPIO->GPIOA. Per default, l'ispezione dei registri è disabilitata, ve ne rendete conto perché l'icona vicino al registro corrispondente ha tre pallini di colore grigio.

2014-12-26 11_35_53-

Cliccate su quell'icona due volte e i pallini diventeranno di colore verde e verrà mostrato lo stato dei registri.

2014-12-26 11_40_08-

Ora facciamo eseguire l'istruzione alla riga 23 cliccando sull'icona Step-Over (2014-12-26 11_42_26-Debug - test1_src_BlinkLed.c - Eclipse). EmbSysRegView vi mostrerà la variazione del registro MODER5.

2014-12-26 11_44_00-

 

Nel fare queste operazioni noterete una cosa fastidiosissima. Quando avanzate con le istruzioni, la console di output di OpenOCD prende il focus, nascondendo la console di EmbSysRegView. Per risolvere questa cosa, andate nella console di OpenOCD e cliccate con il tasto destro. Scegliete la voce "Preferences".

2014-12-26 11_51_45-Greenshot

Nella finestra successiva LEVATE la spunta alle voci "Show when program writes to standard out" e "Show when program writes to standard error".

Cliccando sul valore di un registro è possibile anche modificarlo. Ad esempio, se riportiamo il valore del registro MODER5 da 0x1 a 0x0 vedremo che il LED LD2 non lampeggerà più, in quando abbiamo configurato quel pin come input e non come output. L'operazione di modifica è possibile solo quando il debugging è in pausa.

Stampa di messaggi via ARM Semihosting

Durante la fase di sviluppo può essere molto utile stampare dei messaggi a video per capire lo stato del programma. A volte, è utile intercettare il valore di variabili e/o registri per capire se il nostro algoritmo sta funzionando correttamente. Arduino offre la possibilità di stampare sulla seriale virtuale di bordo alla scheda. Questa cosa è anche possibile con la Nucleo (lo vedremo prossimamente), ma tuttavia la tecnologia ARM-Cortex fornisce un meccanismo specifico per questa tipologia di operazioni: il semihosting.  L'ARM Semihosting consente di effettuare una sorta di remote procedure call, a partire dal micro target, che vengono realmente eseguite sul computer su cui sta girando il debugging. Ad esempio, nel caso della funzione printf() questa sarà lanciata dal micro di bordo della nostra Nucleo, ma tutta la parte "reale" di gestione del terminale, la stampa a video, ecc, è poi gestita dal nostro PC. Il codice di esecuzione sul micro STM32 si occupa soltanto di effettuare il passaggio di parametri al debugger OpenOCD. Vediamo come sfruttare questa funzionalità.

Per semplificare i passaggi, genereremo un nuovo progetto con l'IDE Eclipse. Questa volta nella schermata di configurazione del progetto sceglieremo queste opzioni:

2014-12-27 12_13_47-C++ Project

Facciamo generare il progetto ad Eclipse ed attendiamo che l'indicizzazione dei file sia completa. Se diamo uno sguardo al file main.c noteremo una serie di chiamate alle funzioni trace_XXXX. Queste funzioni sfruttano per l'appunto il semihosting ARM per inviare chiamate al nostro PC.

I passi successivi consistono nel cambiare il codice all'interno della funzione configure_system_clock() nel file _initialize_hardware.c e la configurazione del LED LD2 nel file BlinkLed.h, così come visto nella prima parte di questa serie. Infine, dobbiamo creare la configurazione di debug per poter invocare GDB, così come visto nella seconda parte della serie. L'unica differenza è che nei parametri di inizializzazione di GDB dobbiamo aggiungere l'istruzione monitor arm semihosting enable, così come mostrato in figura.

2014-12-27 12_20_53-Debug Configurations

L'istruzione "monitor" non fa altro che dire a GDB di inviare, tramite la porta 4444, ad OpenOCD l'istruzione "arm semihosting enable" che è per l'appunto il comando per avviare il semihosting. Mandiamo in debug il nostro programma e dopo un po' vedremo apparire nel terminale di OpenOCD i messaggi stampati nel main():

2014-12-27 12_24_19-Debug - test2_src_Timer.c - Eclipse

Con questo ultimo argomento si conclude questa mini-serie di tre parti in cui abbiamo visto come mettere su da zero un ambiente di sviluppo basato su Eclipse/GCC/OpenOCD per lo sviluppo di applicazioni embedded su piattaforma STM32, e nello specifico per la board di sviluppo STM32Nucleo. A presto per altri argomenti su questo tema.

 

Questo articolo fa parte di una serie di tre post. La prima parte è disponibile qui, la seconda qui.

 


Check Also

Come utilizzare la seriale di una scheda STM32 Nucleo

Come vi ho detto nei precedenti tutorial su questa nuova scheda di sviluppo di ST, …

15 comments

  1. non ho capito una cosa... ora che riusciamo a fare il debug e che vediamo che il led blinka supponiamo di voler caricare l'applicazione sulla board in modo permanente... come si fa?? ho provato tramite ST-link utility ma il led non blinka, mentre prima tramite il debug si

    • Carmine Noviello

      Ciao,
      con il debugger il firmware viene caricato sulla flash del micro, quindi non ci sono problemi.
      Il problema che, invece, hai con l'ST-Link Utility credo sia causato dal fatto che il programma NON ricarica in automatico il binario aggiornato quando ricompili, ma devi forzare il reload. Nella prima parte spiego bene questa cosa. Nel dubbio, chiudi il programma e prova a caricare il binario che con il debugger ti va: deve andare per forza.

  2. Ciao e grazie per la risposta e il supporto immediato.
    Comunque venendo al problema, io ho un STM32F0 nucleo.
    Utilizzando il debugger in eclipse funziona tutto correttamente, il debugger si ferma, non so perche, in call_host alla partenza, e dopo che ho premuto Resume(F8) vedo il led verde che inizia a lampeggiare .
    Se però scollego la board e la ricollego il led verde resta spento. Stessa cosa succede se provo a caricare il software tramite STM32 ST-LINK Utility. Dove sbaglio?

  3. Ho visto che togliendo tutte le istruzioni trace, immagino siano quelle relative al semihosting il led blinka quando lo scollego e lo ricollego! Quindi è necessario togliere ogni istruzione relativa al semihosting?

    • Carmine Noviello

      Ciao,
      si non ci avevo pensato. Se vedi, nella prima parte quando viene generato il progetto di test, l'opzione del semihosting è disabilitata. Questo perché, il semihosting è una sorta di RPC e se non c'è la parte "server" che gira sul PC, le chiamate vanno in hang. Per disabilitare il semihosting, puoi rimuovere le corrispondenti macro dalle opzioni del progetto.

  4. Grazie mille!!
    E' possibile disabilitare il semihosting da un progetto senza doverne creare uno nuovo?
    Non riesco a trovare la pagina "Target processor settings" che mostri nella prima parte.

    • Carmine Noviello

      In questo momento non posso provare la cosa, ma dovresti andare nelle proprietà del progetto, poi C/C++ Build->Settings, e nei Tool settings rimuovere le macro relative al semihosting in ogni configurazione del preprocessore per l'assembler e il compiler:

      Disattivare semihosting ARM

  5. Perfetto, funziona!!! Grazie ancora!!!

  6. Non è possibile avere la possibilità di fare un trace delle variabili? Come ad esempio succede nel Keil? Sto diventando matto per riuscire a risolvere questo problema!

    • Ciao, se parli di poter registrare nel tempo le variazioni del contenuto di una variabile, non credo che ci sia nulla di simile per Eclipse (proverò a cercare). Si riesce a fare con GDB, ma bisogna smanettare facendo qualche script. Altrimenti, Eclipse di permette di ispezionare il contenuto di una variabile nella "perspective" debug, ma non credo sia quello che cerchi.

      • Sono fregato! Nel keil ad esempio, quando imposti una variabile globale, nel wath expression, te ne fa vedere anche le variazioni, aggiornando questa varabile ogni X secondi (non so quanto sia esattamente il tempo di rinfresco)...

  7. Ciao Carmine, per caso sei riuscito a trovare qualcosa, sul discorso di poter vedere le variabili globali in real time, mentre si fa debug?

    Grazie mille in anticipo!

  8. Salve Carmine,
    grazie per il tutorial. Ho seguito tutti i passi e funziona tutto in modo corretto. La scheda in mio possesso è la St-NUCLEO F411RE. Eclipse versione Neon e purtroppo ultima parte, ovvero installazione del plug-in embregsysview non è compatibile così come ho letto su vari siti e forum. Soluioni possiibli passare a una verisone precedent edi eclipse?? O esiste un plug-in da usare al posto di embsysregview con le stesse funzionalità??
    Grazie milla

Rispondi a raffaele Annulla risposta

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.