Guida al porting LabVIEW Embedded per ARM

L’architettura del processore ARM RISC a 32-bit sviluppata da ARM Limited è ampiamente utilizzata in diversi progetti embedded per via del prezzo contenuto, basso consumo e per la vasta gamma di periferiche adatte ai maggiori produttori di silicio. Oggi, la famiglia ARM rappresenta oltre il 75 percento di tutte le CPU RISC a 32-bit. È possibile utilizzare NI LabVIEW Embedded Module for ARM Microcontrollers per la programmazione dei microcontrollori ARM con il sistema operativo embedded RTX. Questo articolo offre una linea generale per indirizzare il codice LabVIEW su un target ARM custom.

Con NI LabVIEW Embedded Module for ARM Microcontrollers è possibile migrare il software LabVIEW su qualunque microntroller 260 ARM7, ARM9 e Cortex-M3 e molti altri per la replica del sistema. Utilizzando un unico strumento di sviluppo, dall’idea al prodotto finito, è possibile semplificare il processo di sviluppo e ottimizzare la qualità finale riducendo il time to market.

PORTARE LA PROGETTAZIONE GRAFICA SU UN NUOVO MICRO CONTROLLER ARM

Sebbene LabVIEW Embedded Module for ARM include diversi target di esempio tra cui le schede di valutazione Keil MCB2300 e Luminary Micro EK-LM3S8962, esistono diversi microcontrollori ARM sui quali LabVIEW è inseribile. Questo articolo fornisce delle linee guida generali per incorporare un nuovo target ARM dopo averne verificato la conformità con i requisiti hardware e software. Questo esempio specifico mostra un microcontrollore Philips NXP LPC3180 ARM9 sulla scheda di valutazione phyCORE-ARM9/LPC3180. Generalmente, il processo per incorporare un nuovo target ARM segue questa procedura:

  • Migrare il Kernel RTX Real-Time
  • Integrare il modulo Real-Time Agent per il debug
  • Creare il target in LabVIEW e incorporare la toolchain di Keil
  • Sviluppare periferiche e driver di I/O.

Pur mostrando le procedure specifiche necessarie a incorporare la scheda di valutazione Phytec LPC3180, questo tutorial fornisce delle linee guida generiche per ciascun processo applicabile a qualsiasi target. Per incorporare un microcontroller ARM arbitrario, è necessario personalizzare molte delle procedure mostrate sotto per lo specifico microcontroller. Quando è stato scritto questo articolo, il Kernel RTX Real-Time e il modulo Real-Time Agent non erano ancora stati sviluppati per LPC3180. Pertanto, questo tutorial mostra tutti i quattro processi. Tuttavia, questa procedura potrebbe non essere necessaria per tutti i target. In questo tutorial si suppone che LabVIEW Microprocessor SDK sia installato.

INTEGRARE LABVIEW E LE TOOLCHAIN DI KEIL

Per migrare un target ARM su LabVIEW, il target deve essere in grado di supportare il RTX Real-Time Kernel. Per far sì che un target ARM supporti il debug del front panel, il target deve esser compatibile con il modulo Real-Time Agent. Per stabilire se il target supporta il RTX Real-Time Kernel, cerca nella cartella \Keil\ARM\Startup il file corrispondente al produttore del microcontrollore ARM. Se la cartella contiene un file RTX_Conf*.c per il target, significa che il Kernel RTX Real-Time è supportato dal dispositivo ARM. Per stabilire se il target supporta il modulo Real-Time Agent, cerca nella cartella \Keil\ARM\RT Agent\RTX, e trova il dispositivo corrispondente al microcontrollore ARM. Se il dispositivo è presente nella cartella, significa che il modulo Real-Time Agent è già stato configurato per il dispositivo. La creazione del target implica la modifica del template Vision project per far sì che venga riconosciuto da LabVIEW, incorporando tutto il codice sorgente del driver per le periferiche essenziali e integrando le toolchain di Keil.

UTILIZZO DEL TARGET EDITOR PER GESTIRE I TARGET EMBEDDED

Questa parte del tutorial richiede la presenza di LabVIEW Microprocessor SDK. Tutti i target ARM per LabVIEW utilizzano gli stessi VI plug-in. Pertanto, per facilitare l’aggiunta di un nuovo target ARM su LabVIEW, è stato fornito un template target che contiene un file TgtSupp.xml configurato con i corretti VI plug-in, strutture di cartelle e il simbolo dei file del driver. La creazione di un nuovo target per LabVIEW richiede una copia di questo target template con un nome univoco che ne identifichi la tipologia.

