2013-02-15 14 views
6

Mamy urządzenie i chciałbym użyć funkcji printf do wysyłania wiadomości do IDE w celu debugowania. Konfiguracja: urządzeniePokaż komunikaty printf w IDE podczas debugowania

  • ARM Cortex-M3 interfejs

  • ULINK2

  • uVision4 IDE

mam przestrzegać instrukcji dostępnych w this link aby móc zobaczyć wiadomości w "Przeglądarce debugowania (printf)". Najpierw zmodyfikował "retarget.c" plik, aby przekierować wyjście do interfejsu 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 */ 
} 

Potem skonfigurowanego IMT w uVision4, postępując zgodnie z instrukcjami: enter image description here

The kompilacji projektu w porządku. Pobieram aplikację na urządzenie i uruchamiam sesję debugowania z uVision4. Próbuję użyć printf z prostym komunikatem w funkcji głównej, zaraz po inicjalizacji systemu, ale Debug Viewer pozostaje pusty. Umieściłem punkty przerwania w funkcji "sendchar", widzę, że wszystkie linie są trafione zgodnie z oczekiwaniami.

Czy ktoś z powodzeniem używa printf z ULINK2 i uVision4? Czy ktoś ma pojęcia, dlaczego nie widzę żadnych danych wyjściowych w oknie Debug Viewer?

UPDATE

Starałem się wykorzystać istniejące funkcje ITM, powodując prostszy "retarget.c":

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

Niemniej jednak, nie ma wyjścia jest pokazany w Debug Viewer. Kiedy przejdę do funkcji funkcyjnej printf, "Trace: Data Overflow" pojawi się na dole IDE, a następnie "Trace: Communication Error".

Odpowiedz

9

Problem był w polu "CoreClock" w konfiguracji "Trace". Nie pasowało do zegara urządzenia. Po zmianie tego ustawienia na zegar urządzenia odpowiednie wyjście zostało pokazane w przeglądarce debugowania.

Przydatne linki:

Trace status in uVision

How to configure the Trace, step by step

+0

I zanim jednej kontroli CoreClock, upewnij się, że 'HSE_VALUE' jest ustawiony na częstotliwości oscylatora rzeczywistego, jeśli jest używany. Znalazłem również ważne, aby ustawić bit 'TRACE_IOEN' w' DBGMCU_CR * ((volatile unsigned *) 0xE0042004) = 0x00000020; ' –

Powiązane problemy