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