내 보드의 JTAG 커넥터에 Keil ULINK2 USB 에뮬레이션 상자가 연결되어 있는데 Cortex- M3 CPU 탑재 (TI/Stellaris/LuminaryMicro LM3S 시리즈). JTAG과 SWJ-DP 포트가이 CPU에서 동일한 핀 (따라서 보드의 커넥터)을 공유하는 것 같습니다. 하나는 ITM (printf) 기능을 갖고 있지 않은 것으로 나타나고, 다른 하나는 그렇습니다.Cortex-M3 CPU에서 printf를 통해 출력 디버그가 BKPT 명령에서 멈추다가 JTAG 및 sw 포트에 대해 혼동합니다.
이전 펌웨어 사용자는 항상 stdio를 사용하여 직렬 포트를 사용했지만 직렬 포트가 필요하므로 디버그 메시지가 직렬 포트와주고받는 다른 데이터를 간섭하지 않도록해야합니다. 추적 메시지가 다른 곳으로 갈 필요가 있습니다. 슬프게도이 보드에는 하나의 직렬 포트만 있습니다. 이 CPU의 ITM (Trace) 기능은 디버거 printf 메시지를 내 디버거/IDE (Keil uVision)에 직접 보낼 수 있다는 의미였습니다. TI/Stellaris CPU 문서는이 기능을 '직렬 와이어 JTAG 디버그 포트 (SWJ-DP)'라고 부르며 필자가 읽었던 지원 기능은 Keil uVision IDE에 구현 된 기능입니다.
내 코드에 printf 메시지를 추가하면 디버깅을 시작할 때 코드가 잠길 수 있습니다. 록업은 BKPT 명령어에서, 함수 _sys_open에, 내 응용 프로그램에 링크 된 RTL 라이브러리에 여기에있는 것 같다
_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 소프트웨어 및 하드웨어가이 용도로 이미 구성되어 있어야합니까? Keil JTAG/sw 포트에서 디버그 printf를 작동시키는 데 어떤 트릭이 있습니까?
sw 및 JTAG 포트의 차이점을 잘 모르겠습니다. sw은 정확히 무엇을 의미합니까? 보드에서 JTAG 물리적 커넥터에 대한 두 가지 가능한 모드 중 하나 인 JTAG은 트레이스 지원이없는 고전적이지만 제한된 모드이며 SW 모드는 JTAG에 핀을 추가하지 않고 트레이스 지원을 추가합니다. 커넥터 레이아웃? 그러나 이것은 임베디드 시스템입니다. 암호가있는 것이 표준입니다. 저는 Cortex-M3 개발을 처음 접했고, 이전 ARM7TDMI 시절부터 많은 것들이 저에게 새로운 것입니다. 그러나 Keil uVision은이 메시지를 출력합니다. "ITM은 JTAG이 아닌 SW 포트에서만 작동합니다". SW는 보드에서 설계해야하는 다른 물리적 포트입니까? (내가 아닌 개발 스타터 보드를 사용자 정의 설계 애플리케이션 보드를 사용하고 있습니다.)
가[주변에 인터넷 검색을하는 _sys_open
일부 프라 그마 __use_no_semihosting_swi
과 뭔가 다른, ROM에서 BRKPT 지침이 퍼즐에 밀접하게 관련되어 있다는 사실에 나를 수 있습니다 SWI ('소프트웨어 인터럽트') ARM 명령어의 일부 ARM 변형 일 수 있습니다.]
예. 이것이 세미 호스팅의 의미입니다! JTAG를 통한 Printf-redirected. –