Jak na debug kódu uvnitř čipu

Nadpis příliš neporadil vlastní téma tohoto článku, ale lepší se mi vymyslet nepodařilo. Cílem bude uvést jednoduchý způsob, jakým je možné provést připojení GDB (debugger) k běžícímu kódu uvnitř STM32F10x (procesoru).

Úvod článku rovnou prozrazuje nejpokročilejší techniku odhalovaní chyb a to připojením externího debuggeru. Mnohem jednodušší a často využívané techniky přitom jsou

  • blikání LEDkou
  • výpis potřebných informací přes sériový port

Předchozí dvě techniky asi není potřeba nějak extra popisovat, zkrátka se do zdrojového kódu na správná místa rozmístí příslušné hlášky a pak se zkontroluje, kdy která byla vyvolána.

Aby bylo možné vytvořit spojení mezi GDB (debuggovací aplikace) a kódem běžícím v procesoru budou potřeba následující

  • STlink programátor
  • OpenOCD server
  • GDB pro příslušnou architekturu

STlink programátor lze použít buď originál (velmi drahý) nebo jeho kopii z číny. Ať už se rozhodnete pro kteroukoliv variantu, postup a výsledek by měly být totožné.

Pro instalaci OpenOCD serveru postačí zadat příslušný instalační příkaz, podle distribuce.

# sudo apt install openocd

Binární aplikace GDB by měla být obsažena v příslušném toolchain, se jménem typu arm-none-eabi-gdb.

Jako první se vždy spouští OpenOCD server. Spuštěný server poskytuje přístupové rozhraní dalším prvkům (v našem případě debuggeru GDB). Aby mohlo dojít ke korektnímu navázání komunikace mezi OpenOCD a programátorem STlink je nutné vytvořit korektní konfigurační soubor. Výchozí nastavení OpenOCD hledá soubor jménem openocd.cfg ve složce, ze které je spuštěn. Ukázkový konfigurační soubor níže.

source [find interface/stlink-v2.cfg]
source [find target/stm32f1x.cfg]
init

První řádek požaduje načtení konfigurace pro komunikaci přes STlink, druhý řádek požaduje načtení konfigurace příslušné pro rodinu pro rodinu procesorů STM32F10x, třetí a poslední řádek spustí inicializaci serveru.

Další možné konfigurace je možné najít v /usr/share/openocd/scripts/.

Po spuštění serveru by měl být vidět následující výpis

$ openocd
Open On-Chip Debugger 0.10.0
Licensed under GNU GPL v2
For bug reports, read
        http://openocd.org/doc/doxygen/bugs.html
Info : auto-selecting first available session transport "hla_swd". To override use 'transport select <transport>'.
Info : The selected transport took over low-level target control. The results might differ compared to plain JTAG/SWD
adapter speed: 1000 kHz
adapter_nsrst_delay: 100
none separate
Info : Unable to match requested speed 1000 kHz, using 950 kHz
Info : Unable to match requested speed 1000 kHz, using 950 kHz
Info : clock speed 950 kHz
Info : STLINK v2 JTAG v17 API v2 SWIM v4 VID 0x0483 PID 0x3748
Info : using stlink api v2
Info : Target voltage: 3.550858
Info : stm32f1x.cpu: hardware has 6 breakpoints, 4 watchpoints

Dalším krokem bude spuštění GDB. Debugger je bezpodmínečně nutné spouštět se zdrojovým programem zadaným jako parametr. Rovněž je nutné, aby zadaný program byl totožný s programem v čipu nahraném.

Po spuštění GDB debuggeru je nutné programu GDB zadat příkaz ke spojení s OpenOCD serverem, vše je detailně vidět na výpisu níže.

$ arm-none-eabi-gdb RFAardvarkPeripheral
GNU gdb (GNU Tools for Arm Embedded Processors 7-2018-q2-update) 8.1.0.20180315-git
Copyright (C) 2018 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=x86_64-linux-gnu --target=arm-none-eabi".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from RFAardvarkPeripheral...(no debugging symbols found)...done.
(gdb) target extended-remote :3333
Remote debugging using :3333
0x00000000 in ?? ()
(gdb) b main
Breakpoint 1 at 0x8000f3e
(gdb) run
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: /home/piglet/Project/Aardvark/RFAardvark/build/Peripheral/RFAardvarkPeripheral 
Note: automatically using hardware breakpoints for read-only addresses.

Breakpoint 1, 0x08000f3e in main ()
(gdb) 

Příkaz pro spojení je target extended-remote :3333, kde číslo za dvojtečkou označuje port, na kterém naslouchá OpenOCD server.

Pomocí příkazu b main lze nastavit první breakpoint do funkce main, program po spuštění příkazem run pak vyčká na své spuštění.

S takto nastaveným prostředím je pak možné aplikaci běžící uvnitř procesoru ladit stejně, jako kdyby běžela na lokálním PC. Tento styl práce tak může ušetřit spoustu času při ladění programu.


Posted

in

,

by

Tags: