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