www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

Frame or software stack overlap

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> AVR, LPC900, x51
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
Domenius
Član
Član



Pridružen-a: Sre 30 Nov 2005 14:15
Prispevkov: 1188
Aktiv.: 5.32
Kraj: Medvode

PrispevekObjavljeno: Sob Mar 11, 2006 6:28 pm    Naslov sporočila:  Frame or software stack overlap Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
Highlag
Član
Član



Pridružen-a: Pet 23 Jan 2004 20:42
Prispevkov: 4034
Aktiv.: 18.08
Kraj: Črnuče

PrispevekObjavljeno: Sob Mar 11, 2006 8:16 pm    Naslov sporočila:   Odgovori s citatom

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 Embarassed

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
Domenius
Član
Član



Pridružen-a: Sre 30 Nov 2005 14:15
Prispevkov: 1188
Aktiv.: 5.32
Kraj: Medvode

PrispevekObjavljeno: Ned Mar 12, 2006 1:50 am    Naslov sporočila:   Odgovori s citatom

Se pravi da moram odstraniti nekaj zank ali moram popraviti strukturo programa?
_________________
It's electric!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
Domenius
Član
Član



Pridružen-a: Sre 30 Nov 2005 14:15
Prispevkov: 1188
Aktiv.: 5.32
Kraj: Medvode

PrispevekObjavljeno: Pon Mar 13, 2006 11:16 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
Sokrat
Član
Član



Pridružen-a: Čet 25 Avg 2005 11:00
Prispevkov: 5584
Aktiv.: 25.03

PrispevekObjavljeno: Pon Mar 13, 2006 11:55 pm    Naslov sporočila:   Odgovori s citatom

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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
Domenius
Član
Član



Pridružen-a: Sre 30 Nov 2005 14:15
Prispevkov: 1188
Aktiv.: 5.32
Kraj: Medvode

PrispevekObjavljeno: Tor Mar 14, 2006 2:23 am    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
vilko
Član
Član



Pridružen-a: Pet 13 Feb 2004 10:26
Prispevkov: 3351
Aktiv.: 15.02
Kraj: Dragomer

PrispevekObjavljeno: Tor Mar 14, 2006 7:09 am    Naslov sporočila:  Gosub Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Highlag
Član
Član



Pridružen-a: Pet 23 Jan 2004 20:42
Prispevkov: 4034
Aktiv.: 18.08
Kraj: Črnuče

PrispevekObjavljeno: Tor Mar 14, 2006 8:30 am    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
Sokrat
Član
Član



Pridružen-a: Čet 25 Avg 2005 11:00
Prispevkov: 5584
Aktiv.: 25.03

PrispevekObjavljeno: Tor Mar 14, 2006 9:48 am    Naslov sporočila:   Odgovori s citatom

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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
jur
Član
Član



Pridružen-a: Pet 02 Dec 2005 14:45
Prispevkov: 5142
Aktiv.: 23.05
Kraj: [color=zelena]Ljubljana[/color]

PrispevekObjavljeno: Tor Mar 14, 2006 10:00 am    Naslov sporočila:   Odgovori s citatom

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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
Silvo
Moderator
Moderator



Pridružen-a: Pon 24 Feb 2003 17:09
Prispevkov: 14557
Aktiv.: 65.24
Kraj: Koroška-okolica Dravograda

PrispevekObjavljeno: Tor Mar 14, 2006 11:22 am    Naslov sporočila:   Odgovori s citatom

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.

Laughing :bonk:

_________________
lp
Silvo
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Domenius
Član
Član



Pridružen-a: Sre 30 Nov 2005 14:15
Prispevkov: 1188
Aktiv.: 5.32
Kraj: Medvode

PrispevekObjavljeno: Tor Mar 14, 2006 11:34 am    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
Domenius
Član
Član



Pridružen-a: Sre 30 Nov 2005 14:15
Prispevkov: 1188
Aktiv.: 5.32
Kraj: Medvode

PrispevekObjavljeno: Tor Mar 14, 2006 1:25 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
Domenius
Član
Član



Pridružen-a: Sre 30 Nov 2005 14:15
Prispevkov: 1188
Aktiv.: 5.32
Kraj: Medvode

PrispevekObjavljeno: Tor Mar 14, 2006 1:47 pm    Naslov sporočila:   Odgovori s citatom

Naložil sem si demo verzijo 1.11.8.1 in je še vedno isto.
_________________
It's electric!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
jur
Član
Član



Pridružen-a: Pet 02 Dec 2005 14:45
Prispevkov: 5142
Aktiv.: 23.05
Kraj: [color=zelena]Ljubljana[/color]

PrispevekObjavljeno: Tor Mar 14, 2006 2:23 pm    Naslov sporočila:   Odgovori s citatom

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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> AVR, LPC900, x51 Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
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