|
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
Domenius Član
Pridružen-a: Sre 30 Nov 2005 14:15 Prispevkov: 1188 Aktiv.: 5.32 Kraj: Medvode
|
Objavljeno: Sob Mar 11, 2006 6:28 pm Naslov sporočila: Frame or software stack overlap |
|
|
Pozdravljeni!
V BascomAVRju pišem program, ki je relativno obširen in dokaj kompleksen. Ima približno 700 programskih vrstic in zasede okrog 6KB (pišem v višjenivojskem jeziku in nikjer nisem vključil assemblerja). Pri simulaciji programa dobim opozorilo "Frame or software stack overlap". Programa še nisem poizkusli zapeči v uK.
Program mi "compile-a" brez napak - opozarja samo pri simulaciji.
Kaj to opozorilo pomeni - da se kaj prekriva oz. kaj podobnega? _________________ It's electric! |
|
Nazaj na vrh |
|
|
Highlag Član
Pridružen-a: Pet 23 Jan 2004 20:42 Prispevkov: 4034 Aktiv.: 18.08 Kraj: Črnuče
|
Objavljeno: Sob Mar 11, 2006 8:16 pm Naslov sporočila: |
|
|
To pomeni, da imaš preveč zank znotraj zank.
Procesorju zmanjka prostora v stack-u za zapis vrednosti PC ko skočiš v novo zanko.
Ko zanko zaključi se ne zna vrniti nazaj.
Takole zelo laično razloženo
Ponavadi v programu manjka kje kašen zaključek zanke. _________________ If at first you don't succeed, destroy all evidence that you tried. |
|
Nazaj na vrh |
|
|
Domenius Član
Pridružen-a: Sre 30 Nov 2005 14:15 Prispevkov: 1188 Aktiv.: 5.32 Kraj: Medvode
|
Objavljeno: Ned Mar 12, 2006 1:50 am Naslov sporočila: |
|
|
Se pravi da moram odstraniti nekaj zank ali moram popraviti strukturo programa? _________________ It's electric! |
|
Nazaj na vrh |
|
|
Domenius Član
Pridružen-a: Sre 30 Nov 2005 14:15 Prispevkov: 1188 Aktiv.: 5.32 Kraj: Medvode
|
Objavljeno: Pon Mar 13, 2006 11:16 pm Naslov sporočila: |
|
|
Večino zank imam "narejeno" z Gosub (potem ko se izvrši podprogram katerega zaključek je ukaz Return, ki se potem vrne za mesto klica podprograma, se pravi za Gosub). Ali bi bilo kaj učinka, če bi Gosub zamenjal z Goto (če je na koncu podprograma napisan ukaz Return skoči na začetek programa in ne za Goto ukaz). Upam da sem dovolj dobro razložil za tiste, ki ne uporabljate Bascoma.
Saj vem da bi lahko to poizkusil če dela - ampak v relativno obširnem programu bi mi vzelo kar nekaj časa, na koncu pa po vsej verjetnosti nebi delovalo. _________________ It's electric! |
|
Nazaj na vrh |
|
|
Sokrat Član
Pridružen-a: Čet 25 Avg 2005 11:00 Prispevkov: 5584 Aktiv.: 25.03
|
Objavljeno: Pon Mar 13, 2006 11:55 pm Naslov sporočila: |
|
|
Ce bi ze zamenjal, potem moras dati goto tudi na konec (kjer je bil prej return), sicer bos naredil zmesnjavo na stacku (return bo poskusal dol pobrati naslov, ki ga ne bo na stacku). Tako se izognes uporabi stacka pri klicu, ker je naslov hardcoded (slovensko ?) ob prevajanju, je pa manj elegantno.
Glede na to, da uporabljas mikrokontroler, ki ima stack v RAMu, se mi zdi zelo nenavadno, da si uspel nacarati toliko globine (ali pa kaksno neumno rekurzijo), da ti stacka zmanjka - to bi pricakoval na kaksnem omejenem mikrokontrolerju z majckenim HW stackom, ti si pa lahko privoscis prakticno ves interni RAM za stack, drzi ? To je recimo 50+ nivojev stacka ... Na tvojem mestu bi pregledal kodo da ugotovis ali res nisi sam naredil kaksne traparije (rekurzivni klici, izpuscen ali odvecen return ali terminacija zanke ali kaj podobnega). |
|
Nazaj na vrh |
|
|
Domenius Član
Pridružen-a: Sre 30 Nov 2005 14:15 Prispevkov: 1188 Aktiv.: 5.32 Kraj: Medvode
|
Objavljeno: Tor Mar 14, 2006 2:23 am Naslov sporočila: |
|
|
Ja tudi meni se zdi to čudno - ATmega8 ima 1KB SRAM-a. Grobo ocenjeno spremenljivke v RAMu zasedejo 50 byte-ov. V programu pa je kakšnih 60 Gosub ukazov - tako veliko jih je zato, ker zelo skrajšajo program oz. mi prihranijo ponavljane kode in s tem omogočijo, da program spravim v 8KB flash (v bistvu zasede 6KB, verzija brez Gosub bi pa sigurno 10KB). Bom pregledal program. _________________ It's electric! |
|
Nazaj na vrh |
|
|
vilko Član
Pridružen-a: Pet 13 Feb 2004 10:26 Prispevkov: 3351 Aktiv.: 15.02 Kraj: Dragomer
|
Objavljeno: Tor Mar 14, 2006 7:09 am Naslov sporočila: Gosub |
|
|
Gosub vzame samo toliko rama, kolikor je potrebno za naslov nazaj. V Bascomu8051 je to dva bajta, v AVR verjetno tudi. Tako ne šparati pri tej instrukciji.
Kaj pa če imaš v klic gosub kako zazankan? recimo da kličeš v enem podprogramu drugega, v drugem pa prvega, potem se gosubi hitro naložijo v neskončnost. Sicer pa je taka napaka precej redka in malo verjetna.
Tudi nisem prav prepričan, da diagnostika, ki jo dobiš pri simulaciji pomeni to. Pri simulaciji si ogleduj StackPointer, tam vidiš, kako se troši stack.
Če uporabljaš prekinitvene rutine, pa le te uporabijo kar precej stack-a. Pri Bascomu8051 po 20 bajtov vsaka.
V diagnostiki se pojavi izraz Frame, ki ne vem kaj pomeni, ker ga v 8051 ne poznam. Kaj pa pravi Help? _________________ Prepričan sem, da je inteligentnih bitij v vesolju veliko. A ker so inteligenta, se nam nočejo prikazati. |
|
Nazaj na vrh |
|
|
Highlag Član
Pridružen-a: Pet 23 Jan 2004 20:42 Prispevkov: 4034 Aktiv.: 18.08 Kraj: Črnuče
|
Objavljeno: Tor Mar 14, 2006 8:30 am Naslov sporočila: |
|
|
Microchip ima vsaj na malih picih omejen stack. 8 nivojev, potem pa dobiš stack overflow. _________________ If at first you don't succeed, destroy all evidence that you tried. |
|
Nazaj na vrh |
|
|
Sokrat Član
Pridružen-a: Čet 25 Avg 2005 11:00 Prispevkov: 5584 Aktiv.: 25.03
|
Objavljeno: Tor Mar 14, 2006 9:48 am Naslov sporočila: |
|
|
Domenius: pari goto/goto namesto gosub/return so funkcionalno enaki (pac ne pospravijo krame na stack in je ne poberejo nazaj dol, ker sta naslova znana vnaprej ze ob programiranju in sta hardcoded v program) in koda zato ne bi bila prav nic daljsa (razen za par bajtov direktnega naslova, podanega pri ukazu goto).
Kot ti je svetoval Vilko, si oglej porabo stacka in poisci napako - temu sluzijo simulatorji.
Ce bos pripel problematicno kodo, bos lazje dobil odgovor kot ce samo ugibamo kaj bi lahko bilo narobe. |
|
Nazaj na vrh |
|
|
jur Član
Pridružen-a: Pet 02 Dec 2005 14:45 Prispevkov: 5142 Aktiv.: 23.05 Kraj: [color=zelena]Ljubljana[/color]
|
Objavljeno: Tor Mar 14, 2006 10:00 am Naslov sporočila: |
|
|
Highlag je napisal/a: |
Microchip ima vsaj na malih picih omejen stack. 8 nivojev, potem pa dobiš stack overflow. |
Nimam priročnika pri roki, ampak zdi se mi, da (vsaj mali pici) ne naredijo overflow, ampak rollover. To je še slabše, ker je vsebina stacka garantirano napačna.
Zakaj je nivo stacka 8 oziroma pod 10? Zato, ker ima človek samo deset prstov, da jih zatakne v listing, ko išče stack overflow.
Jur
Nazadnje urejal/a jur Tor Mar 14, 2006 1:23 pm; skupaj popravljeno 2 krat |
|
Nazaj na vrh |
|
|
Silvo Moderator
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14557 Aktiv.: 65.24 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Tor Mar 14, 2006 11:22 am Naslov sporočila: |
|
|
jur je napisal/a: |
Nimam priročnika pri roki, ampak zdi se mi, da (vsaj mali pici) ne naredijo overflow, ampak rollover. To je še slabše, ker je vsebina stacka garantirano napačna.
|
Drži.
The stack operates as a circular buffer. This means that
after the stack has been PUSHed eight times, the ninth
push overwrites the value that was stored from the first
push. The tenth push overwrites the second push (and
so on).
jur je napisal/a: |
Zakaj je nivo stacka 8 oziroma pod 10? Zato, ker ima človek samo deset prstov, da jih zatakne v listink, ko išče stack overflow.
|
_________________ lp
Silvo |
|
Nazaj na vrh |
|
|
Domenius Član
Pridružen-a: Sre 30 Nov 2005 14:15 Prispevkov: 1188 Aktiv.: 5.32 Kraj: Medvode
|
Objavljeno: Tor Mar 14, 2006 11:34 am Naslov sporočila: |
|
|
Citiram: |
Če uporabljaš prekinitvene rutine, pa le te uporabijo kar precej stack-a. Pri Bascomu8051 po 20 bajtov vsaka.
V diagnostiki se pojavi izraz Frame, ki ne vem kaj pomeni, ker ga v 8051 ne poznam. Kaj pa pravi Help? |
Ne uporabljam prekinitvenih rutin. V Helpu žal ni nič konkretno napisanega. Tudi v data sheetu od ATmega8 nisem našel nič kar bi mi pomagalo. Si bom ogledal Stack pointer.
Citiram: |
Ce bos pripel problematicno kodo, bos lazje dobil odgovor kot ce samo ugibamo kaj bi lahko bilo narobe. |
Žal je ne morem (smem) pripeti, ker je ne pišem zase. _________________ It's electric! |
|
Nazaj na vrh |
|
|
Domenius Član
Pridružen-a: Sre 30 Nov 2005 14:15 Prispevkov: 1188 Aktiv.: 5.32 Kraj: Medvode
|
Objavljeno: Tor Mar 14, 2006 1:25 pm Naslov sporočila: |
|
|
Program sem čisto oklestil. Tudi pri tej enostavni kodi mi BascomAVR kaže opozorilo v vrstici stanja.
Citiram: |
$sim
$regfile = "m8def.dat"
$crystal = 8000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5 , E = Portc.1 , Rs = Portc.0
Config Lcdbus = 4
Cursor Off
Cls
Config Pind.4 = Input
Config Pind.3 = Input
Config Pind.2 = Input
Config Pind.1 = Input
Config Pind.0 = Input
Do
Debounce Pind.2 , 1 , Nacin , Sub
Debounce Pind.4 , 1 , Vecaj , Sub
Debounce Pind.3 , 1 , Manjsaj , Sub
Debounce Pind.1 , 1 , Nacin1 , Sub
Debounce Pind.0 , 1 , Izklop , Sub
Loop
Nacin1:
Return
Nacin:
Return
Vecaj:
Return
Manjsaj:
Return
Izklop:
Return
Izhod:
Return
|
Tudi če imam samo en Debounce - posledično tudi samo en Gosub in Return še vedno opozarja.
In še najbolj okrnjena verzija:
Citiram: |
$sim
$regfile = "m8def.dat"
$crystal = 8000000
Do
Wait 1
Loop |
Tudi ta opozarja. Mogoče kakšen hrošč v programu? Imam demo verzijo BascomAVR 1.11.7.7. _________________ It's electric! |
|
Nazaj na vrh |
|
|
Domenius Član
Pridružen-a: Sre 30 Nov 2005 14:15 Prispevkov: 1188 Aktiv.: 5.32 Kraj: Medvode
|
Objavljeno: Tor Mar 14, 2006 1:47 pm Naslov sporočila: |
|
|
Naložil sem si demo verzijo 1.11.8.1 in je še vedno isto. _________________ It's electric! |
|
Nazaj na vrh |
|
|
jur Član
Pridružen-a: Pet 02 Dec 2005 14:45 Prispevkov: 5142 Aktiv.: 23.05 Kraj: [color=zelena]Ljubljana[/color]
|
Objavljeno: Tor Mar 14, 2006 2:23 pm Naslov sporočila: |
|
|
google na temo bascom avr 'Frame or software stack overlap'
najde nekaj odgovorov. Delček prepisan tule, bi lahko razložil težavo...
Okleščena verzija nedelujočega programa uporablja timer (z interrupti). Gotovo je več kot en PUSH/POP na delu.
Jur
> In the simulator, I get the message that "Stack pointer and software
> stack overlap". Soft Stack pointer is at &H0840 and the HW Stack
> pointer is at &H0859. 32 for harware stack, 8 for soft stack and 16 for
> frame. Apparently the soft stack isn't getting used as the sim reports
> the minumum to be &H0840 with the hardware stack showing a minimum of
> &H083C or 29 bytes of HW stack used. Yes, it certainly is overlapping
:-). |
|
Nazaj na vrh |
|
|
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 80 dni
Powered by phpBB © 2001, 2005 phpBB Group
|