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:
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".
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; ' –