Reklama

Možnosti ladění v Atmel Studiu – 2. Díl

Úvod

Ve druhém dílu zaměřeném na možnosti ladění v Atmel Studiu si ukážeme další funkce, která nám můžou pomoci při odchytávání chyb v programu.

Trace

Některé mikrokontroléry řady ATmega, které jsou vybavené JTAG rozhraním mají speciální registr OCDR, který slouží k předávání uživatelských dat do “debuggeru”. Aplikace zapíše do registru OCDR jeden byte a “debugger” jeho obsah pravidelně kontroluje. Pokud tam nalezne data, tak je přepošle do Atmel Studia. To by je mělo v okně Output zobrazit. Pro zobrazení je potřeba v roletkovém menu zvolit IDR Messages. Jak často “debugger” testuje obsah registru OCDR netuším, někde jsem četl že každých 50 ms, jinde zase každých 100 ms. Přirozeně nemá význam zapisovat do toho registru častěji. Váš program může sledováním nejvyššího bitu registru OCDR zjistit, zda byl “debugerem” přečten a podle toho se zařídit. Bližší informace jak na to najdete v datasheetu. Spolu s hodnotou OCDR vám Atmel Studio zobrazí i čas, kdy zprávu “debugger” vyzvedl. Sběr data probíhá stále, tedy ať už program běží nebo ho krokujete. Vzhledem k tomu, že jsem jej objevil před nedávnem, tak vám nemůžu říct, zda a kde tento prostředek prakticky použijete. Dávejte si ale pozor na jednu nepěknou vlastnost Atmel Studia. Když jsem neměl okno Output dost “roztažené”, tak se mi tam nevešlo roletkové menu, v němž si IDR zprávy vybíráte. Když se tam nevejde, Atmel Studio ho nezobrazí vůbec a pak máte dojem, že tam prostě nic není. Tato banální záhada mě stála skoro hodinu laborování :D

 
Obr. 1: IDR Trace na ATmega16

Obr. 1: IDR Trace na ATmega16

 

Další okna v režimu Debug

Veledůležité je okno I/O. Tam můžete sledovat a měnit stav všech speciálních funkčních registrů. Díky tomu máte kompletní přehled o dění ve všech periferiích. Všechny změny od posledního zastavení programu se v tomto okně zobrazují červeně. Díky tomu nemusíte držet v paměti stavy jednotlivých bitů a stačí vám sledovat, které zčervenaly a víte, co se změnilo. Nezapomeňte, že tímto nástrojem můžete ovládat všechny registry, tedy i ty zodpovědné za ovládání portů. Což neznamená nic jiného než, že pouhým kliknutím myší a nastavením nebo vynulováním registru PORTx můžete nastavit logickou hodnotu na výstupu. A ať už k němu máte připojenu LED, motor nebo relé, máte ho díky tomu pod plnou kontrolou. Za zmínku možná stojí i okno Immediate, které slouží jako chytrá kalkulačka. Můžete zde zapisovat výrazy, které chcete ihned vyhodnotit. Do jaké míry ho ale využijete, opravdu netuším.

Omezení!

Práce s výše uvedenými nástroji má bohužel i svá omezení. To nejokatější vyplývá z optimalizace programu. Překladač může často vyhodnotit, že vaše proměnná nemá v programu moc smysl a v rámci šetření pamětí ji prostě vyřadí. Přirozeně tak aby chod programu zůstal stejný. V takovém případě logicky nemůžete pomocí funkcí Watch, Autos, Locals nebo Actions sledovat její obsah. Pokud si i přes to proměnnou přidáte třeba do okna Watch, dozvíte se od Atmel Studia, že její obsah není možné zobrazit, nebo vám někdy i řekne, že proměnná byla při optimalizaci odstraněna. Podobná omezení vyplývají i pro krokování a breakpointy. Pokud překladač v rámci optimalizace některou část kódu upravil, nemůžete tuto oblast krokovat ani na tyto instrukce umísťovat breakpointy. Protože ty instrukce prostě v programu nejsou. Pokud i přes to umístíte na takovou instrukci breakpointy, bude jeho symbol vyplněn bílou barvou a přibude u něj ikonka žlutého trojúhelníku.

