2013-02-15 10 views
6

Abbiamo un dispositivo e mi piacerebbe utilizzare la funzione printf per inviare messaggi all'IDE a scopo di debug. La messa a punto: dispositivoMostra messaggi printf in IDE durante il debug

  • ARM Cortex-M3 interfaccia

  • ULINK2

  • uVision4 IDE

Ho seguito le istruzioni disponibili in this link per essere in grado di vedere i messaggi nel "Debug (printf) Viewer". Per prima cosa ho modificato il file "retarget.c", per reindirizzare l'output all'interfaccia ITM:

#include <stdio.h> 
#include <rt_misc.h> 

#pragma import(__use_no_semihosting_swi) 

// Para utilização do saida de debug através do ULINK2 
#define ITM_Port8(n) (*((volatile unsigned char *)(0xE0000000+4*n))) 
#define ITM_Port16(n) (*((volatile unsigned short*)(0xE0000000+4*n))) 
#define ITM_Port32(n) (*((volatile unsigned long *)(0xE0000000+4*n))) 
#define DEMCR   (*((volatile unsigned long *)(0xE000EDFC))) 
#define TRCENA   0x01000000 

struct __FILE { int handle; /* Add whatever you need here */ }; 
FILE __stdout; 

// Escreve caractere na porta de Debug 
int sendchar (int ch) {   
    if (DEMCR & TRCENA) { 
    while (ITM_Port32(0) == 0); 
    ITM_Port8(0) = ch; 
    } 
    return(ch); 
} 

int fputc(int ch, FILE *f) { 
    return (sendchar(ch)); 
} 

int ferror(FILE *f) { 
    /* Your implementation of ferror */ 
    return EOF; 
} 


void _ttywrch(int ch) { 
    sendchar(ch); 
} 


void _sys_exit(int return_code) { 
label: goto label; /* endless loop */ 
} 

Poi ho configurato l'IMT nel uVision4, seguendo le istruzioni: enter image description here

Le compilazioni di progetto bene. Scarico l'applicazione sul dispositivo e avvio la sessione di debug con uVision4. Provo ad usare printf con un semplice messaggio nella funzione principale, subito dopo l'inizializzazione del sistema, ma il Debug Viewer rimane vuoto. Ho inserito i breakpoint nella funzione "sendchar", posso vedere che tutte le linee vengono colpite, come previsto.

Qualcuno è riuscito a utilizzare printf con ULINK2 e uVision4? Qualcuno ha un indizio sul motivo per cui non riesco a vedere alcun output nella finestra Debug Viewer?

UPDATE

Ho cercato di utilizzare le funzioni ITM esistenti, con un conseguente "retarget.c" più semplice:

int fputc(int ch, FILE *f) { 
    return (ITM_SendChar((uint32_t)ch)); 
} 

Tuttavia, nessuna uscita viene mostrato nel visualizzatore di debug. Quando passo il richiamo della funzione printf, "Trace: Data Overflow" viene visualizzato nella parte inferiore dell'IDE, seguito da "Trace: Communication Error".

risposta

9

Il problema era nel campo "CoreClock" nella configurazione "Trace". Non corrispondeva all'orologio del dispositivo. Dopo averlo modificato per abbinare il clock del dispositivo, l'output corretto è stato mostrato nel Debug Viewer.

Alcuni link utili:

Trace status in uVision

How to configure the Trace, step by step

+0

E prima che uno controlli CoreClock, assicurarsi che 'HSE_VALUE' è impostato su frequenza dell'oscillatore reale, se uno è usato. Ho trovato anche importante impostare il bit 'TRACE_IOEN' in' DBGMCU_CR * ((non volatile senza segno *) 0xE0042004) = 0x00000020; ' –

Problemi correlati