4

ボード上のJTAGコネクタにKeilULINK2USBエミュレータボックスが接続されています。これは、オンボードのCortex-M3 CPU(TI / Stellaris / LuminaryMicro LM3Sシリーズ)で正常に動作します。JTAGポートとSWJ-DPポートの両方が、これらのCPUで同じピン(したがって、ボード上のコネクタ)を共有しているようです。1つにはITM(printf)機能がないように見えますが、もう1つにはあります。

以前のファームウェアの人々は常にstdiotoUART(シリアルポート)を使用していましたが、デバッグメッセージがシリアルポートとの間で送受信される他のデータに干渉しないように、シリアルポートを解放する必要があります。したがって、トレースメッセージが必要です。他の場所に行きます。残念ながら、このボードにはシリアルポートが1つしかありません。このCPUのITM(トレース)機能は、デバッグprintfメッセージをデバッガー/ IDE(Keil uVision)に直接送信できることを意味すると思いました。TI / Stellaris CPUのドキュメントでは、この機能を「シリアルワイヤJTAGデバッグポート(SWJ-DP)」と呼んでいます。このサポートは、私が読んだところ、間違いなくKeiluVisionIDEに実装されている機能です。

コードにprintfメッセージを追加すると、デバッグを開始したときにコードがロックされます。ロックアップは、私のアプリケーションにリンクされているRTLライブラリの関数_sys_openのBKPT命令にあるようです。

                 _sys_open:
  0x00009D7A B50E      PUSH     {r1-r3,lr}
  0x00009D7C E9CD0100  STRD     r0,r1,[sp,#0]
  0x00009D80 F7FFFC0F  BL.W     strlen (0x000095A2)
  0x00009D84 9002      STR      r0,[sp,#0x08]
  0x00009D86 4669      MOV      r1,sp
  0x00009D88 2001      MOVS     r0,#0x01
>>0x00009D8A BEAB      BKPT     0xAB
  0x00009D8C BD0E      POP      {r1-r3,pc}

上記は、によって呼び出されるコードの一部のよう__rt_lib_init_stdio_1です。

何が起こっている?BKPTが何をするのかわかりません。ソフトウェアブレークポイントが発生し、デバッガーで処理する必要があると思いますか?Keil / ARM ULINK2ソフトウェアとハ​​ードウェアは、このためにすでに構成されているべきではありませんか?デバッグprintfをKeilJTAG/ swポートで動作させるためのトリックはありますか?

swポートとJTAGポートの違いがわかりません。swは正確には、ボード上のJTAG物理コネクタの2つの可能なモードの1つを指していると思います。ここで、JTAGはクラシックですが、トレースサポートのないより制限されたモードであり、swモードはJTAGにピンを追加せずにトレースサポートを追加します。コネクタのレイアウト?しかし、これは組み込みシステムであり、不可解であることが標準です。私はCortex-M3開発に不慣れであり、このようなものの多くは、古いARM7TDMIの時代から私にとって新しいものです。しかし、Keil uVisionは、「ITMはSWポートでのみ機能し、JTAGでは機能しません」というメッセージを出力します。SWは、ボード上で設計する必要のある別の物理ポートですか?(私は、開発スターターボードではなく、カスタム設計のアプリケーションボードを使用しています。)

[グーグルで調べてみると、このパズルには_sys_openいくつかのプラグマ__use_no_semihosting_swiやその他のものが密接に関係しているという事実がわかります。ROM内のBRKPT命令は、SWI(「ソフトウェア割り込み」)ARM命令のARMバリアントである可能性があります。]

4

4 に答える 4

6

これは、stdioが実装されていないことを理解するのに失敗したものでしたが、通常は「retarget.c」というファイル内で行われる独自の実装を提供する必要があります。ファイル名は純粋な慣例ですが、KeilのuVision / RTLIBドキュメント内に(結局のところ)十分にドキュメント化されています

于 2010-07-13T19:34:24.623 に答える
3

IAR EWW ARMツールチェーンを使用してこれを実行しましたが、セミホスティングという用語は、Keilのアプローチが類似していると私に信じさせます。セミホスティングを使用するためにリンクする標準ライブラリを指定するときにオプションがあるはずです。これにより、printf/putcがJTAGポートを介してデバッガーにリダイレクトされる別のライブラリでコンパイル/リンクされます。

したがって、UvisionIDEまたはmakeスクリプトでプロジェクトのオプションを確認してください。IARリンカーコマンドラインでは、これは「--semihosting」ですが、Keilツールではおそらく異なります。

BKPTは、ツールがデバッガーをトリガーするためにソースに挿入する命令です。これは、デバッガーがHWブレークポイントをサポートしていない場合(または既にそれらの完全な補完を使用している場合)に、IDEでコードにブレークポイントを追加できるようにする方法です。

于 2010-07-13T12:21:03.193 に答える
2

SWは、デバイスのデバッグポートへのアクセスを提供する2線式インターフェイスです。

アームはここにそれについての.pdfを持っています:

http://www.arm.com/files/pdf/Low_Pin-Count_Debug_Interfaces_for_Multi-device_Systems.pdf

于 2010-08-10T03:38:10.710 に答える
2

Keil uVisionでこの問題に対処するには、プロジェクトオプションに移動します。[ターゲット]タブ/[コード生成]で、[MicroLIBを使用する]チェックボックスをオンにします。

于 2010-12-29T16:08:38.047 に答える