Тыкаю STM32, пытаюсь заставить нормально работать semihosting. У меня есть STM32F103C8T6, китайский ST-LINK/V2 (SWD), GNU Arm Embedded Toolchain, openocd и stlink.
Хочу, чтобы при выполнении make debug
запускался gdb, подключался к отлаживаемому контроллеру и по continue
начинал выполнение программы, выводя все сообщения из printf.
Вариант первый: запускаю st-util --semihosting
, в gdb выполняю: target extended-remote localhost:4242
, load
,
monitor semihosting enable
,
continue
. Вывод printf попадает не на терминал gdb, а в файл с именем ":tt".
Вариант второй: запускаю openocd -f interface/stlink-v2.cfg -f target/stm32f1x.cfg
, в gdb выполняю: target extended-remote localhost:3333
, load
,
monitor arm semihosting enable
,
continue
. Вывод printf попадает в терминал openocd, а не в терминал gdb, что уже лучше, но все равно не так удобно.
Другие варианты: собрать JTAG-отладчик на коленке, модифицировать прошивку китайского ST-LINK/V2, чтобы gdb-server крутился прямо на нем и openocd с stlink стали не нужны (не рассматриваются из-за нетривиальности).
Поясните, как вы это настроили для себя и реально ли вообще добиться, чего я хочу, без патчей на openocd/stlink? cast Vit, ncrmnt, Eddy_Em
Для желающих потыкать, выкладываю полный исходный код:
#include <libopencm3/stm32/rcc.h>
#include <stdio.h>
/* For semihosting on newlib */
extern void initialise_monitor_handles(void);
static void clock_setup(void) {
rcc_clock_setup_in_hse_8mhz_out_72mhz();
}
int main(void) {
clock_setup();
#if defined(ENABLE_SEMIHOSTING) && (ENABLE_SEMIHOSTING)
initialise_monitor_handles();
#endif
printf("Hello World\n");
/* Wait forever and do nothing. */
while (1)
__asm__("nop");
return 0;
}
BINARY = test
OPENCM3_DIR = ../libopencm3
LDSCRIPT = $(OPENCM3_DIR)/lib/stm32/f1/stm32f103x8.ld
# To disable, run "make ENABLE_SEMIHOSTING=0" or comment next line out
ENABLE_SEMIHOSTING ?= 1
ifeq ($(ENABLE_SEMIHOSTING),1)
LDFLAGS += --specs=rdimon.specs
LDLIBS += -lrdimon
DEFS += -DENABLE_SEMIHOSTING=1
endif
include ../libopencm3.target.mk