avr-gcc, atmega128, modulok? [megoldva]

Fórumok

Sziasztok!

Van egy erdekes problema: adott egy ATmega128, egy darab debug leddel (PORTB, 7. biten). (Fejleszto")ko"rnyezet: Debian/wheezy, avr-gcc, avrdude, STK200, /dev/parport. Kovetkezo" tesztprogramot nezzuk:


void blink(void)
{
 PORTB ^= 0x80;
}
int main(void)
{
 int    i;

 DDRB=0x80;
 PORTB=0x00;

 while ( 1 )
  {     for ( i=0 ; i<8 ; i++ )
         {      _delay_loop_2(0);               }
        blink();
  };

 return(0);
}

Ez igy szepen is mukodik, a led villog pont ugyanolyan u"temben, ahogy a delay_loop makro'k szerint azt varjuk (masodpercenkent kb 2-3at, 14.7456-os kvarc mellett).

Namost, ha a programot ke't re't szedju"k, azaz egy main.c modulba a main()-t, es egy blink.c modulba a blink() fuggvenyt, akkor ket dolog lehetseges:
- a fenti formaban a led ma'r nem ugy villog, mas u"temben;
- ha a blink()-et lecsereljuk int blink(void)-ra es a PORTB ^= 0x80; sor utan teszunk me'g egy return(0);-t, akkor _semmit_ nem csinal a program, azaz nem villog a led.

A problemat egy sokkal komplexebb valamibol sikerult ilyen minimalista kodra redukalni, es azalapjan ugy tunik, hogy a modulbol valo visszateres utan/helyett a teljes mikroko'd ujraindul. Mintha kapna egy pofont a kontroller, ha stack-mu"velet van soron.

Latott barki barmi ilyesmit? Van valami, amit erdemes (be)allitgatni ilyenkor? Fuse-bit szeru" dolgokra gondolok, de azok kozott ilyesmit nem talaltam.

Koszi, A.

Hozzászólások

Hm, megoldasra nincs otletem, de nezegetted esetleg a generalt assembly kodot? Hatha kiderul a turpissag...

Én annó a linkelést rontottam el. Linkelésnél is meg kell adni a gcc-nek a -mmcu=atmega128 opciót is. Ellenkező esetben rosszul linkeli a kódot.

Imigy forditottam:


avr-gcc -mmcu=atmega128 -O3 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -c main.c
avr-gcc -mmcu=atmega128 -O3 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -c blink.c
avr-gcc -mmcu=atmega128  main.o blink.o -o ledblink.elf
avr-objcopy -j .text -j .data -O ihex ledblink.elf ledblink.hex
avrdude -P /dev/parport0 -c stk200 -p m128 -U flash:w:ledblink.hex

Oke, megoldva, efuse = 0xff volt... az valamiert kimaradt... igy meg 103-compatible modban maradt a cucc, ahol (ezekszerint) nincs stack.

Van valami, amit erdemes (be)allitgatni ilyenkor? Fuse-bit szeru" dolgokra gondolok, de azok kozott ilyesmit nem talaltam.

ATmega64-nel van egy olyan, hogy "ATmega103 compatibility", vagy valami hasonlo nevu FUSE-bit. Ez a 128-ban is megvan, ha jol nezem az adatlapot... Ha ez be van kapcsolva, az pl. azt eredmenyezi, hogy a RAM vege 256 BYTE-tal visszabb kerul. A stack altalaban meg a RAM vegetol indul. Az alap FUSE beallitasnal ez a kompatibilis mod BE van kapcsolva. Egyszer jartam ezzel porul en is... (Hogy nalad ez e a problema, az jo kerdes, de mindenesetre ez erosen szivatos tud lenni.)

Szerk: tul sokaig irtam a hozzaszolast, ezekszerint tenyleg ez volt a gond. M103 modban van stack, csak a RAM "nem er el addig", ameddig a M128 modban.