Reklama

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

Úvod

Jestliže jste se rozhodli zainvestovat do nějakého profi “debuggeru” (Atmel-ICE nebo AVR Dragon), nebo využíváte služeb mEDBG na Xplained deskách, tak vás bude čtení této kapitoly asi velice těšit.

Nejspíš se mnou budete souhlasit, že ladění (debugování) je věčná bitva mezi programátorem a chybičkami zakuklenými v programu. Chyby se dle Murphyho zákonů schovávají a udeří většinou v tu nejnevhodnější chvíli. Jsou v tom úplnými mistry a používají celou paletu triků, jak vás zmást. Čím častěji se s nimi budete setkávat, tím pevněji budete věřit, že v každém programu je vždy nějaká chyba. Program, který běží, není bezchybný. Nějaká zákeřná chyba v něm čeká, aby se projevila později, pokud možno až potom co zapomenete, jak program pracuje. V této věčné bitvě, ale nebudete bezbranní. Zvu vás na prohlídku arzenálu, které vám Atmel studio a “debuggery” nabízí.

Krokování programu

Základní prostředek, který velice dobře poslouží k hledání chyb v algoritmech. Krokujete si prográmek instrukci za instrukcí a sledujete obsah proměnných. Zdlouhavější procedury jako třeba smyčky, můžete v pohodě přeskočit, takže vás nebudou zdržovat. Ideálně se doplňuje s možnostmi Watch a Autos. Jde o natolik intuitivní prostředek, že si nezaslouží příliš dlouhý komentář. Proto ve stručnosti:

  • Continue (F5) – spustí program (zda a kde se zastaví, záleží na breakpointech)
  • Stop Debugging (Ctrl+Shift+F5) – kompletně zastaví debugování a vrátí vás do editace kódu
  • Break All (Ctrl+F5) – pozastaví program a umožní vám prohlížet proměnné nebo krokovat
  • Restart – Hardwarově restartuje čip a spustí program
  • Reset – Softwarově restartuje program (?) a zastaví na první instrukci
  • Step Into (F11) – vykoná aktuální instrukci a pokud je to funkce, tak vstoupí do ní a zastaví se na první instrukci ve funkci
  • Step Over (F10) – vykoná aktuální instrukci a pokud je to funkce, tak nevstupuje dovnitř
  • Step Out (Ctrl+F11) – pokud se nachází ve funkci vykoná všechny instrukce a zastaví se až po skončení funkce
  • Run to Cursor (Ctrl+F10) – něco jako breakpoint, nechá program běžet, až do instrukce na které máte kurzor
Watch

Watch slouží k přehledné kontrole nad obsahem proměnných. Najetím kurzorem nad proměnnou se zobrazí její aktuální hodnota. Pokud poté kliknete na ikonku “špendlíku”, tak si můžete malé okno připnout kamkoli do prostoru zdrojového kódu (viz Obr. 1). Máte potom přehled o stavu proměnné kdykoli program zastavíte. Přirozeně můžete její hodnotu i měnit. V okně Watch 1 můžete vidět, že sledovat nemusíte jen proměnnou, ale také i libovolný výraz (jehož hodnotu vypočte vždy Atmel Studio). Proměnnou můžete do okna Watch 1 přidat několika způsoby. Buď ji najdete ve zdrojovém kódu, kliknete na ni pravým tlačítkem a zvolíte Add to Watch. Nebo v okně Watch 1 kliknete na prázdný řádek a ručně do něj vypíšete název proměnné nebo výraz. Mazat sledované výrazy pak můžete kliknutím pravého tlačítka a zvolením Delete watch. O formátování výrazů se můžete více dozvědět ZDE. Jak vidno, tak si můžete volit z mnoha formátů zápisu. Dávejte si ale pozor, výrazy mohou měnit stav programu. Například zápisem y=x, dojde k přepsání proměnné y v cílové aplikaci!

 
Obr. 1: Ukázka použití funkce Watch

Obr. 1: Ukázka použití funkce Watch

 

Breakpoint

