Sida 1 av 1

Arduino: Slut på arbetsminne?

Postat: 24 augusti 2012, 08:43:39
av lillmange
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

Re: Arduino: Slut på arbetsminne?

Postat: 24 augusti 2012, 09:04:34
av sodjan
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.

Re: Arduino: Slut på arbetsminne?

Postat: 24 augusti 2012, 11:15:39
av PHermansson
Vore intressant att se koden.

Re: Arduino: Slut på arbetsminne?

Postat: 24 augusti 2012, 11:25:07
av H.O
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.

Re: Arduino: Slut på arbetsminne?

Postat: 24 augusti 2012, 15:16:32
av lillmange
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 :oops:

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

Re: Arduino: Slut på arbetsminne?

Postat: 24 augusti 2012, 16:39:04
av Krille Krokodil
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?

Postat: 24 augusti 2012, 16:43:18
av jesse
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":
------ 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.
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.

Re: Arduino: Slut på arbetsminne?

Postat: 24 augusti 2012, 18:02:22
av sodjan
> ...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... :-)

Re: Arduino: Slut på arbetsminne?

Postat: 1 september 2012, 11:00:22
av Helgesson
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?

Re: Arduino: Slut på arbetsminne?

Postat: 4 september 2012, 07:50:38
av lillmange
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

Re: Arduino: Slut på arbetsminne?

Postat: 4 september 2012, 12:50:01
av Helgesson
Posta koden så blir det lättare :)