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.