Go Down

Topic: Ram+Seriale+Overflow (Read 9798 times) previous topic - next topic

Testato

Apr 22, 2012, 10:43 am Last Edit: Apr 28, 2012, 12:31 pm by Testato Reason: 1
sono qui a lamentarmi del fatto che mi ritrovi troppa RAM  :)

ditemi dove sbaglio:

invio ad arduino via seriale una stringa di 10 caratteri, quindi 10 byte, cioe' 80 bit giusto ?
Questi 80 bit vanno nella Ram del 328 arduinico

ma se misuro la ram, prima e dopo l'invio della stringa, mi mancano solo 33 bit di ram, invece di 80

Questa e' una cosa buona, ma da dove deriva ?
C'entrano le word ?

Ringrazio in anticipo per eventuali gradite risposte  :)
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

uwefed

Come misuri la RAM? Ci dai il codice? Sei sicuro che la misura della RAm non mangi della RAM?
Non credo che la RAM viene usata in Bit ma in Byte.
Ciao Uwe

flz47655

Posta il codice che hai utilizzato, non è che allochi PRIMA la ram?

astrobeed


sono qui a lamentarmi del fatto che mi ritrovi troppa RAM  :)


Certo che siete veramente incontentabili  :)

Quote

ditemi dove sbaglio:


Come hai misurato la ram ?
Lo sai che durante il run time la memoria utilizzata varia in funzione di quello che fa il programma ?
Un conto è il valore massimo di memoria occupato dal sistema e dalle variabili dichiarate, e un conto è la reale ram in uso durante il funzionamento.


Testato

Grazie per lì'interesse,

Ecco lo sketch di test:
Code: [Select]


extern unsigned int __bss_end;
extern unsigned int __heap_start;
extern void *__brkval;


static int freeMemory()
{
  int free_memory;

  if((int)__brkval == 0)
     free_memory = ((int)&free_memory) - ((int)&__bss_end);
  else
    free_memory = ((int)&free_memory) - ((int)__brkval);

  return free_memory;
}



String x;


void setup ()
{
   Serial.begin(19200);
   
   
}


void loop ()
{
  Serial.println ( freeMemory () );
  delay (1000);


//  x = "";                 // 1823 bit Ram   
//  x = "testato123";  // 1804 bit RAM
 
}


La differenza tra x=vuota ed x=10byte di dati, fa perdere solo 19bit di ram, invece di 80bit
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

Michele Menniti

Test, stiamo mettendo la pazienza di Astro a durissima prova; già me lo immagino con una motosega accesa sullo stile di "Non aprite quel Forum" :smiley-yell: :smiley-yell: :smiley-yell:
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

Testato

vero, il titolo era palesemente provocatorio.
Credo cmq la soluzione non sia banale, se c'era da fare figuracce sarebbero gia' uscite fuori  :)
Tu ne sai niente ? sei daccordo con il mio ragionamento ?
A limite mi sarei aspettato un differenza in eccesso, ma non in difetto.
Visto che la x la tengo nel loop ad ogni ciclo sono sicuro venga caricata
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

Michele Menniti


vero, il titolo era palesemente provocatorio.
Credo cmq la soluzione non sia banale, se c'era da fare figuracce sarebbero gia' uscite fuori  :)
Tu ne sai niente ? sei daccordo con il mio ragionamento ?
A limite mi sarei aspettato un differenza in eccesso, ma non in difetto.
Visto che la x la tengo nel loop ad ogni ciclo sono sicuro venga caricata

Mi pare che la risposta di massima sia già uscita fuori, al di là del tuo giusto ragionamento matematico:

Come hai misurato la ram ?
Lo sai che durante il run time la memoria utilizzata varia in funzione di quello che fa il programma ?
Un conto è il valore massimo di memoria occupato dal sistema e dalle variabili dichiarate, e un conto è la reale ram in uso durante il funzionamento.

Bisogna vedere se il codice che hai postato possa far variare ad Astro questa affermazione, ma non credo.
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

astrobeed


La differenza tra x=vuota ed x=10byte di dati, fa perdere solo 19bit di ram, invece di 80bit


Guarda che il valore ritornato dalla freeMemory sono Byte e non bit, quindi consumi pure di più di quello atteso, il motivo è semplice stai usando una AnsiString invece di una stringa C standard.
Le AnsiString per la loro natura dinamica richiedono più memoria di quelle standard (che vengono predefinite in fase di creazione) e poi la freeRam ti fa vedere tutta la ram in uso, stack e heap compresi che non sono mai fermi ad un valore ben preciso.

Testato

Thanks  :)

in genere lo spazio nelle eeprom viene dichiarato in bit sui datasheet, ad esempio una eeprom da 2k si intende 2000bit.

ero convinto che anche nel caso del 328 fossero bit, invece sono 2000Byte.
OTTIMO, quindi ne ho tantissimissima di ram  :)
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

leo72


in genere lo spazio nelle eeprom viene dichiarato in bit sui datasheet, ad esempio una eeprom da 2k si intende 2000bit.

ero convinto che anche nel caso del 328 fossero bit, invece sono 2000Byte.
OTTIMO, quindi ne ho tantissimissima di ram  :)


No, i "k" sui micro sono ancora usati nella vecchia accezione di "kB", e non di "kiB" (i "kiB" sono spiegati qui). Quindi 2k di SRAM sono 2kB ossia 2048 byte, e non 2000 byte.
Ugualmente 1 kB di EEPROM sono 1024 byte e non 1000 byte.

Testato

questo e' il vecchio casino di byte che fa anche windows quando calcola lo spazio, e' altro discorso, non l'ho messo in conto, grazie cmq dell'approfondimento.
l'importante per me e' sapere che ho dei byte sotto e non dei bit  :)
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

Testato

visto che quindi ho a disposizione mettiamo 1500Byte, e che con il discorso di String (dispendioso come dice Astro) posso forse gestire max un 700B (caratteri) mi chiedevo:

Ma via seriale posso spedire un'unica stringa di 700Byte per poi riceverla e spacchettarla come piu' mi aggrada lato arduino ?
Oppure ci sono dei limiti sulla seriale, tipo inviare massimo tot byte ?

Thanks
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

leo72

Via seriale la spedizione è byte per byte, quindi una stringa verrà sempre spezzettata per l'invio.

Come limite ricordati che la seriale è gestita tramite un buffer software. Tale buffer è di 128 byte sull'IDE 002x e di 64 sull'IDE 1.0. Se riempi quel buffer potresti perdere dei dati. E' uno dei problemi che affligge l'IDE 1.0 e lo sketch ArduinoISP 1.0 che soffre del problema del buffer di dimensioni ridotte.

Testato

sul discorso di invio dei dati su seriale ci sono, ok, giustamente sulla seriale scorrono dei byte, e possono scorrerci 24h/24h

il discorso dell''ide invece non lo seguo almeno nel mio caso, cioe' io l'ide nemmeno lo apro, ho arduino che riceve via seriale.
Dovra' ricevere sta paccottiglia di 700Byte e gestirli, ram permettendo. C'e' sempre un discorso di buffer in questo caso ?
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

Go Up