6

デバイスがあり、デバッグ目的で printf 関数を使用してメッセージを IDE に送信したいと考えています。セットアップ:

  • ARM Cortex-M3 デバイス

  • ULINK2 インターフェース

  • uVision4 IDE

「Debug (printf) Viewer」でメッセージを表示できるようにするために、このリンクで利用可能な指示に従いました。まず、「retarget.c」ファイルを変更して、出力を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 */
}

次に、指示に従って、uVision4 で IMT を構成しました。 ここに画像の説明を入力

プロジェクトは正常にコンパイルされます。アプリケーションをデバイスにダウンロードし、uVision4 でデバッグ セッションを開始します。システムの初期化直後に、main 関数で簡単なメッセージを指定して printf を使用しようとしましたが、Debug Viewer は空のままです。「sendchar」関数にブレークポイントを配置しました。予想どおり、すべての行がヒットしていることがわかります。

ULINK2 と uVision4 で printf を使用して成功した人はいますか? Debug Viewer ウィンドウに出力が表示されない理由を知っている人はいますか?

アップデート

既存の ITM 関数を使用しようとした結果、より単純な "retarget.c" が作成されました。

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

それでも、Debug Viewer には出力が表示されません。printf 関数呼び出しをステップ オーバーすると、IDE の下部に "Trace: Data Overflow" が表示され、続いて "Trace: Communication Error" が表示されます。

4

1 に答える 1

9

問題は、「トレース」構成の「CoreClock」フィールドにありました。デバイスの時計と一致しませんでした。デバイスクロックに一致するように変更した後、正しい出力がデバッグビューアに表示されました。

いくつかの便利なリンク:

uVisionのステータスをトレースします

ステップバイステップでトレースを構成する方法

于 2013-02-15T19:58:54.880 に答える