Dynamisk minneshantering i AVR?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
gunne
Inlägg: 2088
Blev medlem: 17 juni 2004, 15:00:31
Ort: sthlm
Kontakt:

Dynamisk minneshantering i AVR?

Inlägg av gunne »

En polare till mej frågade hur han ska gå tillväga för att läsa in ett godtyckligt antal värden via USART till en Atmega16. Han skall läsa in x, y, z och lägga i en vektor.

Jag kom på att jag inte har nån aning om ifall man kan använda dynamisk minneshantering i AVRstudio/gcc som jag tror han använder. Kan man det? Hur löser man det annars?

Han vill alltså läsa in:

x, y, z
x, y, z
x, y, z
...
...
..

ett ospeciferat antal gånger.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Antalet värden kanske det är "ospecificerat", men det måste
rimligtsvis finnas ett *max* antal värden. Börja med att välja
en processor med tillräckligt med minne för detta antal.

Sen vet jag inte vad som är problemet !?
Bara att definiera en buffert som klarar *max* antal värden, och börja läsa in...
Användarvisningsbild
gunne
Inlägg: 2088
Blev medlem: 17 juni 2004, 15:00:31
Ort: sthlm
Kontakt:

Inlägg av gunne »

A, psis. Om man har definierat ett maxvärde. Men frågan var ju om man i AVR/C kan använda dynamisk minnesallokering och på så sätt ha ett godtyckligt antal värden.
Användarvisningsbild
AndLi
Inlägg: 18339
Blev medlem: 11 februari 2004, 18:17:59
Ort: Knivsta
Kontakt:

Inlägg av AndLi »

Minnet i AVR kommer ju ta slut vid ett läge, fram till det händer så kan den ha ett godtyckligt antal värden lagrade. Om du allkoerar en statisk strukt eller om du skriver en malloc funktion för att du även behöver minnet till annat kommer inte leda till att max antal värden du kan lagra växer.
Användarvisningsbild
vfr
EF Sponsor
Inlägg: 3515
Blev medlem: 31 mars 2005, 17:55:45
Ort: Kungsbacka

Inlägg av vfr »

Rent generellt så är dynamisk minneshantering inte så lyckad i en mikrokontroller. Du har oftast begränsat med minne och ingen swap att nyttja så du måste ändå begränsa dig beroende på mängden minne.

I vissa fall skulle det kunna vara bra att ha ändå. Om man har en viss mängd minne men vill kunna använda det till x antal av objekt A eller y antal av objekt B etc. Men fortfarande måste man på något sätt hålla koll på hur mycket utrymme det tar.

Om GCC stöder det rent programmatiskt i mikrokontrollers, vet jag inte.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Är det inte ganska inneffektivt att försöka köra med helt dynamisk
allokering vid runtime på en mikrokontroller. Man har i alla fall så
pass "dåligt" med minne att man nog får försöka tänka till lite själv
istället...

> Om man har definierat ett maxvärde.

Det är inget *om*, det *måste* man i princip göra...
Användarvisningsbild
gunne
Inlägg: 2088
Blev medlem: 17 juni 2004, 15:00:31
Ort: sthlm
Kontakt:

Inlägg av gunne »

Hehe, av alla svar att döma så är det inte rekomenderat att köra dynamiskt på en AVR. Tackar för snabba svar, dock blev jag inte speciellt mkt klokare. Men rekomendationen till polarn blir iaf att sätta ett maxvärde, det var det jag sa till honom från början oxå...
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> dock blev jag inte speciellt mkt klokare.

Jasså ? Vad var det som var oklart ?

Jag förstår inte riktigt problemet, ingen "dynamisk minneshantering" i världen
kan få in dubbelt så många värden som det finns minne till.

Sen är det naturligtsvis så att man inte bara kan sätta ett maxvärde
lite hur som helst, dels måste det passa applikationen, dels måste det
finnas (väljas) en processor som matchar kraven. Ibland kan man låta
applikationen styra valet av processor, ibland är det tvärt om. Det är en
del av designprocessen. Man får alltså sitta med "Line Card" över
tillgängliga processorer samtidigt som man funderar på hur applikationen
ska se ut. Försöker man designa en applikation utan att ta hänsyn till
processorerna blir det ofta pannkaka... :-)
bearing
Inlägg: 11677
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Inlägg av bearing »

