2013-02-15 10 views
6

Wir haben ein Gerät und ich würde gerne printf Funktion verwenden, um Nachrichten an die IDE zu Debugging-Zwecken zu senden. Das Setup:Zeige printf Nachrichten in IDE während des Debuggens

  • ARM Cortex-M3-Gerät

  • ULINK2 Schnittstelle

  • uVision4 IDE

ich die Anweisungen in this link verfügbar gefolgt sind in der Lage sein zu sehen, die Nachrichten im "Debug (printf) Viewer". Zuerst I modifiziert, um die "retarget.c" -Datei, die Ausgabe an die Schnittstelle ITM zu umleiten:

#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 */ 
} 

Dann konfiguriert I IMT im uVision4, nach den Anweisungen: enter image description here

Das Projekt Kompilierungen fein. Ich lade die Anwendung auf das Gerät und starte eine Debug-Sitzung mit uVision4. Ich versuche, Printf mit einer einfachen Nachricht in der Hauptfunktion direkt nach der Systeminitialisierung zu verwenden, aber der Debug Viewer bleibt leer. Ich habe Haltepunkte in die "sendchar" -Funktion gesetzt, ich kann sehen, dass alle Zeilen wie erwartet getroffen werden.

Hat es jemand geschafft, printf mit ULINK2 und uVision4 zu verwenden? Hat jemand eine Ahnung, warum ich keine Ausgabe im Debug Viewer-Fenster sehen kann?

UPDATE

Ich habe versucht, die bestehenden ITM Funktionen zu nutzen, in einer einfacheren "retarget.c" resultierende:

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

Dennoch wird keine Ausgabe im Debug-Viewer angezeigt. Wenn ich den printf-Funktionsaufruf überspringe, wird "Trace: Data Overflow" unten in der IDE angezeigt, gefolgt von "Trace: Communication Error".

Antwort

9

Das Problem war im "CoreClock" -Feld in der "Trace" -Konfiguration. Es entspricht nicht der Uhr des Geräts. Nachdem ich es entsprechend der Geräteuhr geändert hatte, wurde die richtige Ausgabe im Debug Viewer angezeigt.

einige nützliche Links:

Trace status in uVision

How to configure the Trace, step by step

+0

Und bevor man überprüft CoreClock, stellen Sie sicher, dass 'HSE_VALUE' der tatsächlichen Oszillatorfrequenz eingestellt wird, wenn eine solche verwendet wird. Ich fand auch wichtig, das 'TRACE_IOEN' Bit in' DBGMCU_CR * ((flüchtige unsigned *) 0xE0042004) = 0x00000020; ' –

Verwandte Themen