Ecco i passi da seguire:

  • Sfoglia la cartella LabVIEW\Targets\Keil\Embedded\RealView.
  • Copia la cartella Generic e richiamala
  • Cerca la cartella LabVIEW \Targets\Keil\Embedded\RealView\LPC3180\LP C2378 e copia tutti i file al suo interno.
  • Cerca la cartella LabVIEW \ Targets\Keil\Embedded\RealView\LPC3180\ e incolla i file copiati dalla cartella LPC2378.
  • Cancella le cartella LM3Sxxxx e LPC2378.
  • Apri LabVIEW e seleziona Tools»Embedded»Target Editor.
  • Seleziona File»Open, e cerca la cartella LPC3180 rinominata nella passo precedente.
  • Trova e apri il file TgtSupp.xml.
  • Tasto destro sull’icona Other e rinominala LPC3180.
  • Tasto destro su Applications e seleziona Properties.
  • Nella pagina Category, seleziona Manage Interrupts e cancella questa voce cliccando sulla X rossa Remove Property Page Button (figura 1).
  • Clicca OK per tornare sul Target Editor.
  • Seleziona File»Save, ed esci dal Target Adesso hai creato il target.
  • Riavvia LabVIEW in modo che i target disponibili siano rinumerati.
Figura 1: settaggio delle specifiche

Figura 1: settaggio delle specifiche

PREPARARE I FILE DI TEMPLATE

LabVIEW si affida a un project µVision correttamente configurato che definisce la posizione dei vari file di driver specifici per il target. Poiché i driver sono specifici per ciascun target, alcuni di questi inclusi nel template generico sono riutilizzabili, mentre altri non lo sono. Segui questa procedura per preparare i driver corretti per LPC3180.

  • Cerca la cartella LabVIEW \Targets\Keil\Embedded\RealView\LPC3180 \eio e cancella tutti i file al suo interno. In seguito potrai copiare driver di I/O elementari per il target.
  • Sfoglia la cartella LabVIEW\Targets\Keil\Embedded\RealView\LPC3180\interrupt\. Cancella tutti i file in questa cartella tranne il file interrupt.xml. Il file interrupt.xml per LPC2378 serve a configurare il modo in cui LabVIEW genera il codice quando utilizza gli interrupt. Dato che gli interrupt per LPC2378 sono incompatibili con quelli per LPC3189, non usare gli interrupt. L’integrazione degli interrupt non è contemplate nel documento, pertanto consulta LabVIEW Embedded Module for ARM Help per maggiori informazioni.
  • Apri interrupt.xml in un editor di testo, aancella il testo in questo file e sostituiscilo con il seguente:
    <Version>1</Version>
    <Array>
    <Name>ProvidedInterruptData</Name>
    <Dimsize>0</Dimsize>
    <Array>
  • Salva interrupt.xml ed esci dall’editor di testo.
  • Sfoglia la cartella LabVIEW\Targets\Keil\Embedded\RealView\LPC3180\Template\System e cancella I file RTX_Config.c e LPC2300.s.
  • Apri RTX_Config.c in un editor di testo e aggiungi il seguente file di header:
    #include <LVConfig.h>
    /* LV Config header */
    quindi chiudi e salva RTX_Config.c.
  • Apri LPC3000.s in un editor di testo ed inserisci le seguenti linee dal file di startup:
    + Undef_Handler B        Undef_Handler
    + PAbt_Handler    B       PAbt_Handler
    + IMPORT         Undef_Handler
    + IMPORT        PAbt_Handler
    quindi salva e chiudi il file LPC3000.s.Queste modifiche permettono a LabVIEW di impostare i bit di errore appropriati quando viene lanciato un handler Undefined IRQ.
  • Sfoglia la cartella LabVIEW \Targets\Keil\Embedded\RealView\LPC3180\Template\Project.
    Copia i file Ext_RAM.ini e Clock.ini.
  • Apri ini in un editor di testo e modifica la linea:
    LOAD Ext_SDRAM\Blinky.axf INCREMENTAL
    con:
    LOAD Obj\LabVIEW.axf INCREMENTAL
    Salva e chiudi Ext_RAM.ini.
    Il template Vision project è configurato di default per compilare l’applicazione in un eseguibile chiamato LabVIEW.axf nella cartella Obj; pertanto, questa modifica assicura che il file corretto sia caricato nella memoria dopo l’esecuzione.
  • Sfoglia la cartella LabVIEW\Targets\Keil\Embedded\RealView\LPC3180\Template\Drivers. Cancella le cartelle Ethernet, Interrupt, I2C ed SPI.
  • Sfoglia la cartella LabVIEW\Targets\Keil\Embedded\RealView\LPC3180\Template\Drivers\RTClock.
    Apri ARM_RTClock.c in un testo e cancella il codice per entrambe le funzioni, ARM_rtc_gettime() and ARM_init_rtc();
  • Salva ARM_RTClock.c ed esci dall’editor di testo.
  • Sfoglia la cartella LabVIEW\Targets\Keil\Embedded\RealView\LPC318. Apri TargetConfig.ini in un editor di testo.
  • Cancella tutto il testo sotto la linea che indica “[Files].” Nella sezione [Define], aggiungi la linea: SocketSupport = 0.

