Sida 1 av 1

"stack overflow" i pic-programmering *Löst*

Postat: 8 oktober 2006, 13:03:27
av Cedro
Hej!
Nybörjare på pic-programmering. Har precis (efter mycket slit och databladsläsning!!) fått igång en termometer med en lcd, en 16F84A och en DS18S20. Kändes rätt bra när siffrorna till slut rullade upp på skärmen! :D

Nu till problemet: När programmet börjat växa till fick jag då och då problem med "stack overflow" i MPLAB SIM. Jag kollade i "hardware stack" och där ser allt bra ut, nere på level 5 som mest. Jag läste att det kunde ha att göra med gränser mellan 256-byte block?
Jag flyttade om bland subrutinerna osv och sedan fungerade programmet igen. Nu har jag dock nått en gräns där det inte hjälper hur mycket jag än flyttar runt i koden. Koden är nu 294 byte lång, med 297 linjer i "program memory"-fönstret...
Jag testade också att lägga en lookup table direkt i början av programmet men då fick jag "overflow" på en massa nya ställen...

Något tips?

Postat: 8 oktober 2006, 13:07:20
av Icecap
Jada, massor med tips. Lite besvärligt dock att källkoden inte är tillgängelig...

Sak samma, stack overflow är för att du kallar för många subrutiner eller returnerar för mycket.

Postat: 8 oktober 2006, 16:17:37
av sodjan
> Jag läste att det kunde ha att göra med gränser mellan 256-byte block?

Njae, det tror jag inte.

Är du säker på att du har ett RETURN från alla subrutiner ?
Det är inte *så* ovanligt att man bara försöker med GOTO tillbaka
till main koden...

Postat: 8 oktober 2006, 17:29:23
av Cedro
Tack för snabba svar!

Icecap: Jag misstänkte nästan att det var så. Måste gå igenom koden ordentligt för att se vilka subrutiner jag kan optimera/kombinera.

Sodjan: Det konstiga är ju att jag inte ändrar något i den befintliga koden. Lägger jag bara till några rader kod får jag stack overflow på helt andra ställen...

Jag försöker nämligen få till ytterligare en rad med text på lcd-n, men det verkar ju stört omöjligt! :?

Postat: 8 oktober 2006, 18:40:25
av Cedro
Nu har jag löst problemet.

Jag har nämligen 2 st lookup tabeller som låg långt ner i koden. En av dessa gick över minnesadress 00FF-0100, något som tydligen inte är tillåtet. Detta gjorde att programmet hoppade tillbaka till adress 0001 och fortsatte därifrån, men alltså nere på samma stacknivå som innan. Därför blev det som det blev!

Hoppas någon annan kan ha nytta av inlägget! :)

Postat: 8 oktober 2006, 19:15:24
av sodjan
När du använder instruktioner som t.ex ADDFW mot PCL, så har du bara
tillgång till 8 bitar i instruktionen. Om tabellen går över en 256 byte gräns
så måste manb ta hänsyn till det. Inget större problem, bara att sätta PCLATH
"rätt" innan man gör ADDFW.

Men om man inte vill ha den extra hanteringen (för att t.ex trimma
exekveringstiden) så är det bara att lägga tabellen på en jämn 256
byte gräns. Linkern kommer sedan snyggt att pussla in övrig kod "runt"
tabellerna...

Slutningen en standard fråga... :-)
Varför kör du med en gammal och utgången processor ??