AVRStudion käyttö debuggaukseen. Emulaattori 24.8.2008 pva Hän joka mikro-ohjain-oppia ilmaiseksi jakaa, hän elää ja kuolee rikkaana. - Mr Ben Mable Yleistä Perusteellisesti ja huolella suunniteltu koodi on tehokkain tapa kirjoittaa toimiva ja selkeä ohjelma vähimmillä virheillä. Mutta sulautettu koodi on niin laiteläheistä ja sitä kautta kryptistä (monimutkaista), että on vaikea välttyä virheiltä. Virheiden eliminointi alkaa jo koodin järkevästä kommentoinnista. Ohjelmavirheitä on historiallisista syistä ruvettu nimittämään bugeiksi. Virheiden etsintä ja poistaminen on siten de-buggaamista, bugien poistoa. AVR-studiolla voi koodin kohdistuvien perustöiden (kirjoittaminen, kääntäminen ja koodin lataaminen AVR:n ohjelmamuistiin) lisäksi tehdä em. virheiden jäljitystä, debuggausta, ohjelmassa olevalla simulaattorilla tai JTAGICE-emulaattorilla: - voit käynnistää ohjelman ajon - pysäyttää ohjelman suorituksen kesken ajon - askeltaa ohjelmaa käsky kerrallaan - asettaa koodiin pysäytyskohtia, breakpointeja, o ja tarkastella AVR:n rekistereiden ja muistipaikkojen sisältöjä, porttien I/O-pinnien tiloja, muuttujien arvoja, jne. 90/10-sääntö Ohjelmaprojektin työajasta 90% kuluu testaukseen ja virheiden etsimiseen/korjaamiseen. Jotta ohjelmiston toiminta olisi varmaa, se on testattava myös oikeassa suoritusympäristössään. 1
Emulaattori Emulaattori on joko kallis itsenäinen erikoislaite, joka korvaa mikro-ohjaimen, tai se voi olla vain liitäntä PC-koneeseen. Kummassakin tapauksessa kohteessa ajetaan emulaattori-ohjelmaa ja samalla kaapataan MCU:n raudasta tietoja. Oikea emulaattori matkii todellista mikro-ohjainta. Emulaattori on simulointia monipuolisempi testausmenetelmä koska simulaattoriohjelma ajetaan PC:ssä, mutta emulaattoriohjelmaa ajetaan oikeassa ympäristössä. Yleensä teollisuuden käyttämät emulaattorit ovat kalliita, mutta JTAGliitännän sisältävät AVR-ohjaimet tarjoavat edullisen tavan oppia emulointia ja samalla, mikä parasta, mikro-ohjaimen toimintaa. USB-JTAG Dongle For Programming and Emulation, tämä on eräs Atmelin JTAG-klooni. PV-M322 Jossa tuo klooni on integroitu ATmega32-opetuskortille. PV-M322-kortilla on apuohjain ATmega16, johon on ohjelmoitu Atmelin tarjoama emulaattoriohjelma. AVRStudio puolestaan pyörii PC-koneessa Windows-ympäristössä ja yhdessä sen ja tuon ATmega16:ssa olevan ohjelman avulla voit tutkia samalla kortilla olevan varsinaisen tutkittavan/opiskeltavan ATmega32-ohjaimessa ajettavan ohjelman etenemistä ja toimintaa. 2
Tai voit asettaa debuggaus-tilanteessa ohjelmaan pysäytyskohtia, breakpoints, jolloin voidaan katsoa mitkä tietyn käskysekvenssin jälkeen ovat rekistereiden ja muuttujien tilat. Asettamalla uusia pysäytyskohtia ja ajamalla koodia uudelleen ja uudelleen kunnes virhe paikantuu. JTAG-emulaattorilla debugatessa kirjoittamaasi koodia ajetaan koko ajan oikeassa mikroohjaimessa, sitä ei siis simuloida. Joten, kun virheet on ensin korjattu, koodi toimii varmasti oikein. Debuggauskoodista Kun lähdekoodista on käännetty ajokelpoinen ohjelma, se pitää vielä saada ladattua AVR:n ohjelmamuistiin. (PC:ssä sitä ei voi ajaa, koska Pentium ei ymmärrä AVR-koodia). Ohjelmointiohjelmat (loaderit, lataajaohjelmat) eivät valitettavasti selviydy lataamisesta ilman lisäohjeita. Siksi tiedosto on laajennettava nuo tarvittavat ohjeet sisältäväksi Intel-hex-formaatissa olevaksi koodiksi. Toimiakseen simu/emulaattorina AVR Studio tarvitsee puolestaan tutkittavasta koodista erikoisen objektitiedoston, joka sisältää - tietoa C-koodin formaatista, kuten C-kielistä lähderivejä vastaavat ohjelmaosoitteet - muuttujien nimet, tyypit ja osoitteet, - funktioiden nimet ja muuta sellaista. C-kääntimet tekevät varsinaisen käännöksen lisäksi lukuisia erilaisia, eri käyttötarkoitukseen tarkoitettuja tiedostoja (riippuen makefile-tiedoston konfiguroinnista). Formaatti Tarkenne Selitys Extended Intel hex *.hex Ajokelpoinen käännöstulos, joka sisältää koodin lisäksi vain tiedot joita tarvitaan kun siirretään koodi AVR:n flash-muistiin. Ei sovi debuggaukseen ELF/DWARF *.elf Tämä on avoimen standardin debuggausinfo, jota AVRStudio lukee. Viimeisin on DWARF2-formaatti, jonka avr-gcc osaa tehdä oikein konfiguroituna. Varmistu, että tämä on käytössä. AVR COFF *.cof Vanha COFF on avoimen standardin debuggaus-formaatti, joka on tarkoitettu työkaluja AVR-ohjaimille tekevien yritysten käyttöön. 3
Emulaattorin käyttö Emulointi-työkalulla ajetaan tutkittavaa ohjelmaa oikeassa ympäristössä ja selvitetään ohjelman toimintaa ja etsitään ohjelmavirheitä. Jos virheitä löytyy, ne poistetaan/korjataan. Kaikki eri toiminnot on valittavissa pikakuvakkeilla tai alasvetovalikosta. Tällä pikaohjeella pääsee mainiosti alkuun. AVRStudio sisältää erittäin perusteelliset ohjeet, Helpit, joihin tutustumalla ohjelmasta saa oivan työkalun AVR-ohjelmien kehitystyöhön. Käsky Kuvaus Funktio Start Aloitetaan debuggaus. Debugging Run Ohjelman ajo. F5 Ajo jatkuu kunnes käyttäjä pysäyttää sen tai saavutetaan breakpoint. Break Lopettaa tai keskeyttää ohjelman ajon. Sen voi tehdä milloin vain CTRL + F5 kesken ohjelman ajon. Kun ajo keskeytynyt, infoikkunoiden data päivitetään. Reset AVR:n resetointi. Shift + F5 Show next Statement Asettaa keltaisen nuolimerkin, marker, ohjelmariville joka seuraavaksi suoritetaan. Vastaa ohjelmalaskurin arvoa. Step Into Ohjelman ajo askeleittain (Single Stepping) Step Over Step Out Jos olet lähdekoodimodessa, source code mode, ajetaan yksi rivi. Step into suorittaa vain yhden käskyrivin kerrallaan. Rivin suorituksen jälkeen infoikkunoiden data päivitetään. Painele F11 ja joka painalluksen jälkeen tarkkaile ikkunoissa olevien muuttujien, rekistereiden, ym. arvoja ja vertaa niitä ohjelman lähdekoodin käskyihin. Ajetaan yksi käsky. Jos käsky on funktiokutsu, ajetaan koko funktio läpi, joten saadaan illuusio kuin se olisi yksi käsky. Ajetaan käskyjä funktion sisällä kunnes funktio on valmis, complete, tai saavutetaan breakpoint. F11 F10 Shift + F11 Run to Cursor Auto Step Animoitu ajo Ajetaan koodia kunnes saavutetaan käskyrivi jossa kursori on. Jos sitä ennen vastaan tulee breakpoint, se ohitetaan ja jatketaan kunnes kursori tavoitettaan. Ajetaan käsky kerrallaan kunnes saavutetaan breakpoint tai käyttäjä antaa break-käskyn. Kaikkien ikkunoiden info päivitetään joka käskyn jälkeen. CTRL + F10 ALT+ F5 Käynnistä viimeistään tässä vaiheessa malliprojekti, Pemu.aps tai joku muu omatekoinen koodi. 4
Pysäytyskohdat, Breakpoints Debuggereitten tärkeimpiä ominaisuuksia on breakpoints-asetus, pysäytyskohdat. Ohjelman ajo aloitetaan alusta ja se keskeytyy pysäytyskohtaan. Tämän jälkeen voit katsella, mitkä ovat rekisterien ja muuttujien ym. arvot ja päätellä, onko ohjelma toiminut tähän asti oikein. Ellei, keskeytyskohtaa on siirrettävä alkuun päin. Jos taas kaikki on ok, tästä voi jatkaa joko asettamalla uuden keskeytyskohdan edemmäksi tai voi olla viisasta jatkaa yksittäisillä käskyillä. Keskeytyskohdan asetus: Siirrä kursori halutulle riville ja paina F9 tai klikkaa pikakuvaketta. Lähdekoodi-ikkunan vasempaan laitaan ko. rivin alkuun tulee punainen ympyrä merkiksi pysäytyskohdasta. Resetoi ohjelma; Debug, Reset. Keltainen kursorinuoli menee riville DDRB = 0xFF; Käynnistä ohjelma painamalla F5-näppäintä. Ohjelma käy hetken ja pysähtyy em. riville. Resetoi ohjelma, aja yksittäisellä käskyllä pari riviä eteenpäin niin, että Watches-ikkunan muuttujien arvot asettuvat ja tee sama F5 uudelleen. Toista muutaman kerran. debugger Ajonaikaisten virheiden jäljitykseen ja korjailuun tarkoitettu ohjelma. bug On ohjelmassa oleva virhe. Pieni ötökkä (hyönteinen), joka aiheutti häiriöitä ensimmäisissä tietokoneissa jäätyään releiden kontaktien väliin. Ymmärrä - mitä sulautettu systeemisi tekee - mitä resursseja se käyttää - miten se kommunikoi ulkomaailman kanssa Virheiden korjaaminen on helpompaa kuin niiden löytäminen. 5
Vinkkejä emulaattorin käytöstä Start Debugging Avataan projektitiedosto ja käynnistetään debuggaustoiminto. Avataan halutut infoikkunat (Watch, Memory etc.) ja askelletaan C-koodia käsky kerrallaan (F11). Debug, Start debugging, tällä aloitetaan ja samalla tarvittavat valikot aktivoituvat. Program Counter, ohjelmalaskuri on rekisteri, joka osoittaa osoitteeseen jossa on seuraavaksi ajettava konekoodin käsky. Resetissä tuo osoite on nolla, jossa sii on oltava ohjelman ensimmäinen käsky. Ennen varsinaista omatekemää koodia, joka alkaa main-funktiossa, ajetaan ns. start-up-tiedosto, jossa tehdään ohjelman alkuasetuksia (mm. pino-osoitin, Stack Pointer). Sen käännin sijoittaa koodin alkuun automaattisesti. Suoritettavaa C-koodin käskyriviä osoittaa keltainen nuoli koodirivin vasemmassa laidassa, katso seuraava kuva. Aivan debuggauksen alussa se osoittaa riviä main-funktion alussa, mutta tässä vaiheessa ohjelmalaskuri on jo osoitteessa 0x49. Se on siis jo ajanut start-upin. Muuttujien katselu, View, watch Kun debugataan C-koodia, aina tarvitaan tietoa muuttujista. Siirrä kursori Watch-ikkunan Name-ruutuun ja valitse hiiren oikealla Add Item, kirjoita ruutuun muuttujan nimi. tai, klikkaa luku-muuttujaa ja raahaa se hiirellä view-ikkunaan. tai, maalaa koodissa muuttuja, klikkaa hiiren oikealla ja valitse avautuvasta valikosta Add to watch. Kun ajo stopataan, muuttujat päivitetään automaattisesti. 6
Memory, Muisti - koodi on flash-muistissa, - muuttujat SRAMmissa (pääosin), - I/O-rekisterit on mapattu I/O-muistialueelle, - ja vielä on EEPROM. Kaikki päivitetään kuten edellä on käynyt ilmi. Debugatessa pitää optimointi ottaa pois päältä, jos suinkin mahdollista. Tällöin ohjelman kulun seuraaminen on helpompaa. Optimointi esim. nopeuttaa koodia jättämällä muuttujan arvot rekisteriin eikä kirjoita niitä takaisin muistiin ja tämä saattaa tuottaa virheellisiä tulkintoja ohjelman kulusta. Muista myös C-käännin tekee esim. for-silmukat nollasta n:nään väärinpäin. Eli: vaikka kirjoittamasi koodisilmukka lähtee nollasta eteenpäin kohti loppuarvoa n, näyttää debuggeri arvoa n. PV-LEDIT Simulaattorin ja emulaattorin lisäksi testauksessa käytettäviä työkaluja ovat mm. logiikkaanalysaattori ja oskilloskooppi. Halvin testeri on oikein käytettynä PV-LEDIT-moduuli. Seuraavista vinkeistä saattaa virheiden etsinnässä olla apua Sulautettujen ohjelmakehitys tehdään PC-ympäristössä, mutta testaus tehdään oikeassa sulautetun laitteessa. Koodin perusajo voidaan kokeilla PC:ssä pyörivässä AVRStudion simulaattorissa. Se mahdollistaa rajoitetun testauksen. Emulointi tapahtuu ajamalla koodia oikeassa ympäristössä, siis PV-M322-kortissa ja debuggaus tapahtuu JTAG-testiliitännän kautta AVRStudiossa. Käännösaikaiset virheet C-käännösprosessi on hyvin monimutkainen, jossa voi ilmetä monenlaisia virheitä. Esikäännin työstää direktiivit, laajennetaan makrot, luetaan mukaan header- ja muut tiedostot jne. Tässä vaiheessa esiintyvät useimmat virheet. Jos koodi ei käänny, virheen löytäminen on kohtuullisen helppoa. Seuraa vain kääntimen virheilmoituksia. Vaikka koodi kääntyy, se ei vielä takaa koodin oikeellisuutta. Kääntyminen kertoo vain että kielioppivirheet puuttuvat. Ajonaikaiset virheet Tähän vaiheeseen tultaessa käännösvirheet on onnistuneesti korjattu. Ajonaikaiset virheet ovat yleensä aika vaikeita selvittää. Ohjelma toimii, mutta aikaansaa vääriä tuloksia tai tekee outoja ja odottamattomia asioita. Olet voinut unohtaa jotain, joku määritys puuttuu tai on väärä. Jos koodin ajo kaataa ohjelman, silloin on yleensä edessä vaikeampi selvitystyö. 7
1. Työstä yksi asia kerrallaan Korjaa yksi vika kerrallaan ja aloita aina ensimmäisestä virheilmoituksen virheestä. Kun ok, seuraava jne. Ei milloinkaan yhtä muutosta enempää yht aikaa. 2. Moduloi Kun ohjelman koko kasvaa, jaa se pienempiin osiin. Niistä vika löytyy helpommin. 3. Yksinkertaista. KISS, keep it simpple, s. Kirjoita vain yksi käsky per rivi. Ei monimutkaisia komentoja. Mitä luettavampaa koodi on, sitä helpommin virheet löytyvät. Koodi toimimaan, eikä näyttöä kavereille kuinka eteviä ollaan. 4. Puhumalla Yksi parhaita tapoja löytää bugit, on näyttää koodia kavereille. Isoissa taloissa koodit auditoidaan, eli koodaaja kertoo mitä koodi missäkin kohdassa tekee ja toiset kaverit yhdessä käyvät sitä läpi. 5. Aseta breakspoints Jos pitää esim varmistua käykö koodi juuri tietyssä funktiossa, aseta stoppi tuohon funktioon. Tai tulosta jossain tietyssä vaiheessa muuttujan arvo. return(), exit() 6. Monitoroi muuttujat Käytä PV-LEDIT-moduulia, joka on halvin debuggaustyökalu. Jos käytössä on LCD-näyttö tai PC:n monitori, voit käyttää printf(). 7. Dokumentoi Dokumentoidessa joudut ajattelemaan asiaa perusteellisesti, tällöin saattaa jokin vikatilanne aueta. 8. Lue lisää kirjoja ja muita dokumentteja Tai kirjoita itse ;>) Perehdy aiheeseen, myös sen elektroniikkaan. Lue Atmelin AVR-dokumenttia. 8