MODIFICARE IL TEMPLATE PROGETTO uVISION

Quando LabVIEW compila un VI, effettua delle chiamate al Vision, chiedendo di aprire un project preconfigurato che è  stato personalizzazto per  un target specifico. Questo project preconfigurato definisce il modo in cui Vision compila il codice. Il project definisce inoltre come scaricare ed eseguire il codice sul target.

  • Apri l’ambiente Vision 3.
  • Apri il menu Project e seleziona Open Project….
  • Apri la cartella LabVIEW \ Targets\Keil\Embedded\RealView\LPC3180\Te mplate\Project e apri il project LabVIEW.uV2.
  • Nel Project Workspace, sotto la cartella Target Startup, rimuovi il file s con tasto destro sui singoli file e selezionando Remove File.... Rimuovi inotlre i file LPC23_EMAC.c, ARM_irq.c, ARM_I2C.c, e ARM_SPI.c dalla cartella dei Target Driver.
  • Tasto destro sulla cartella Target Startup e seleziona Add Files to Group “Target ” Sfoglia la cartella LabVIEW\Targets\Keil\Embedded\RealView\ LPC3180\Template\System e aggiungi i file LPC3000.s e Retarget.c copiati in questa cartella nel passo precedente.
  • Configura le opzioni del project selezionando l’icona Options for Target nella build toolbar.
  • Sul Device tab, seleziona NXP LPC3180 nella lista dei produttori di CPU (figura 2).
Figura 2: selezione delle CPU

Figura 2: selezione delle CPU

  • Configura le impostazioni del Target come mostrato.
  • Assicurati che il sistema operativo sia impostato per l’utilizzo del RTX Kernel.
  • Imposta il Code Generation for Thumb-Mode, assicurati di spuntare il Cross-Module Optimization e assicurati di NON spuntare il Use MicroLIB.
  • Assicurati di spuntare Xtal sia impostata a 0 MHz e che le aree di memoria Read/Only off-chipROM1 Read/Write off-chip RAM1. Imposta l’avvio e le dimensioni delle aree di memoria come mostrato in figura 3.
Figura 3: configurazione delle aree di memoria

Figura 3: configurazione delle aree di memoria

  • Mantieni tali le impostazioni sul tab Output e Il nome dell’eseguibile DEVE essere LabVIEW.
  • Passa al tab Asm. Nella Conditional assembly control Symbols, nel campo Define, scrivi RAM_INTVEC, REMAP (figura 4). Fatto questo, il codice di avvio copia i vettori di eccezione da una memoria flash a bordo chip a una RAM a bordo chip e ad una RAM a bordo chip all’indirizzo Per la documentazione sui vari simboli SET, guarda l’inizio del file di avvio del dispositivo (LPC3000.s).
Figura 4: settaggio parametri operativi

Figura 4: settaggio parametri operativi

  • Nel tab Debug, seleziona Use: ULINK ARM Debugger.
  • Configura il Setup ARM Target Driver cliccando sul pulsante Settings. Le impostazioni del Setup ARM Target Driver devono avere il Clock Max JTAG impostato su RTCK e tutte le opzioni di Debug spuntate (Cache Options, Download Options, e Misc Options) come in figura 5.
Figura 5: Setup ARM Target Driver

Figura 5: Setup ARM Target Driver

  • Clicca OK per tornare sulla finestra Options for Target.
  • Assicurati che il comando Load Application at Startup sotto l’impostazione ULINK ARM Debugger, sia spuntato.
  • Aggiungi il file corretto di Initialization cliccando sul bottone sfoglia e selezionando il file Ext_RAM.ini precedentemente copiato nella stessa cartella come project.
  • Il tab Debug dovrebbe apparire come in figura 6.
Figura 6: opzioni di Debug

Figura 6: opzioni di Debug

  • Nel tab Utilities, configura il Target Driver per la programmazione Flash Programming cliccando sul pulsante Setting.
  • Seleziona LPC2000 IAP2 512kB Flash e clicca sul pulsante Remove.
  • Clicca sul pulsante Nella nuova finestra, evidenzia LPC3180 NAND Flash SP e clicca su Add per tornare alla finestra precedente.
  • Configura le restanti opzioni Flash Download Setup come in figura 7 e clicca OK. Assicurati di impostare correttamente i valori RAM for Algorithm Start e Size.
Figura 7: opzioni Flash Download Setup

Figura 7: opzioni Flash Download Setup

  • Torna sul tab Utilities e aggiungi il file corretto di inizializzazione, cliccando sul bottone sfoglia e selezionando il file ini precedentemente copiato nella stessa cartella come project.
  • Clicca OK per tornare sul Project Workspace. Salva il progetto ed esci da Vi sion.