Breakpointy můžete umisťovat na libovolné instrukce v programu a slouží k tomu, aby se program zastavil v okamžiku kdy má vykonat instrukci na níž se breakpoint nachází. Typicky ho využijete v situaci, kdy potřebujete ručně odkrokovat nějakou rutinu nacházející se uprostřed programu. Umístíte na ni breakpoint, spustíte program, počkáte, než dojde na inkriminované místo a poté odtamtud můžete s přehledem krokovat a sledovat dění. Velice ho oceníte v situacích, kdy program reaguje na vnější nepředvídatelnou událost. Dejme tomu na externí přerušení. Stačí do rutiny přerušení umístit breakpoint, a jakmile je zavolána, tak se vám program zastaví a můžete vesele kontrolovat jeho chod opět krokováním. U složitějších aplikací se bez breakpointů v podstatě neobejdete. Nastíním několik typických případů, kdy vám může výrazně zjednodušit práci. Dejme tomu, že mikrokontrolér komunikuje s PC a na základě jeho pokynů vykonává nějakou akci (třeba pohybuje motorem). Čas od času se vám stane, že se motor pohne do polohy, do které by se dostávat neměl. A vy nevíte, zda je to tím, že PC odeslalo falešný pokyn, nebo, zda je chyba ve vašem programu. Nastavíte proto breakpoint na kus kódu, který může s motorem pohnout do polohy, kde ho nechcete a spustíte ho. Jakmile kritický okamžik nastane, tak se vám program zastaví a vy si můžete prohlédnout obsah proměnných a typicky i zprávu od PC a vyhodnotit, zda je na vině PC nebo váš program. A případně i proč to program udělal. A takových situací je hodně. Jejich řešení bývá na dlouhé hodiny a breakpointy vám mohou výrazně ušetřit čas. Na obrázku Obr. 2 vidíte ukázku použití. Program se má zastavit v rutině přerušení na instrukci x++ (označené červeným kolečkem vlevo). Poté co se tam zastavil, jsem udělal jeden krok a vy vidíte aktuální pozici programu označenou žlutou šipkou vlevo. V okně Watch 1 můžete vidět, že proměnná x má hodnotu 1 (tedy byla poprvé inkrementována). V okně Breakpoints pak máte seznam všech breakpointů. Zde jim můžete měnit parametry a také je případně povolovat nebo zakazovat.

 
Obr. 2: Ukázka jednoduchého breakpointu

Obr. 2: Ukázka jednoduchého breakpointu

 

Podmíněný breakpoint

Mnohdy nebudete chtít program zastavit pokaždé, když projde příslušnou instrukcí. Budete chtít, aby se na ní zastavil, jen pokud je splněna ještě nějaká další podmínka. V takovém případě můžete využít podmíněný breakpoint. V okně Breakpoints klikněte pravým tlačítkem na vámi vybraný breakpoint a zvolte Settings nebo klikněte pravým tlačítkem na červenou ikonku breakpointu vlevo od zdrojového kódu. Objeví se před vámi okno jako na obrázku Obr. 3. V něm můžete specifikovat podmínku. Já jsem zvolil, že se y má rovnat třem. Spustíte-li takový program, tak se vám zastaví v okamžiku, kdy je y=3 a program došel k instrukci x++. Nejspíš sami uznáte, že má takový nástroj značný potenciál. Mezi podmínkami je i položka Hit count. Tou můžete specifikovat, kolikrát musí program breakpointem projít, aby se zastavil. A to není zdaleka všechno. Položce Hit point můžete namísto konkrétní hodnoty nastavit “násobek”. Jinak řečeno můžete říct, že se má program zastavit, když počet průchodů breakpointem dosáhne nějakého násobku třeba třinácti. Dále namísto podmínky, můžete spustit “akci”. Akcí se rozumí výpis do okna Output a hezkou ukázku můžete vidět na obrázku Obr. 4. Breakpoint jsem nastavil tak, že s každým jeho průchodem by se do okna OUTPUT měla vypsat hodnota proměnné x ve tvaru “The value of x is {x}”. Výraz “$Function” zařadí před výpis informaci o tom, ve které funkci se program v tom okamžiku nacházel. Tady konkrétně vidíte, že šlo o vektor přerušení s číslem 14. To by mělo být přerušení od přetečení čítače / časovače 0. Proměnnou, kterou chcete vypsat dávejte do složených závorek. Pro další možnosti využijte nápovědy v okně (modré “i” v kroužku).

 
Obr. 3. - Ukázka podmíněného breakpointu

