GDB, OpenOCD 및 arm-none-eabi-gcc를 사용하여 STM32 감지 보드를 사용하여 디버그 메시지를 gdb 콘솔에 인쇄하는 방법은 무엇입니까?


15

OpenOCD, arm-none-eabi-gcc 및 gdb를 사용하여 STM32 Cortex M0 디스커버리 보드 (32F0308DISCOVERY)를 프로그래밍하고 있습니다. SWD를 통해 디버그 메시지를 기록하는 간단한 방법이 있는지 궁금합니다. 세미 호스팅 옵션에 대해 읽었지만 newlib 또는 다른 큰 라이브러리를 가져와야합니다. (64k 플래시 만 사용 가능합니다.) SWD를 통해 텍스트를 기록하는 더 가벼운 방법이 있습니까? 아니면 UART를 사용하는 유일한 실용적인 옵션입니까?


1
세미 호스팅 옵션을 사용해보십시오. 참고로, M3 / 4 용 CooCox (무료 Windows Cortex-M 환경)에서 제공하는 라이브러리는 매우 미니멀하며 1 바이트 전송은 17 개의 어셈블리 명령입니다. 세미 호스팅과 -O0을 사용하여 이전 (STM32F4) 프로젝트를 다시 빌드하면 코드 크기에 48 바이트가 추가되었습니다.
markt

사용하지 않는 코드를 제거하는 링커가 없을 수 있습니다. 대안으로, stlink 도구를 구동하기위한 texane의 github repo는 간단한 메일 링 방식을 가지고 있지만 아직 시도하지는 않았습니다.
Chris Stratton

답변:


15

포인터, markt 및 chris-stratton에게 감사합니다. 세미 호스팅 옵션은 매우 간단합니다. OpenOCD 콘솔에 메시지를 보낼 수있는 몇 가지 간단한 로깅 루틴의 소스를 찾을 수있었습니다. 나는 (i) 작동하기 위해 약간의 수정이 필요했고 (ii) 막 시작한 사람들에게는이 정보를 찾기가 쉽지 않다고 생각하기 때문에 여기에 게시 할 것입니다.

먼저, 여기 에서 D 코드 는 다음 C 기능을 제공하도록 쉽게 조정됩니다.

void send_command(int command, void *message)
{
   asm("mov r0, %[cmd];"
       "mov r1, %[msg];"
       "bkpt #0xAB"
         :
         : [cmd] "r" (command), [msg] "r" (message)
         : "r0", "r1", "memory");
}

send_command를 호출하여 OpenOCD 콘솔에 문자열을 쓰는 예 :

const char s[] = "Hello world\n";
uint32_t m[] = { 2/*stderr*/, (uint32_t)s, sizeof(s)/sizeof(char) - 1 };
send_command(0x05/* some interrupt ID */, m);

둘째, 코멘트에 주어진 putChar 기능은 여기에 내가 0x03으로 앞에 '#'을 추가했다 것을 제외하고 잘 작동합니다 :

void put_char(char c)
{
    asm (
    "mov r0, #0x03\n"   /* SYS_WRITEC */
    "mov r1, %[msg]\n"
    "bkpt #0xAB\n"
    :
    : [msg] "r" (&c)
    : "r0", "r1"
    );
}

이러한 기능의 출력을 보려면 먼저 OpenOCD를 시작한 다음 arm-none-eabi-gdb를 사용하여 다음과 같이 연결하십시오.

target remote localhost:3333
monitor arm semihosting enable
monitor reset halt
load code.elf
continue

메시지는 GDB 콘솔이 아니라 OpenOCD 프로세스의 stdout에 나타납니다.


1
버그가 있습니다. sizeof ()는 strlen ()이어야합니다.

1
감사합니다. 실제로 's'가 포인터가 아닌 배열이면 sizeof를 사용할 수 있으므로 그렇게 수정했습니다.
foldl

좋은 대답입니다! 다음 putchar과 같이 간단하게 작성할 수도 있습니다.void putchar(char c) { send_command(3,&c); }
mvds

1
"sizeof"는 문자열의 후행 \ 0을 계산하지만 strlen은 계산하지 않습니다. openocd가 stdout과 xterm 터미널 창에 인쇄되면 터미널이 무시할 것이므로 눈에 띄는 차이가 없을 것입니다. 그러나 파일에 파일을 넣으면 거기에서 그 0을 찾는 것이 놀랄 것입니다. 아니면 프로토콜에서 후미 종결 자와 함께 문자열을 보내도록 지정합니까?
user242579

아, 좋은 점 user242579. 후행 \ 0을 고려하여 '-1'을 추가했습니다.
foldl December
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.