Breakpointy pak podléhají dalším omezením. Například mikrokontroléry s rozhraním DebugWIRE nemají vůbec žádné breakpointy. Tedy ani datové a ani podmíněné. Breakpoint se u nich realizuje pomocí instrukce BREAK, kterou “debugger” vloží na odpovídající místo v programu. To ale znamená, že pro vložení této instrukce je potřeba přepsat část paměti programu. To je relativně zdlouhavá operace a nesmíte se proto divit, že to Atmel Studiu (respektive “debuggeru”) trvá (zvláště pokud mikrokontrolér taktujete nízkou frekvencí). Pokud to tedy situace umožňuje, tak využívejte namísto breakpointu příkaz “run to cursor”. Když potom k breakpointu přidáte nějakou akci, jako třeba výpis obsahu proměnné, tak si musíte uvědomit, že je to invazivní metoda. “Debugger” počká, až se program zastaví na breakpointu, nechá ho nějakou dobu pozastavený a mezi tím vyčte obsah proměnné. Chod programu se tedy mění.
Podmíněné breakpointy jsou také invazivní metoda. Pokud program na breakpoint narazí, zastaví svůj chod, “debugger” vyhodnotí, jestli je splněna podmínka a nechá program pokračovat nebo jeho chod zastaví (klidně na 50 ms). Na breakpoint se tedy dívejte tak, že se na něm program vždy zastaví! Atmel Studio ale po provedení akce případně zkontrolování podmínky program zase pustí aby běžel dál. Totéž platí i pro podmíněný data breakpoint. A stejně tak i Live Watch je invazivní metoda, která může radikálně narušit chod programu.

Omezení jsou kladena také na množství breakpointů. Některé málo vybavené mikrokontroléry jak už víme, nemají žádné, vybavenější mikrokontroléry jako třeba ATmega32, mají 2 – 4 breakpointy podle typu. Některé ATxmegy mají neomezené množství breakpointů. Je proto dobré si u konkrétního čipu prohlédnout v datasheetu kapitolu o možnostech ladění (debugu).

Další zajímavé omezení potkáte při ladění (debugování) rozhraním PDI (mikrokontroléry ATxmega). I když máte program pozastavený, tak mohou na pozadí běžet například čítače (pokud to povolíte). Případně můžete využívat výstupu CLKOUT k taktování nějakého vnějšího obvodu. Pak vás jistě bude zajímat, že takt mikrokontroléru (tady i takt čítačů a výstupu CLKOUT) se během pozastavení programu mění a to na hodnotu kterou si můžete navolit v Project->Properties->Tools. Například u ATMEL-ICE můžete volit frekvenci v rozsahu 32 kHz-7.5 MHz. Změna taktu je tedy další věc, která by vás mohla překvapit.
Mějte tedy vždy na paměti, že proces ladění může rapidně narušovat plynulost chodu programu. A vždy zvažte, co to může způsobit. Například v časově nenáročné aplikaci, kde program vyčítá data ze senzoru, zpracovává je a posílá do PC, vás zdržení v řádu desítek až stovek milisekund nemusí moc trápit. Pokud ale program například v rámci přerušení musí rychle zareagovat na vnější událost, tak můžou jeho reakci invazivní metody ladění výrazně zpomalit.

Dodatek – Diasy Chained JTAG

Může se vám stát, že někdy budete stavět zařízení třeba s více mikrokontroléry. Případně, a to je pravděpodobnější, s mikrokontrolérem a hradlovým polem nebo CPLD. Pokud budou mít všechna zařízení rozhraní JTAG, můžete za určitých okolností programovat obě dvě skrze jedno rozhraní (jeden konektor). Vysvětlím (a předvedu) to na dvou mikrokontrolérech. Dejme tomu že máte desku, kde pracují dva Atmely (řekněme ATmega16). Oba vybavené rozhraním JTAG. Je pravděpodobné, že budete chtít oba mikrokontroléry nejen programovat, ale i nějak ladit. Vybavíte tedy svou desku dvěma JTAG konektory a během ladění programu budete střídavě přepojovat “debugger” podle toho, který z mikrokontrolérů zrovna potřebujete ladit. A přesně tomuto se můžete vyhnout. Zařízení na JTAG lze řetězit za sebe. Schéma spojení můžete vidět na obrázku Obr. 2.

 
Obr. 2: JTAG Daisy chain (převzato z www.atmel.com)

Obr. 2: JTAG Daisy chain (převzato z www.atmel.com)

 

