Štítky:
ARM,
debugger,
embedded,
GDB,
Ghidra,
grafické toolkity,
hardware,
IDE,
MIPS,
Qt,
RISC-V,
STM32
ARM debugging - Black Magic Probe, orbuculum, ITM/ETM trace
22.3.2020 03:51
| Přečteno: 2344×
| programování
|
Embedded debuggingem - ARM, MIPS, RISC-V - se už zaobírám celkem dost let. Zde je přehled některejch užitečných nástrojů - debuggery, dekódování periferií přes SVD definice, hádání proč nastal fault. A méně známým featurám jako ITM/ETM trace.
Jako přehled, co všechno lze udělat u debugování ARM procesorů lze najít
v tomto dlouhém dokumentu. Nutno podotknout, že vznikal mnoho let, tudíž některé nástroje mají již jiný UI design (třeba zmíněný Qt Creator), ale obecně všechno co tam je, stále platí.
Hall of fame
Asi nejlepší nejprve zmínit užitečné nástroje, které za to stojí, většina open source (free as in code and free as in beer) nebo za rozumnou cenu:
- Black Magic Probe - alternativní firmware k STLink-ům, lze je použít i na embedded STLinky na STM32 discovery nebo Nucleo doskách - vector_catch na chytání exceptions je boží
- GDB dashboard - pěkná vizualizace kódu, registrů, zdrojáku v GDB
- Qt Creator - velmi dobré open source IDE, umožňuje debugovat remote GDB, akorát nemá SVD dekódování periferií
- CLion - placené IDE, oproti Qt Creatoru umí navíc dekódování periferií přes SVD definici a má lepší code completion/insight pro C++11/C++14 kód
- OpenOCD - obecný přístup k lowlevel funkcím procesoru, od erase/program flash po nastavovaní různých registrů (třeba ITM/ETM trace)
- debug probes - STLink - ideální pro STM32 čipy SWD debug a FlySwatter - pro JTAG debug, tento se mi hodil na K210 RISC-V debug
- Pulseview/Sigrok - logický analyzátor, má mnoho dekódérů protokolů od UART, I2C, ... až po ITM/NRZ SWO ETM, nebo bezkontaktní T55xx karty
- dekódování ARM periferií přes SVD: tyto definice lze použít v CLion, GDB, Ghidra, Ozone
- Ghidra SVD loader - vhodné na reverzování firmware a bootROM ARM procesorů v Ghidře
- SVD Cortex M register decoder script pro GDB - vhodné pro dekódování věcí jako DMA, SD Card, a jiné periferie ale i důvody exception faultů - How to debug hard fault on ARM Cortex M
Hall of meh
Zde jsou většinou drahé komerční nástroje, které až tak dobře nefungují a znova bych za ně nezaplatil. Pro pochopení následujícího odstace: ETM trace je prostře schopnost zaznamenat všechny instrukce, které byly spuštěny na procesoru. Je to součást ARM CoreSight.
- Ozone - debugger k Segger JLink/JTrace, oproti běžným debuggerům umí ETM trace. Segfaultí/abortí často. Když nepotřebuji ETM trace, tak si radši zvolím GDB dashboard, CLion nebo Qt Creator
- SystemView - tohle by byl zajímavý nástroj, pokud by neměl tolik chyb. Instrumentace vyžaduje změny v kódu. Na linuxu funguje jenom starší verze 2.52, ale povedlo se mi s tím odladit, jak se skutečně chová pre-empting interruptů na ARMu, protože tam je tail-chaining i late arriving (ve zkratce interrupt může přerušit interrupt s nižsí prioritou)
Screenshoty
Zde zkusím ilustrovat, na co je každý tool dobrý.
ETM trace (zaznamenání všech instrukcí mezi dvouma breakpointma, Instruction trace vlevo uprostřed):
SystemView ukazuje, že Systick interrupt, který byl manuálně upraven na víc než 50000 cyklů, může preemptnout USB interrupt (značeno jako ISR #93), který má nižší prioritu (nastává late arriving místo tail chaining):
Black Magic Probe
Vector catch exceptionů lze nastavit přes "monitor vector_catch nazev_exceptions". Na rozdíl od Ozone, vector catch tady ukazuje i stack trace (Ozone udělá breakpoint na Fault handleru, tady vidíme hardfault než se dostane k handleru):
target extended-remote /dev/ttyBmpGdb
Remote debugging using /dev/ttyBmpGdb
monitor swdp_scan
Target voltage: unknown
Available Targets:
No. Att Driver
1 STM32F40x M3/M4
attach 1
start
Dekódování periferií přes SVD definice
CLion, Ozone, Ghidra mají přímo možnost nahrát definice registrů zo SVD definice a pak je zobrazovat.
V GDB je na to potřeba skript:
How to debug a hard fault on ARM
Příklad dekódovaní části DMA registrů:
GDB
CLion
ITM a ETM trace
ITM je instruction trace macrocell a ETM je embedded trace macrocell. Velmi zjednodušeně, s ITM si můžete samplovat s určitou frekvencí, kde se kód nachází, nebo přes SWO pin vypisovat data, na ETM je typicky potřeba 4 TRACEDATA piny a 1 TRACECLK pin procesoru. ETM by mělo jít "přesměrovat" i přes SWO pin, ale nebude kompletní proti použití TRACE pinů.
Pulseview/Sigrok má decoder pro
ITM/ETM na NRZ SWO pin, ale ne pro všechny TRACE piny. Na to je
orbulucum na Lattice HX8K desce (bohužel se mi to nepovedlo nikdy rozchodit).
Nastavování ITM a ETM je strašný opruz pokud na to nemáte nástroj.
Jeden example jak to dělat je například tady. Ale když se podíváte na ten configure-trace.openocd soubor, tak buď tomu nebudete rozumět, nebo budete muset luštit v manuálech.
ITM trace je ta jednodušší a i relativně levné nástroje ji rozumí (např. STMicro nástroje). Naproti tomu ETM trace je fakt složitá a bez profesionálních nástrojů se moc daleko nedostanete. I to orbuculum zabralo spoustu času. Na ETM trace jsou asi 3 nejznámější nástroje, Segger JTrace, Lauterbach Trace32 a Keil uLink Pro. Každý stojí tak jednu ruku. Já mám zrovna JTrace a mám problém i s jejich referenční STM32F407 doskou. Zrovna mám pocit, že jsem dostal nějaký nový model s novými featurami, ale i novými bugmi (jiní kolegové říkají, že jejich starší JTrace funguje mnohem lépe).
Tiskni
Sdílej:
Komentáře
Vložit další komentář
22.3.2020 10:49
Petr
Re: ARM debugging - Black Magic Probe, orbuculum, ITM/ETM trace
22.3.2020 14:40
Max | skóre: 72
| blog:
Max_Devaine
Re: ARM debugging - Black Magic Probe, orbuculum, ITM/ETM trace
24.3.2020 17:09
Pavel Píša | skóre: 18
| blog:
logic
Re: ARM debugging - Black Magic Probe, orbuculum, ITM/ETM trace
Založit nové vlákno •
Nahoru