Om compilatorn är ANSI C måste väl malloc() finnas?
Du/han kan ju enkelt prova att kompilera en kod som innehåller malloc().
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Kanske, men det är inte poängen !

Utan att veta vilket *MAX* antal värden man kommer att
hantera kan man inte välja processor (d.v.s m.a.p minnesstorlek)...

Jag kan inte riktigt se behovet av malloc() i en PIC/AVR kompilator.

Så varför testa ??
Och i så fall, varfär testa genom att skriva kod ??
RTFM till kompilatorn lär räcka ganska långt...
bearing
Inlägg: 11677
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Inlägg av bearing »

Jag håller med dig. I det här fallet ser inte jag heller någon fördel med dynamisk minneshantering. Men i vfr:s exempel ser jag fördel.

Testa kan ju vara enklare än att hitta och sedan läsa manual. Men du har rätt, är nog bättre att först läsa manualen.
Användarvisningsbild
Icecap
Inlägg: 26662
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Dynamisk minneshantering är bra till mycket men precis som sodjan påpekar kan man inte, hur dynamisk minneshantering man än har, peta in 10KB på 2KB minne!

Är det så att man löser olika uppgifter och behöver minnet till antingen det ena eller det andra är det bra med att kunna allokera om minnet.

Så fakta kvarstår: Det går fint att ladda in ett antal värden.... till en viss gräns, sedan är det stopp. Om man ändå vill ladda in får man ta till en ring-buffer vilket i sin tur betyder att de sista talen kommer att bli överskrivna. På det vis kan man ladda in oändliga mängder data men man har bara det senaste X antal i minnet.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Eller *göra* något med värderna, summera, beräkna medelvärde eller
liknande, innan de försvinner ur bufferten. :-)
Användarvisningsbild
gunne
Inlägg: 2088
Blev medlem: 17 juni 2004, 15:00:31
Ort: sthlm
Kontakt:

Inlägg av gunne »

Dumt av mej att fråga "hur gör man annars?" när jag egentligen visste det... :lol:

Men det där med ringbuffer skulle kunna funka i hans fall då han ska läsa in massa data som sen skall styra en CNC. Då gör det ju inget om man skriver över de första koordinaterna när man har använt dom.

Jag tror iof att han har så pass lite data att allt får plats i minnet, men jag vet inte något om hans projekt egentligen.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Aha !
Så det är det det ska användas till...

Ja då är det ju bara att bestämma en buffertstorlek i AVR'en samt
ett lämpligt protokoll mot det överordnade systemet så att dataströmmen
kan styras från AVR'en, vilket i sig naturligtsvis är beroende på hur snabbt
CNC maskinen utför de olika kommandona...

En ring buffert med två pekare, en som pekar på nästa kommando för CNC
maskinen, och en som pekar där nästa kommando från det överordnade
systemet ska lagras. Sedan en räknare som håller reda på hur många
kommandon bufferten innehåller. Varje gång ett kommando utförs av CNC
maskinen räknas räknaren ner med ett (och pekaren flyttas), och varje
gång ett kommando kommer från det överordnade systemet räknas
räknaren upp (och *den* pakeren flyttas).

När ett kommando läggs in kollas om den övre gränsen för bufferten är
uppnåd, då skickas "stopp" till det överordnade systemet.

När ett kommando skickas till CNC maskinen kollas om den undre
gränsen är uppnåd, då skickas "start" till det överordnade systemet.

Var de två gränserna ska sättas är antingen uppenbart för den som
känner till miljön, eller får provas fram.

Alternativet är att CNC maskinen och det överordnade systemet har en
annan kommunikationskanal där start/stop kan skickas...

*Eller* att man räknar med att kunna lagra *hela* det aktuella CNC
"progrmmat" lokalt i AVR'en...
Skriv svar