Signály TCK a TMS jsou společné všem mikrokontrolérům, signál TDI vedoucí z “debuggeru” se připojí na vývod TDI prvního mikrokontroléru. Vývod TDO prvního mikrokontroléru se připojí na TDI druhého mikrokontroléru. A tak stále dokola až u posledního mikrokontroléru se vývod TDO připojí do “debuggeru” na pin označený TDO. Já přidal na všechny linky (TCK, TMS, TDI, TDO) vedoucí k “debuggeru” ještě “pull-up” rezistory o hodnotě 10 k, protože bez nich mi spojení padalo. S takovou konfigurací můžete ladit i programovat libovolný mikrokontrolér v řetězci. Je ale nutné Atmel Studiu sdělit základní parametry řetězce. V okně Project->Properties->Tool vyberete programátor (Atmel-ICE nebo Dragon), rozhraní JTAG a v sekci JTAG Daisy chain settings zvolíte manual. Pak musíte Atmel Studiu sdělit, kde v celém řetězci se vaše zařízení nachází. Atmel Studio po vás bude chtít vědět kolik zařízení se nachází před tím vaším a kolik se nachází za ním. Máte-li tedy například tři zařízení a chcete programovat to prostřední, tak se před vaším zařízením nachází jedno jiné zařízení a za ním také jedno. Pokud budete chtít ze tří programovat ten poslední, pak se před ním nachází dva a za ním žádné. Já mám zařízení jen dvě (obě ATmega16). A schválně, kdo uhodne z následujícího obrázku Obr. 3, které z nich chci programovat.

 
Obr. 3: Specifikace zařízení v JTAG řetězci

Obr. 3: Specifikace zařízení v JTAG řetězci

 

… uhodli jste. Je to první zařízení v řetězci. Počet zařízení před ním je 0 a počet zařízení za ním je 1. Každé zařízení má ještě několik tzv. Instruction bits. Jejich počet se může pro různá zařízení lišit, takže vám můžu říct jen to, že mikrokontroléry rodiny AVR mají 4. Pokud to dobře chápu, tak musíte počet Instruction bits před nebo za vaším zařízením sečíst. Raději si to opět ukážeme na příkladu. Máte-li řetězec složený ze tří AVR mikrokontrolérů a chcete-li ovládat poslední z nich, tak musíte do kolonky Instruction bits before zapsat hodnotu 8. Protože se před vaším zařízením nachází dvě AVR, každé se čtyřmi Instruction bits. Pokud budete mít v řetězci nějaké jiné zařízení (například CPLD), musíte se z jeho “datasheetu” dočíst kolik IR bitů má a počítat s nimi. Jen pro ilustraci jsem testovací zapojení se dvěma Atmely v řetězci vyfotil a můžete ho vidět na obrázku Obr. 4.

 
Obr. 4: Ilustrační fotografie zapojení

Obr. 4: Ilustrační fotografie zapojení

 

Praktické poznámky

Ladění skrze delay funkce je problematické a většinou je musíte “přeskočit” buď pomocí breakpointu nebo pomocí Run to Cursor. Ale jistě víte, že delay funkce se používají opravdu výjimečně jen na nějaké rychlé testování. Otravné chování při ladění vás bude o to víc motivovat pracovat bez nich. Také vás musím upozornit, že tak jak všechno na počítači i ladění se občas zasekává. Někdy pomůže vytáhnout programátor z USB, jindy restart Atmel Studia :D

 
 
Autor: Michal Dudka
 

 

[1] ATMEL. Atmel Studio Debugging. [online] citováno 5. března 2017. Dostupné na www: http://www.atmel.com/webdoc/atmelstudio/atmelstudio.Debug.html
[1] ATMEL. Atmel-ICE. [online] citováno 5. března 2017. Dostupné na www: http://www.atmel.com/webdoc/GUID-DDB0017E-84E3-4E77-AAE9-7AC4290E5E8B/index.html?GUID-22309B26-88EF-4EC4-98F6-74C0BC5C80D5
[1] Youtube. EEVblog #499 – What is JTAG and Boundary Scan?. [online] citováno 5. března 2017. Dostupné na www: https://www.youtube.com/watch?v=TlWlLeC5BUs
Jiné příspěvky v kategorii:

 
Možnosti ladění v Atmel Studiu – 1. Díl

 
Tajned facebook
 

Za případné chyby v textu, ve zdrojovém kódě, nebo ve schématickém zapojení se omlouváme.
AUTOŘI NEBEROU ŽÁDNOU ODPOVĚDNOST ZA PŘÍPADNÉ ÚJMY NA ZDRAVÍ ČI MAJETKU.