Zacyklená funkce - v simulátoru funguje, po zavolání zamrzne

Ahoj. Doufam, ze by mi nekdo byl schopny poradit s mim problemem. Kdyz v programu nepouziji zadnou funkci, tak program jede solehlive, ale jakmile dam uplne ten sami kod do funkce a tu pak zavolam, tak uz neni schopny se dokoncit v procesoru a nekde uvazne. viz program kod DAC_fce. Pouzivam ATmega128, AVR studio 4.16 s winavr.

:arrow_right: administrator: přejmenováno z “Zacyklena funkce”
DAC_fce.txt (3.62 KB)
DAC.txt (3.62 KB)

Žádnou chybu tam nevidím (tedyaž na neohrabanej a dloouhej program - cykly neznáš? :wink:). V simulátoru to chodí.
Jakej máš překladač? AVR Studio má také vyšší verzi (4.18 SP3).

cykly znam. ty jsem take zkousel, typu for a while, ale tez jakoby zamrzal. puvodne sem mel cykly, toto vzniklo az jako testovaci verze, co se tam deje …

to cpila: Mozno som nieco zasadne prehliadol, ale ako moze “nezamrzat” soft v ktorom v main() nie je ziadna nekonecna slucka? :slight_smile:

Teda ak poznas slucky ako moze korektne chodit soft v jednocipaku bez nekonecnej slucky v maine? Co ocakavas ze sa stane po realizacii prikazu return(0); na konci mainu? :slight_smile:

Vzhledem k tomu, že to nemá ani v prvním funkčním programu, nebude to asi ten problém. Ostatně překladač tam tu nekonečnou smyčku stejně doplní.
Aspoň jsem to pochopil tak, že to nevykoná tu funkci.

Ovšem v simulátoru mi to funguje a info o svém překladači nedodal (že má neaktuální verzi AVR Studia už víme, ale to by také nemělo mít na překlad vliv narozdíl od starší verze překladače).

Urcite to nie je problem prekadaca a ani verzie AVRstrudia. To je urcite vsetko v poriadku.

Prekladac slucku naozaj vlozi ale v mojom testovacim sw v nasledovnom tvare:


C

volatile static uint8_t i;

int main(void)
{
i++;
}



ASM

00000052: main
---- pok_slucka.c ---------------------------------------------------------------------------------
7:        {
+00000052:   91800100    LDS       R24,0x0100     Load direct from data space
+00000054:   5F8F        SUBI      R24,0xFF       Subtract immediate
+00000055:   93800100    STS       0x0100,R24     Store direct to data space
9:        }
+00000057:   E080        LDI       R24,0x00       Load immediate
+00000058:   E090        LDI       R25,0x00       Load immediate
+00000059:   9508        RET                      Subroutine return
9:        }
+0000005A:   94F8        CLI                      Global Interrupt Disable
+0000005B:   CFFF        RJMP      PC-0x0000      Relative jump

nekonecna slucka je na adrese 0x5B a je v tvare, ze program stoji na mieste co vyvola dojem, ze zamrzol co aj naozaj spravil.

No a ak sa da na koniec mian() return(0), potom to vyzera nasledovne:




0000004E:   940C005A    JMP       0x0000005A     Jump
+00000050:   940C0000    JMP       0x00000000     Jump
@00000052: main
---- pok_slucka.c ---------------------------------------------------------------------------------
7:        {
+00000052:   91800100    LDS       R24,0x0100     Load direct from data space
+00000054:   5F8F        SUBI      R24,0xFF       Subtract immediate
+00000055:   93800100    STS       0x0100,R24     Store direct to data space
10:       }
+00000057:   E080        LDI       R24,0x00       Load immediate
+00000058:   E090        LDI       R25,0x00       Load immediate
+00000059:   9508        RET                      Subroutine return
10:       }
+0000005A:   94F8        CLI                      Global Interrupt Disable
+0000005B:   CFFF        RJMP      PC-0x0000      Relative jump

Z riadku 0x59 skoci na riadok 0x4E, odtial na 0x5A a hop, uz je v nekonencnej slucke na jednej instrukcii :slight_smile: :slight_smile: :slight_smile:

Pomohlo vlozit do main() nekonecnu slucku?
napriklad


int main(void)
{
    
     while(1) {

     //.... tvoj kod ....


     }

}

Pochybuji, že bylo úmyslem vysílat neustále dokola (kód bez funkce to též nedělá a funguje prý dle požadavků). Podle popisu jen vzal část původního kódu, dal ji do funkce a přestalo to pracovat.

S takovou komunikací to však stejně nemá smysl řešit.