avr-gcc, atmega128, modulok? [megoldva]
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.
- Tovább (avr-gcc, atmega128, modulok? [megoldva])
- 4398 megtekintés
