Инструменты пользователя

Инструменты сайта


chibios:debug:openocd

OpenOCD

Развитие функционала прошивок привело к необходимости совершенствоваться в их отладке. Для этого будем применять OpenOCD.

Установка

Устанавливаем зависимости для сборки:

sudo apt-get install build-essential libftdi-dev
sudo apt-get build-dep openocd

Скачиваем исходный код:

git clone git://openocd.git.sourceforge.net/gitroot/openocd/openocd

Собираем:

./bootstrap
./configure --enable-maintainer-mode --enable-stlink --prefix=/opt/oocd
make
make install

Подготовка проекта к отладке

Если при сборке прошивки вы установили CH_USE_REGISTRY=TRUE, то в прошивку добавляется сигнатура ChibiOS. Наличие этой сигнатуры позволяет OpenOCD автоматически определять ChibiOS.

Вы можете проверить наличие этой сигнатуры:

arm-none-eabi-nm build/firmware.elf | grep ch_debug
 
080060b0 T ch_debug

Для отладки рекомендуется понизить или отключить оптимизацию.

Настройка

Идём в share/openocd/scripts/target/, открываем файл stm32_stlink.cfg и добавляем -rtos auto к строке создания цели, чтобы получилось так:

target create $_TARGETNAME hla_target -chain-position $_TARGETNAME -rtos auto

Вместо auto можно явно указать chibios.

Создаём в корне проекта файл .gdbinit:

target extended-remote :3333
set mem inaccessible-by-default off
monitor reset halt
 
define hook-step
 mon cortex_m maskisr on
end
define hookpost-step
 mon cortex_m maskisr off
end
#load
#monitor reg sp = (0x08000000)
#monitor reg pc = (0x08000004)

Создаём в корне проекта файл openocd.cfg:

source [find interface/stlink-v1.cfg]
source [find target/stm32f1x_stlink.cfg]
 
# default ports
telnet_port 4444
gdb_port 3333
tcl_port 6666
 
init
#adapter_khz 1125
reset init
 
halt
poll

Создаём в корне проекта символическую ссылку на openocd.

Использование

В отдельной консоли запускаем OpenOCD через символическую ссылку, видим:

$ ./openocd
Open On-Chip Debugger 0.9.0-dev-00001-g8fa67bd (2014-04-30-19:25)
Licensed under GNU GPL v2
For bug reports, read
 
http://openocd.sourceforge.net/doc/doxygen/bugs.html
 
Info : This adapter doesn't support configurable speed
Info : STLINK v1 JTAG v12 API v2 SWIM v0 VID 0x0483 PID 0x3744
Info : using stlink api v2
Info : stm32f1x.cpu: hardware has 6 breakpoints, 4 watchpoints
target state: halted
target halted due to debug-request, current mode: Thread
xPSR: 0x01000000 pc: 0x08000110 msp: 0x20000400
background polling: on
TAP: stm32f1x.cpu (enabled)
target state: halted
target halted due to debug-request, current mode: Thread
xPSR: 0x01000000 pc: 0x08000110 msp: 0x20000400

В консоли запускаем отладчик, видим:

$ arm-none-eabi-gdb build/firmware.elf
GNU gdb (GNU Tools for ARM Embedded Processors) 7.4.1.20121207-cvs
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "--host=i686-linux-gnu --target=arm-none-eabi".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from PROJECT/firmware/build/firmware.elf...done.
ResetHandler () at ../../chibios/os/ports/GCC/ARMCMx/crt0.c:267
267       asm volatile ("cpsid   i");
target state: halted
target halted due to debug-request, current mode: Thread
xPSR: 0x01000000 pc: 0x08000110 msp: 0x20000400
(gdb)

Загружаем и запускаем прошивку:

(gdb) load
Loading section startup, size 0xec lma 0x8000000
Loading section .text, size 0x61d4 lma 0x80000f0
Loading section .data, size 0x974 lma 0x80062c8
Start address 0x80000f0, load size 27700
Transfer rate: 8 KB/sec, 6925 bytes/write.
(gdb) run
The program being debugged has been started already.
Start it from the beginning? (y or n) y
 
Starting program: PROJECT/firmware/build/firmware.elf

Можно загнать прошивку и с помощью команд OpenOCD:

(gdb) mon halt
target state: halted
target halted due to debug-request, current mode: Handler HardFault
xPSR: 0x61000003 pc: 0xfffffffe msp: 0x200003e0
 
(gdb) mon flash write_image build/firmware.elf 0 elf
Padding image section 0 with 4 bytes
target state: halted
target halted due to breakpoint, current mode: Handler HardFault
xPSR: 0x61000003 pc: 0x2000003a msp: 0x200003e0
wrote 32268 bytes from file build/firmware.elf in 1.616798s (19.490 KiB/s)

Прерываем работу прошивки:

^C
_idle_thread (p=0x0) at ../../chibios/os/kernel/src/chsys.c:61
61        }
(gdb)

Получаем список тредов:

(gdb) info threads
[New Thread 536875568]
[New Thread 536875952]
[New Thread 536877048]
[New Thread 536876624]
  Id   Target Id         Frame
  5    Thread 536876624 (No Name :  : WTSEM) chSchGoSleepS (newstate=3 '\003')
    at ../../chibios/os/kernel/src/chschd.c:122
  4    Thread 536877048 (No Name :  : WTSEM) chSchGoSleepS (newstate=3 '\003')
    at ../../chibios/os/kernel/src/chschd.c:122
  3    Thread 536875952 (No Name :  : WTSEM) chSchGoSleepS (newstate=3 '\003')
    at ../../chibios/os/kernel/src/chschd.c:122
  2    Thread 536875568 (main :  : SLEEPING) chSchGoSleepS (newstate=6 '\006')
    at ../../chibios/os/kernel/src/chschd.c:122
* 1    Thread 536875384 (idle :  : CURRENT) _idle_thread (p=0x0) at ../../chibios/os/kernel/src/chsys.c:61
(gdb)

Получаем backtrace для второго треда:

(gdb) thread apply 2 bt
 
Thread 2 (Thread 536875568):
#0  chSchGoSleepS (newstate=6 '\006') at ../../chibios/os/kernel/src/chschd.c:122
#1  0x080009da in chSchGoSleepTimeoutS (newstate=6 '\006', time=250) at ../../chibios/os/kernel/src/chschd.c:190
#2  0x08000d78 in chThdSleep (time=250) at ../../chibios/os/kernel/src/chthreads.c:290
#3  0x08004aee in main () at main.c:179
(gdb)

Просмотреть содержимое памяти (8 байт по адресу 0x20000000) в виде HEX:

(gdb) x/8xb 0x20000000
0x20000000 <__main_stack_base__>:       0x55    0x55    0x55    0x55    0x55    0x55    0x55    0x55

И так далее…

chibios/debug/openocd.txt · Последние изменения: 2014/10/29 16:08 — Ruslan Popov