Sida 1 av 2
Hjälp med BASCOM-AVR
Postat: 30 april 2009, 15:34:32
av greyneon
Jag behöver hjälp med en fråga jag tänkt på ett tag nu.
kan jag skriva call point() inne i sub point()?
jag har inte testat än ifall det skulle resultera i en infinity loop...
Re: Hjälp med BASCOM-AVR
Postat: 30 april 2009, 15:45:09
av bos
Jag har aldrig använt BASCOM, men det verkar som du vill rekursera. Inget fel i det, men se till att du tänkt igenom funktionen ordentligt och att du har ett villkor som avslutar rekursionen. Annars kan det ge ganska konstiga resultat.
Och även om det skulle bli en oändlig loop av det är det väl inte hela världen? Bara skriva om koden och programmera om kretsen.
Re: Hjälp med BASCOM-AVR
Postat: 30 april 2009, 22:56:13
av jesse
Om det upprepas för många gånger så kommer väl ramminnet att fyllas av returadresser på stacken? dvs totalkrasch ganska snart? Funkar ju ofta när man har en dator med obegränsat (flera megabyte) ramminne, men inte nära man har några hundra bytes att leka med.
Re: Hjälp med BASCOM-AVR
Postat: 1 maj 2009, 00:30:14
av bos
> ...kommer väl ramminnet att fyllas av returadresser på stacken?
Är det där en gissning eller fakta?
Re: Hjälp med BASCOM-AVR
Postat: 1 maj 2009, 01:00:00
av sodjan
Det verkar vara en väldigt bra gissning som med stor sannolikhet är fakta.
I princip måste alla rekursiva anrop fungera så, på ett ungefär.
En mycket intressantare (och den viktiga) frågan är vad
greyneon igentligen vill uppnå. Varför frågar greyneon om
rekursiva anrop över huvudtaget ?
Re: Hjälp med BASCOM-AVR
Postat: 1 maj 2009, 01:03:31
av bearing
Vid varje call läggs returaddressen på stacken. I en PIC16 har stacken åtta fasta nivåer. I en AVR används RAM för stacken. Vanligt är att stacken byggs från slutet av RAM. Jag vet inte om stackens storlek går att begränsa, men om den är obegränsad kommer den till slut växa in i utrymmen där variabler finns, och om det inte räcker för krasch så kommer antagligen stackpekaren nå 0 och slå runt (om det inte finns hårdvara som förhindrar det).
Re: Hjälp med BASCOM-AVR
Postat: 1 maj 2009, 01:06:14
av bos
Call-stacken på en PIC12 är en åtta nivåer djup och cirkulär buffer, vilket innebär att om man gör nio call:s så kommer returadressen på den första call:en att skrivas över. Gör man 16 calls blir stackens adresser överskrivna två gånger. RAM-minnet rörs inte alls, och det var därför jag undrade om det var fakta det handlade om.
Om det är fakta, att en AVR skriver över RAM-minnet bara för att man överskrider call-stacken, så tänker då iallafall jag aldrig ta i dem med tång ens.
Re: Hjälp med BASCOM-AVR
Postat: 1 maj 2009, 01:07:35
av bos
Äsch, bearing hann före

Fast där fick jag till slut svar på min fråga.
Re: Hjälp med BASCOM-AVR
Postat: 1 maj 2009, 01:08:27
av sodjan
> I en PIC16 har stacken åtta fasta nivåer....
Om inte kompilatorn implementerar en mjukvarustack.
Men det har ingen principiell betydelse för eventuella
stack problem vid rekursiva anrop. Grundfrågan är
fortfarande "Varför?". Vad är problemet som ska lösas ?
Re: Hjälp med BASCOM-AVR
Postat: 1 maj 2009, 01:13:27
av sodjan
Nu så gällde ju frågan just AVR, men...
> Call-stacken på en PIC12 är en åtta nivåer djup,,,
Gäller nyare PIC12, äldre PIC12 är "base-line" och har inte 8 nivåer.
> ... och cirkulär buffer.
Nyare PIC's har både stack overflow och underflow traps.
Jag tror även att MPSIM larmar för stack-problem för dagens PICs.
Re: Hjälp med BASCOM-AVR
Postat: 1 maj 2009, 01:37:27
av jesse
>Om det är fakta, att en AVR skriver över RAM-minnet bara för att man överskrider call-stacken, så tänker då iallafall jag aldrig ta i dem med tång ens.
haha.... så fungerar ju de allra flesta processorer. Stacken ÄR ramminnet. Du väljer själv på vilken adress du ska ha den och hur mycket utrymme du vill ge den. Överskrider du det utrymmet finns det ingen kontroll (inte på de vanliga Attiny och ATmega i alla fall).
Men jag tror det
kan vara värre än så (jag har inte testat): Ramminnet i en AVR delar adressutrymme med alla I/O och alla interna register. Så när du börjar komma ner i låga adresser börjar du skriva på
alla IO-portarna med helt oanade konsekvenser. Processorn kan få riktigt tuppjuck med andra ord.
Rekursiva anrop för att skapa en loop anser jag är dålig programmering. Tyvärr är det väldigt vanligt och finns t.o.m. med i läroböcker om programmering. Men då får man vara jävligt säker på att loopen inte bara är ändlig, utan att den tar slut ganska snart. Dessutom , i vissa högnivåspråk skapar du ett gäng nya lokala variabler för varje anrop viket kan fylla ganska många megabyes ramminne mycket snabbt. Rekommenderas ej. Så jag undrar också - varför vill du göra ett rekursivt anrop?
Re: Hjälp med BASCOM-AVR
Postat: 1 maj 2009, 03:55:05
av bearing
Lösningar med rekursiva funktioner är snygga, när de används på rätt sätt. Alltså när samma problem egentligen inte skulle kunnat lösas på annat sätt, eller att alternativet skulle bli otymplig.
Jag minns bara ett tillfälle då jag använt en rekursiv funktion. Det var en textbaserad kalkylator som förstod parenteser. Funktionen som avkodade texten skickade innehållet i parenteser som argument till sig själv.
Re: Hjälp med BASCOM-AVR
Postat: 1 maj 2009, 11:16:30
av sodjan
> Lösningar med rekursiva funktioner är snygga, när de används på rätt sätt.
Helt rätt.
Jag gjorde så i en C-kod för att "nästla" upp svaret när man hämtar
listan med "kategorier" från Tradera. Det är en struct som i sig innehåller
samma struct i flera nivåer. Fungerar utmärkt. Liknar din text-parser...
Men på en mikrokontroller verkar det lite feltänkt...
Re: Hjälp med BASCOM-AVR
Postat: 2 maj 2009, 16:12:59
av greyneon
tack för alla svar

och att dom kom snabbt
jag håller på med ett poäng system till några spel som jag gjort xD till en 20*4 display (lol?)
men jag löste det med variablar

Re: Hjälp med BASCOM-AVR
Postat: 4 maj 2009, 21:33:32
av Swech
Låter som en bättre lösning

Swech