Obr. 3. – Ukázka podmíněného breakpointu

 

 
Obr. 4: Ukázka spuštění akce Atmel Studia po průchodu breakpointem

Obr. 4: Ukázka spuštění akce Atmel Studia po průchodu breakpointem

 

Data breakpoint

Data breakpoint vám umožňuje sledovat přístup programu k nějaké proměnné nebo obecně přístup k nějaké části paměti. Dejme tomu, že máte globální proměnnou, jejíž hodnotu mění více nezávislých procesů. Pokud byste chtěli zastavit program před jakýmkoli zápisem do této proměnné, nebyl by pro vás klasický breakpoint zrovna nejvhodnější nástroj. Museli byste totiž breakpointy rozmístit na všechny instrukce, které k proměnné přistupují a to vůbec nemusí být snadné (o časové náročnosti vůbec nemluvím). Proto máte k dispozici Data breakpoint. Ten nastavujete na nějakou pozici v paměti, takže musíte vědět, kde se vaše proměnná v paměti nachází. To můžete snadno zjistit z okna Watch. Poté zvolíte Acces mode v němž rozhodujete, zda se má program zastavit při zápisu a čtení do proměnné nebo při libovolné z těchto dvou akcí. A pokud chcete, tak ho můžete vybavit další podmínkou ošetřující hodnotu proměnné. V příkladu na obrázku Obr. 5 můžete vidět data breakpoint, který má zastavit program jakmile se do proměnné y (s adresou 0x2000) zapíše hodnota větší nebo rovna 9. Všimněte si, že se program zastavil na další instrukci hned po zápisu do y.

 
Obr. 5: Data breakpoint. Program se má zastavit, jakmile se do proměnné y zapíše hodnota větší nebo rovna 9.

Obr. 5: Data breakpoint. Program se má zastavit, jakmile se do proměnné y zapíše hodnota větší nebo rovna 9.

 

Stejně jako běžný breakpoint i data breakpoint může mít podmínky nebo vykonávat akce. Pokud v okně Data Breakpoint kliknete na vybraný breakpoint pravým tlačítkem, tak si můžete specifikovat další podmínky. V mém případě (Obr. 6) třeba Hit count. Program by se měl zastavit při třetím okamžiku, kdy je v proměnné x hodnota 7. Což se soudě dle výsledků patrných v okně Watch stalo. Případně můžete po kliknutím pravého tlačítka zvolit položku When hit a specifikovat akci, kterou má studio udělat. Například do okna Output vypsat nějakou informaci.

 
Obr. 6: Podmíněný Data breakpoint viz text.

Obr. 6: Podmíněný Data breakpoint viz text.

 

Autos a Locals

Okno Autos slouží k efektivnímu sledování proměnných během krokování (typicky nějakého algoritmu). Studio samo přidává do okna proměnné a registry které se účastnily minulé a následující instrukce. Díky tomu nemusíte složitě ručně přidávat všechny proměnné, které se nějak vyskytují v algoritmu. V okně Locals zase můžete sledovat stav lokálních proměnných (například v těle funkce).

Live Watch

Live Watch umožňuje sledovat aktuální stav proměnné i za běhu programu. Kliknutí pravým tlačítkem a volbou Show history lze sledovat i historii s informacemi o tom, kdy byla její hodnota přečtena a s jakým výsledkem (Obr. 7). Případně kliknutím na ikonku diskety je možné ukládat výsledek sledování do souboru.

 
Obr. 7: Live watch

Obr. 7: Live watch

V příštím díle si ukážeme další možnosti ladění v Atmel Studiu, takže se máte určitě na co těšit :)

 
 
Autor: Michal Dudka
 

 

[1] ATMEL. Atmel Studio Debugging. [online] citováno 26. února 2017. Dostupné na www: http://www.atmel.com/webdoc/atmelstudio/atmelstudio.Debug.html
Jiné příspěvky v kategorii:

 
Možnosti ladění v Atmel Studiu – 2. 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.