zaujimavost pri programovani AVR v GCC
Richard Kaliciak
hw.kaliciak@stonline.sk
Úterý Říjen 23 22:17:00 CEST 2007
Dobry den,
ano, kody nie su totozne. Je to raz post a raz preinkrement, ale na
funkciu testu, ci procesor bezi alebo nie, to ale nema vplyv. Zarazilo
ma totiz, ze som najprv nameral toto:
http://freenet-homepage.de/kaliciak/hw/IMG_3924.JPG
a kedze krystal je na 16 MHz, tak mi to nesedelo. Preto som sa pozrel do
*.lss a videl som, ze napriek tomu, ze som counter deklaroval ako
unsigned char, tak sa pouzila 16 bitova premenna. Po uprave zdrojaku som
uz nameral toto:
http://freenet-homepage.de/kaliciak/hw/IMG_3925.JPG
Tu uz sa teoria zhoduje s praxou.
@Petr:
> PORTA = counter++;
>
> Tak ekvivalent je sekvence:
>
> PORTA = counter;
> counter++;
sa prelozi rovnako blbo.
Zaver: ak pises v C, tak sa nezaoberaj prkotinami, v Mega128 je miesta
dost. A ak ti na tom predsa len zalezi, tak si pozri preklad.
(Pri 8051 je napr. cyklus lepsie pisat do {} until( --count );)
Este jedna poznamka ku CodeVision. Mal som verziu z knizky
"Mikrokontrolery Atmel AVR, Programovani v jazyce C" od Bena a pri
programovani DDSky tam bola chyba pri pocitani s float, vyraz
u32 tempfreq;
flash float oktava_dplus = 1.0905077326652576592070106557607;
...
tempfreq = tempfreq * oktava_dplus + 0.5;
vracal casto 0xFFFFFFFF, tak som to musel prepisat na
u32 tempfreq, diff;
flash float oktava_dplus = 0.0905077326652576592070106557607;
...
diff = (tempfreq * oktava_dplus + 0.5);
// pripocitaj 0,5 kvoli zaokruhleniu
tempfreq = tempfreq + diff;
a to uz fungovalo.
Ak ma niekto novsiu verziu CV-AVR, mohol by to prosim vyskusat?
Prave som to vyskusal s avr-gcc a tam to funguje.
Richard Kaliciak
Miroslav Sinko schrieb:
> Tak som sa pohral. Optimalizacie som skusal O1, O2 aj O3 - davaju
> rovnake vysledky, Os (na velkost) nema vplyv.
>
> No na co som prisiel... Kody z prikladov nie su totozne! V druhom
> priklade by bol totozny kod s prvym prikladom takto:
>
> while(1){
> PORTA = counter;
> counter++;
> }
>
> Potom aj vysledny asm je vygenerovany totozne s prvym prikladom (ADIW).
>
> No ale aby to bolo este zaujimavejsie, staci vynechat inicializaciu
> countera a aj v tomto mojom upravenom priklade to potom skompiluje s
> instrukciou SUBI.
>
> 00000092 <main>:
> 92: 8b bb out 0x1b, r24 ; 27
> 94: 8f 5f subi r24, 0xFF ; 255
> 96: fd cf rjmp .-6 ; 0x92 <main>
>
>
> miro
>
Další informace o konferenci Hw-list