2010-07-11 6 views
3

내 보드의 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 변형 일 수 있습니다.]

답변

6

이 것은 stdio가 구현되지 않았 음을 이해하는 데 실패했지만, 대신 "retarget.c"라는 파일 내부에서 직접 구현해야합니다. 파일명은 순수한 규칙이지만, Keil의 uVision/RTLIB 문서에서 잘 설명되어 있습니다.

3

IAR EWW ARM 툴 체인을 사용하여이 작업을 수행했으나 세미 호스팅이라는 용어는 Keil 방식이 비슷하다고 생각합니다. 세미 호스팅을 사용하기 위해 링크 할 표준 라이브러리를 지정할 때 옵션이 있어야합니다. 이것은 JTAG 포트를 통해 printf/putc를 디버거에 리다이렉트하는 다른 라이브러리에서 컴파일/링크 될 것이다.

그래서 Uvision IDE 또는 make 스크립트에서 프로젝트 옵션을 확인하십시오. IAR 링커 명령 행에서 이것은 "- 세미 호스팅"이지만 Keil 도구와 다를 수 있습니다.

BKPT는 도구가 디버거를 트리거하기 위해 소스에 삽입하는 명령입니다. 디버거가 HW 중단 점을 지원하지 않거나 이미 전체 보완을 사용했을 때 IDE에서 코드에 중단 점을 추가하는 방법입니다.

+0

예. 이것이 세미 호스팅의 의미입니다! JTAG를 통한 Printf-redirected. –

2

는 Keil의 uVision에서이 문제를 해결하려면 단지 옵션을 프로젝트로 이동합니다

암 여기에 대한 .PDF 있습니다. 대상 탭/코드 생성에서 MicroLIB 사용 확인란을 선택합니다.

+0

MicroLib을 사용하면 소프트 부동 소수점 연산 구현 (코어에 FPU가없는 경우)이 IEEE-754를 준수하지 않는 것과 같은 더 미세한 작업에도 영향을 미친다는 것을 알고 있어야합니다. 자세한 정보는 http://www.keil.com/support/man/docs/armlib/armlib_chr1358938938946.htm을 참조하십시오. – Amomum

관련 문제