Pages: [1] 2 3 ... 8   Go Down
Author Topic: Ram+Seriale+Overflow  (Read 7417 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Faraday Member
**
Karma: 45
Posts: 5790
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

sono qui a lamentarmi del fatto che mi ritrovi troppa RAM  smiley

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  smiley
« Last Edit: April 28, 2012, 05:31:13 am by Testato » Logged

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

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 251
Posts: 21277
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Parma
Offline Offline
Edison Member
*
Karma: 20
Posts: 2359
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 120
Posts: 9181
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

sono qui a lamentarmi del fatto che mi ritrovi troppa RAM  smiley

Certo che siete veramente incontentabili  smiley

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.

Logged

0
Offline Offline
Faraday Member
**
Karma: 45
Posts: 5790
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Grazie per lì'interesse,

Ecco lo sketch di test:
Code:

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
Logged

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

Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 527
Posts: 12345
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

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

0
Offline Offline
Faraday Member
**
Karma: 45
Posts: 5790
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

vero, il titolo era palesemente provocatorio.
Credo cmq la soluzione non sia banale, se c'era da fare figuracce sarebbero gia' uscite fuori  smiley
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
Logged

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

Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 527
Posts: 12345
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

vero, il titolo era palesemente provocatorio.
Credo cmq la soluzione non sia banale, se c'era da fare figuracce sarebbero gia' uscite fuori  smiley
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.
Logged

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

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 120
Posts: 9181
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

0
Offline Offline
Faraday Member
**
Karma: 45
Posts: 5790
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Thanks  smiley

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  smiley
Logged

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

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley

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.
Logged


0
Offline Offline
Faraday Member
**
Karma: 45
Posts: 5790
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley
Logged

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

0
Offline Offline
Faraday Member
**
Karma: 45
Posts: 5790
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

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

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged


0
Offline Offline
Faraday Member
**
Karma: 45
Posts: 5790
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 ?
Logged

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

Pages: [1] 2 3 ... 8   Go Up
Jump to: