Arduino: Slut på arbetsminne?
Arduino: Slut på arbetsminne?
Hej,
Jag har massor med problem med mitt arduino projekt (fläktkontroller) men det som är mest aktuellt just nu är att den verkar hänga sig när den uppmätta temperaturen når det värde som ska starta pwmstyrning av fläktarna.
Detta märks på 2 sätt, displayen som ska visa värden uppdateras inte så ofta som den ska utan det tar ca 30 ggr så lång tid och fläktarna ändrar inte hastighet baserat på temp som dom ska utan går bara på full fart (vilket dom ska i ca 100ms innan pwm styrningen tar över)
Kan detta bero på brist av arbetsminne och Kan man kolla om det är minnesbrist som är problemet?
Tack!
/Magnus
Jag har massor med problem med mitt arduino projekt (fläktkontroller) men det som är mest aktuellt just nu är att den verkar hänga sig när den uppmätta temperaturen når det värde som ska starta pwmstyrning av fläktarna.
Detta märks på 2 sätt, displayen som ska visa värden uppdateras inte så ofta som den ska utan det tar ca 30 ggr så lång tid och fläktarna ändrar inte hastighet baserat på temp som dom ska utan går bara på full fart (vilket dom ska i ca 100ms innan pwm styrningen tar över)
Kan detta bero på brist av arbetsminne och Kan man kolla om det är minnesbrist som är problemet?
Tack!
/Magnus
Re: Arduino: Slut på arbetsminne?
http://arduino.cc/en/Tutorial/Memory
http://arduino.cc/playground/Code/AvailableMemory
http://www.arduino.cc/cgi-bin/yabb2/YaB ... ;start=all
De kan du ju lika lätt hitta själv, så klart.
Men, det normala när man får "slut på minne" i en microcontroller är inte
att det börjar gå långsamt, utan att det kraschar helt och hållet. Minnes
tilldelningen är (normalt) statiskt f.o.m att man bygger koden i IDE'n och
det borde säga ifrån redan där ifall man har brist på minne (flash eller RAM).
Att köra med dynamisk minnestildening (vilket i och för sig C och C++ har
stöd för) är väldigt ineffektivt på en microcontroller.
Min gissning är att din kod gör så gott den kan, men att den helt enkelt
inte hinner med när fler delar går igång. Du får väl bara fundera på vad
den gör. Det är alltså sannolikt något helt annat problem än minnesbrist.
http://arduino.cc/playground/Code/AvailableMemory
http://www.arduino.cc/cgi-bin/yabb2/YaB ... ;start=all
De kan du ju lika lätt hitta själv, så klart.
Men, det normala när man får "slut på minne" i en microcontroller är inte
att det börjar gå långsamt, utan att det kraschar helt och hållet. Minnes
tilldelningen är (normalt) statiskt f.o.m att man bygger koden i IDE'n och
det borde säga ifrån redan där ifall man har brist på minne (flash eller RAM).
Att köra med dynamisk minnestildening (vilket i och för sig C och C++ har
stöd för) är väldigt ineffektivt på en microcontroller.
Min gissning är att din kod gör så gott den kan, men att den helt enkelt
inte hinner med när fler delar går igång. Du får väl bara fundera på vad
den gör. Det är alltså sannolikt något helt annat problem än minnesbrist.
- PHermansson
- EF Sponsor
- Inlägg: 4340
- Blev medlem: 22 december 2004, 00:46:38
- Ort: Särestad Grästorp
- Kontakt:
Re: Arduino: Slut på arbetsminne?
Låter som att det ligger någon mjukvaru pause/delay rutin i den del av koden som börjar köras när gränsvärdet uppnås. Men som sagt, utan att se koden kan man bara gissa.
Ett annat alternativ kan ju vara att du får en brownout pga av att motorerna börjar dra ström och att uC startar om.
Ett annat alternativ kan ju vara att du får en brownout pga av att motorerna börjar dra ström och att uC startar om.
Re: Arduino: Slut på arbetsminne?
Min kod får ni inte se...
(kan inte komma åt den just nu)
Jag kan inte programmera utan bara fuskar mig fram medans jag försöker lära mig
Men det är säkert någon loop eller delay som ställer till det, ska kolla en gång till i kväll.
Tack!
/Magnus

Jag kan inte programmera utan bara fuskar mig fram medans jag försöker lära mig

Men det är säkert någon loop eller delay som ställer till det, ska kolla en gång till i kväll.
Tack!
/Magnus
- Krille Krokodil
- Inlägg: 4062
- Blev medlem: 9 december 2005, 22:33:11
- Ort: Helsingborg
Re: Arduino: Slut på arbetsminne?
En debugger hade nog varit till bra hjälp för dig, men tyvärr tror jag inte det finns någon som är enkel att sätta upp.
Re: Arduino: Slut på arbetsminne?
Jag gissar på att det är ett matematiskt problem - efter ett tag så slår ett värde i "taket" och fastnar där eller slår om till negativt... med tanke på symtomen så verkar det väldigt troligt. Även om alla variabler håller sig inom sina intervall så kan detta hända i någon beräkning - att ett mellanresultat slår över.
Har du kontrollerat att alla tal håller sig inom gränserna?
EDIT: förklaring:
exempelvis en 16-bitars variabel :
int16_t var;
kan anta värden mellan +32767 och -32768. Men i en beräkning kan mellanresultatet bli större:
var = var*15/32;
här kan inte var vara större än 2184 innan det kraschar.
Det kan givetvis vara andra fel i koden också, men det här är något som många inte alltid tänker på.
Minnet tar nog inte slut om du inte:
a) du har jättestora arrayer med data som fyller minnet.
b) har en rekursiv funktion - dvs. en funktion som anropar sig själv.
c) har väldigt många funktioner som anropas av andra funktioner som anropas av .... osv... Det blir mycket data som ska stoppas på stacken för varje anrop .
Står det inte hur mycket statiskt RAM det "går åt" när du kompilerar koden. Som jämförelse så visar jag "output" från AVR Studio "build":
Har du kontrollerat att alla tal håller sig inom gränserna?
EDIT: förklaring:
exempelvis en 16-bitars variabel :
int16_t var;
kan anta värden mellan +32767 och -32768. Men i en beräkning kan mellanresultatet bli större:
var = var*15/32;
här kan inte var vara större än 2184 innan det kraschar.
Det kan givetvis vara andra fel i koden också, men det här är något som många inte alltid tänker på.
Minnet tar nog inte slut om du inte:
a) du har jättestora arrayer med data som fyller minnet.
b) har en rekursiv funktion - dvs. en funktion som anropar sig själv.
c) har väldigt många funktioner som anropas av andra funktioner som anropas av .... osv... Det blir mycket data som ska stoppas på stacken för varje anrop .
Står det inte hur mycket statiskt RAM det "går åt" när du kompilerar koden. Som jämförelse så visar jag "output" från AVR Studio "build":
13% av minnet är avsett för statiska variabler (bland annat de globala variablerna). Men variabler som skapas i funktioner finns inte med här. Så siffran kan vara missvisande. Men det är ju bara att kolla hur många variabler du använder.------ Build started:
...
AVR Memory Usage
----------------
Device: atmega644
Program: 19094 bytes (29.1% Full)
(.text + .data + .bootloader)
Data: 531 bytes (13.0% Full)
(.data + .bss + .noinit)
EEPROM: 133 bytes (6.5% Full)
(.eeprom)
Build succeeded.
Re: Arduino: Slut på arbetsminne?
> ...att den verkar hänga sig när den uppmätta temperaturen når det värde som ska starta pwmstyrning av fläktarna.
Låter mer som att koden tar oväntade vägar än ett variabel problem.
Men det kan ju bara den som har tillgång till koden veta...
Låter mer som att koden tar oväntade vägar än ett variabel problem.
Men det kan ju bara den som har tillgång till koden veta...

Re: Arduino: Slut på arbetsminne?
Låter som att du använder dig av en mjukvaru pwm som inte är interuptstyrd utan att den låser programmet helt när den används.
Prova att använda de pinnar och funktioner som är dedicerade till den interna hårdvaru pwm modulen.
Vad händer när temperaturen når den nivå där fläktarna ska stängas av?
Prova att använda de pinnar och funktioner som är dedicerade till den interna hårdvaru pwm modulen.
Vad händer när temperaturen når den nivå där fläktarna ska stängas av?
Re: Arduino: Slut på arbetsminne?
Hej.
Nej det är hårdvaru pwm som jag använder.
Tyvärr har jag inte haft tid att grejja mer med detta på ett tag så jag har inte testat något mer.
Tack för tipsen
/Magnus
Nej det är hårdvaru pwm som jag använder.
Tyvärr har jag inte haft tid att grejja mer med detta på ett tag så jag har inte testat något mer.
Tack för tipsen
/Magnus