2014 m. lapkričio 26 d., trečiadienis

AVR ir asemblerio iššūkis III : rezultatas

Šio svarbaus suasemblerėjimo etapo pabaigoje parodysiu, kaip įrašyti sukompiliuotą HEX failą į mikrovaldiklį, ir pridėsiu porą nelabai kokios kokybės GIF''ų, parodysiančių diodukų mirksėjimo greitį ir jo priklausomybę nuo ciklų skaičiaus.
Ankstesniame straipsnyje esu aprašęs, kaip su avrdude įrašyti sukompiliuotą failą į valdiklį, tai čia kiek kartosis.

Jeigu turite įsidiegę WinAVR programų paketą, avrdude automatiškai bus įdiegta. Pas mane, tarkim, ji yra C:\\WinAVR\\bin\\ kataloge, tačiau katalogo pavadinimas gali skirtis. Avrdude valdoma komandine eilute, kas tik iš pirmo karto atrodo baisu. Vieną kartą parašius komandą ją galima lengvai iškviesti dar kartą paspaudus rodyklės į viršų klavišą, o tai kur kas greičiau, nei grafinėje aplinkoje atidarinėti failą. Be to, avrdude per USBtiny programatorių veikia greičiau, nei per COM ar LPT prievadus (jei kils mintis pasidaryti šį programatorių ir panaudoti jį su USB<>RS232 keitikliu, iškart perspėsiu, kad tie keitikliai neveikia taip, kaip iš jų tikimasi - greitis siaubingai mažas, o siaubingai šiuo atveju - 2kB atminties mikrovaldiklį per keitiklį pavyks užprogramuoti per maždaug 10 minučių, tuo tarpu per USBtiny - per sekundę).
Prie darbo. Kaip ir savaime aišku, jug reiktų atsidaryti komandinę eilutę, o tai padaryti, savaime aišku, galima Start>Run įrašant cmd. Jei jūs nusprendėte dalį savo laiko paaukoti USBtiny konstravimui, ir jei jis tinkamai prijungtas prie mikrovaldiklio, galima bandyti nuskaityti mikrovaldiklio parašą:


Viskas pavyko sėkmingai, programatorius prijungtas tinkamai ir galima į mikrovaldiklį įrašinėti HEX failą. Štai kaip tai atrodo:


Viskas pavyko, programa įrašyta į mikrovaldiklio flash atmintį. Jeigu diodai sujungti tinkamai, turėtumėte pamatyti tokį vaizdelį (tik kiek geresnės kokybės, nes netoli esantys monitoriai ir jų mirgėjimas sugadino visą grožį):

Vaizdelis toks, kad diodai mirksi greitokai. A, mėlyno diodo neturėjau po ranka, tai įsivaizduosim, kad geltonas = mėlynas :) Pabandom programos kode laikinas2 registrui pateikti kitokį skaičių, tarkim, 200. Ir štai, po avrdude įsikišimo vaizdelis sekantis:

Darkart atsiprašau už kokybę, nedažnai GIF''us darau. Kitą kartą pasitaisysiu.
Diodai mirksi kur kas lėčiau. Tiesa, mano mikrovaldiklis veikia 4 Mhz dažniu, tai su tokiais pačiais skaičiais mikrovaldiklis, dirbantis nuo vidinio generatoriaus standartiniu 1MHz dažniu veiks 4 kartus lėčiau.

Tiesa, vakar pamiršau parašyti, tai pridėsiu šiandien.
Mikrovaldikliuose kartais labai svarbus užimamas atminties kiekis, ypač mažuosiuose modeliuose, kai atminties turima tik 2 kB. Todėl programuojant verta sekti, kad neatsirastų dviejų ar daugiau vienas kitą dubliuojančių veiksmų. Vakarykščiame programos tekste tokių yra.
3536373839404142434445464748495051525354
MAIN:      ;pagrindines programos pradzia    sbi  PortB, raudonas ;uzdegamas raudonas diodas   cbi PortB, zalias ;uzgesinamas zalias diodas   cbi PortB, melynas ;uzgesinamas melynas diodas   rcall velinimas    cbi  PortB, raudonas ;uzgesinamas raudonas diodas   sbi PortB, zalias ;uzdegamas zalias diodas   cbi PortB, melynas ;uzgesinamas melynas diodas   rcall velinimas    cbi  PortB, raudonas ;uzgesinamas raudonas diodas   cbi PortB, zalias ;uzgesinamas zalias diodas   sbi PortB, melynas ;uzdegamas melynas diodas   rcall velinimas      rjmp MAIN    ;grizimas i pagrindines programos pradzia
Šiuo atveju nereikalingos 38,44 ir 47 eilutės - diodo užgesinimai dubliuojasi.
Prieš tai kompiliuotos programos rezultatai:

Po besidubliuojančių eilučių ištrynimo:

Sutaupėme 6 baitus, kas tokios apimties programai yra visai nemažai - augant kodui augs ir besidubliuojančių eilučių, kurios naudos ne tik vietą, bet ir procesoriaus resursą.

EKSPERIMENTAS

Pabandčiau parašyti programą C kalba, atliekančią tą patį, t.y. uždeginėjančią paeiliui R, G, B šviesos diodus.  Štai programos kodas - nieko nereikalingo, programą bandžiau daryti veikiančią analogiškai asemblerio kalba parašytai programai.
12345678910111213141516171819202122232425262728293031323334353637383940
#include <avr/io.h> void laukti () { // laukimo paprograme int laikinas1; int laikinas2; int laikinas3; laikinas1=100; while (laikinas1) {  laikinas2=50;  while (laikinas2) {   laikinas3 = 20;   while (laikinas3) {   laikinas3=laikinas3-1;   asm("nop");   }  laikinas2--;   } laikinas1--; } } int main(void) { // pagrindine programa  DDRB=7; PORTB=0; while (1) {  PORTB=1;  laukti(); PORTB=2; laukti(); PORTB=4; laukti(); }  } 
Programą sukompiliavus ir įrašius į mikrovaldiklio atmintį šviesos diodai kaip mirksėjo su asembleriu, taip mirksi su C. Tačiau skirtumas yra.
Atkreipkite dėmesį, kiek užima programa, parašyta ASSEMBLER''iu:


Ir analogiška programa, parašyta C kalba:


Išvada: C kalba parašyta programa, nors ir darydama tą patį, užima dvigubai (!) daugiau vietos. Ir čia tik menkas diodukų pamirksėjimas. Žinoma, didėjant programos kodui skirtumas taps mažesnis. Be to, teisybės vardan turiu pasakyti, kad AVR GCC kompiliatoriaus kodo optimizavimo lygis yr akeičiamas, tai užimamo HEX failo dydis gali būti ir kitos, ko šį kartą nenagrinėsiu.

Berods, tam kartui tiek. Gero programavimo!

Komentarų nėra:

Rašyti komentarą