ボード上の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バリアントである可能性があります。]