avr-gcc
Nagy Endre
gumo at lucifer.kgt.bme.hu
Wed May 7 12:02:27 CEST 2003
> Egy megjegyzes: 800000 nagyobb, mint 65535, a legnagyobb 16-bites unsigned
> integer. Probald meg ezt:
> #define CLK 8000000L
> valamint ezt:
> for(i=(uint16_t)(CLK/320L);i;i--)
Eredetileg 8000000L es 320 volt irva, debuggolas kozben
szedegettem/rakosgattam az L-et, hogy ugy mit csinal. Semmit nem
valtoztat, a gcc magatol is 32 biten kezeli, meg L-lel is.
> Talan segit. Ettol meg nekem is code-gen problemanak lattszik, de a te
> programod se hibatlan.
Akkor irok egy jobbat:
int main(void) {
unsigned int i,j;
for(j=500;j;j--) {
for(i=25000;i;i--) {}
}
return 0;
}
Ez a legegyszerubb program, ami kihozza a hibat (i-- helyett i-=25-ot
gondol a gcc, ha i kezdeti erteke kisebb 32768-nal es i-nek mar nem marad
16 bites regiszter.)
> Es meg valami: nem illik ilyen idozitest csinalni C-ben. Amint bekapcsolod az
Tudom :) De ez csak egy hello world volt, elsore timerek nelkul. Nem baj,
hogy nem mukodik, de azert eleg erdekes hibat hozott elo.
> optimalizalast, az egeszbol semmi sem marad. Az ilyet leginkabb assembly-ben
> erdemes megirni, de legalabb tedd a kovetkezot:
-O2-ig az ures ciklus nem optimalizalodhat ki.
Azota mar megirtam az osszes periferiakezelest, a megszakitasokat,
buffereket, es a keslelteto fuggvenyeket. Ket kivetellel timerrel
mukodnek, a kivetel az 1 es 4 orajelnyi kesleltetes:
#define nop() __asm__ __volatile__ ("nop" ::)
volatile void sdelay(void) {}
Utobbi gyakorlatilag egy sima ret utasitasra fordul, de a fordito szamara
a volatile miatt nem lehet inline, azaz meg kell hivni. Hivassal egyutt
igy pont 4 orajel.
> Ettol talan mar megremul a fordito annyira, hogy nem optimalizalja a
> fuggvenyt tovabb.
Ha hazamegyek, kiprobalom az i-n a volatile-t, kivancsi leszek...
De szerintem nem ezen mulik a 25-os kivonas.
Gumo
More information about the Elektro
mailing list