AGGIUNGERE SUPPORTO PER LE LIBRERIE DI ANALISI AVANZATA

  • Sfoglia la cartella LabVIEW \ Targets\Keil\Embedded\RealView\MCB2300. Copia la cartella e incollala su LabVIEW\Targets\Keil\Embedded\RealView\LPC3180. Sotto la cartella LPC3180, crearne una nuova chiamata “lib”.
  • Sfoglia la cartella LabVIEW\Targets\Keil\Embedded\RealView\LPC3180\build e apri LVAnalysis.Uv2 nell’abiente Vision.
  • Configura le opzioni del project selezionando l’icona Options for Target nella build toolbar.
  • Sul Device tab, seleziona NXP LPC3180 nella lista dei produttori di CPU.
  • Configura le impostazioni del Target come mostrato in figura 8.
Figura 8: le impostazioni del Target

Figura 8: le impostazioni del Target

  • Assicurati che il sistema operativo sia impostato per l’utilizzo del RTX Kernel.
  • Imposta il Code Generation for Thumb-Mode, assicurati di spuntare il Cross-Module Optimization e assicurati di NON spuntare il Use MicroLIB.
  • Assicurati di spuntare Xtal sia impostata a 13.0 MHz e che le aree di memoria Read/Only off-chipROM1 Read/Write off-chip RAM1.
  • Nel tab Output, clicca sul pulsante Select Folder for Objects e cerca la cartella LabVIEW\Targets\Keil\Embedded\RealView\LPC3180\build e clicca OK.
  • Nel tab Listing, clicca sul pulsante Select Folder for Objects e cerca la cartella LabVIEW\Targets\Keil\Embedded\RealView\LPC3180\build e clicca OK.
  • Clicca OK per tornare sul Project Workspace.
  • Realizza la libreria selezionando l’icona Build Target sulla build toolbar oppure il Project»Build target sulla barra del menu principale.
  • Quando la realizzazione è completa, un file LVAnalysis.lib apparirà LabVIEW\Targets\Keil\Embedded\RealView\LPC3180\lib.
  • Sfoglia la cartella LabVIEW\Targets\Keil\Embedded\RealView\LPC3180 \ e apri TargetConfig.ini in un editor di testo.
  • Sotto la riga che indica [FILES], aggiungi:
    <LABVIEW>\Targets\Keil\Embedded\RealView\LPC3180\lib\LVAnalysis.lib = lib
    salva e chiudi TargetConfig.ini.

SCARICARE ED ESEGUIRE UN PROGRAMMA SUL TARGET

Dopo aver modificato il template µVision project, il prossimo passo prevede la creazione di un LabVIEW Project, indirizzare il dispositivo e verificare che un semplice VI sia compilato, scaricato ed eseguito sul target. Prima di farlo, assicuratevi di aver scaricato il boot loader secondario per LPC3180 sul target. L’esecuzione della memoria flash non funziona correttamente senza il boot loader secondario. Crea un nuovo Project:

  • Apri LabVIEW e crea un nuovo progetto selezioando File»New Project.
  • Nella finestra Project, salva il progetto selezionando File»Save Seleziona una cartella per il project che chiamerai LPC3180.
  • Tasto destro sul project lvproj e seleziona New » Targets and Devices.
  • Sotto Targets and Devices, espandi la cartella Embedded, seleziona il target LPC3180 e clicca OK.
  • Tornando sul Project Explorer, tasto destro sul target LPC3180 e seleziona New»VI.
  • Nel VI appena creato, ricrea il seguente codice sostituendo un ciclo while e creando un indicatore sul loop iteration Inserisci un Wait (ms).VI nel ciclo while e connetti una costante 100 ai millisecondi nell’input wait (figura 9).
Figura 9: codice di prova

Figura 9: codice di prova

  • Salva il VI come vi.
  • Nel Project Explorer, tasto destroy su Build Specifications e seleziona New»Application.
  • Per abilitare le funzioni di debug, seleziona Application Information sotto la Category ed assicurati di aver spuntato l’opzione “Enable debugging”.
  • Dopo, seleziona Advanced Debugging Options sotto la finestra Category ed assicurati che il JTAG USB ULINK2 sia selezionato in Debugging Mode.
  • Seleziona i file Source sotto la finestra di Category e seleziona vi come Top-level VI.
  • Clicca OK per tornare sul Project Explorer.
  • Vai sul front panel del Main.vi.
  • Clicca sulla freccia di Run per compilare il VI, scaricalo sulla memoria flash ed esegui il programma.
  • L’esecuzione corretta del VI dovrebbe incrementare l’indicatore numerico approssimativamente una volta ogni 100 ms per indicare il valore dell’iterazione terminale (figura 10).
Figura 10: esecuzione

Figura 10: esecuzione

Scrivi un commento