Pages: [1] 2   Go Down
Author Topic: risparmiare ram  (Read 1627 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Full Member
***
Karma: 1
Posts: 150
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ciao a tutti smiley
io so che ogni volta che faccio scrivere un testo su un lcd utilizzo della ram perchè l'arduino salva quello che devo scrivere su essa.
volevo sapere c'è un modo per evitare ciò?
premetto che non ho la shield per la memory card e non posso neanche comprarla.
posso usare la eeprom? se si come?
grazie smiley
Logged

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

ciao a tutti smiley
io so che ogni volta che faccio scrivere un testo su un lcd utilizzo della ram perchè l'arduino salva quello che devo scrivere su essa.
volevo sapere c'è un modo per evitare ciò?
premetto che non ho la shield per la memory card e non posso neanche comprarla.
E non ti servirebbe neanche a nulla perché dovresti comunque caricare dalla SD i dati nella RAM del microcontrollore.

Quote
posso usare la eeprom? se si come?
grazie smiley
Non ti serve, basta che usi la funzione F() per leggere direttamente dalla Flash le stringhe.
Quindi una stringa scritta con Serial.print("MARIO") o LCD.print("MARIO") diventa Serial.print(F("MARIO")) o LCD.print(F("MARIO"))
Logged


Offline Offline
Full Member
***
Karma: 1
Posts: 150
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ma se allora non serve scriverla prima sulla flash o epprom cosa cambia per la ram l'utilizzo della funzione F() ?
Logged

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

ma se allora non serve scriverla prima sulla flash o epprom cosa cambia per la ram l'utilizzo della funzione F() ?
Che non accetta variabili come argomento ma solo costanti, ne abbiamo già discusso la settimana scorsa, mi pare.
Quindi Serial.print(F(a)) non funziona, non puoi costruire a e poi passarla.
Però per i messaggi standard funziona.

L'alternativa è usare PROGMEM ma anche qui si lavora solo con costanti.
http://www.arduino.cc/playground/Main/PROGMEM
Logged


Offline Offline
Full Member
***
Karma: 1
Posts: 150
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ok grazie mille smiley non avevo capito  smiley-lol
scusa il disturbo smiley
Logged

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

Tutto ciò che deve essere trattato dal programma viene caricato in RAM.
Quindi quando tu fai un Serial.print("Mario") viene creata una stringa in memoria e lì viene copiato il contenuto di "Mario" che è nel programma utente memorizzato in Flash. Ricapitoliamo: riservo una porzione di RAM; ci copio i dati dalla Flash; dalla RAM li prelevo e li passo alla funzione che li deve usare.

Se le scritte diventano molte, la RAM si esaurisce in breve tempo, perché oltre a queste stringhe essa deve contenere anche lo stack del programma e tutte le altre variabili.

Con F() si usa PROGMEM in modo trasparente per l'utente, PROGMEM istruisce il compilatore ad usare i dati prelevandoli direttamente dalla memoria Flash invece che a ricopiarli prima in RAM. Il rovescio della medaglia è appunto che questi dati devono essere costanti, perché nella Flash non puoi scriverci a runtime (non è del tutto vero, ma prendi quest'affermazione per buona).
Logged


Offline Offline
Full Member
***
Karma: 1
Posts: 150
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ok ti ringrazio ancora smiley
Logged

Camisano Vicentino (VI), Italy
Offline Offline
God Member
*****
Karma: 5
Posts: 953
ƎR like no other.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

oggi in questo topic http://arduino.cc/forum/index.php/topic,135034.0.html era venuto fuori il discorso della dimensione delle variabili, è giusto quello che dico lì? anche quello influisce sulla ram no?
Logged

Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 120
Posts: 9158
"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

è giusto quello che dico lì? anche quello influisce sulla ram no?

Eccome se influisce sull'uso della ram, usare un int dove basta uno char vuol dire utilizzare il doppio della ram necessaria, ancora peggio usare una variabile globale int per indicare un pin, due byte di ram sprecati per nulla quando si può fare con una #define che non usa nemmeno un bit di ram.
Anche nei calcoli serve molto più tempo cpu per fare qualunque operazione aritmetica su un int rispetto ad uno char/byte visto che il 328 è un processore a otto bit.
Logged

Camisano Vicentino (VI), Italy
Offline Offline
God Member
*****
Karma: 5
Posts: 953
ƎR like no other.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

approposito dei define, nel reference c'è scritto che è meglio usare const, ma alla fine è lo stesso no?
Logged

Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

Offline Offline
Sr. Member
****
Karma: 8
Posts: 293
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

approposito dei define, nel reference c'è scritto che è meglio usare const, ma alla fine è lo stesso no?

in c... e quindi spero anche con arduino... il define è visto come una direttiva al precompilatore: in pratica prima ancora di compilare il programma il codice viene "tradotto" o meglio le istanze del define vengono sostituite con il valore in modo letterale. Mentre il const è di fatto trattato come una variabile memorizzata in ram che non viene più sovrascritta.
Penso che il const possa essere più chiaro a livello di codice perchè chiarisce il tipo (int, byte, char eccetera) inoltre il define ha una dichiarazione "un po' più strana" nel senso che per esempio non c'è il ";"... copia proprio di brutto tutto quello che gli metti dentro compresi caratteri non significativi e robe simili...ma io se posso uso il define.
A livello di compilazione io non so bene come si comporta il compilatore arduino ma nei PC venivano tradotti per quanto ho scritto sopra in modo molto diverso perchè per il define faceva un indirizzamento "immediato" mentre il const, dato che accede alla ram, faceva un indirizzamento diretto alla memoria... una cosa tipo
MOV registro, 10 //DEFINE
MOV registro, IndirizzoCostanteInRam  //const
...nei pc la scrittura dalla ram poteva implicare più cicli di clock... però è passato tanto tempo ed arduino ha una architettura differente...
Logged

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

approposito dei define, nel reference c'è scritto che è meglio usare const, ma alla fine è lo stesso no?
Da prove che ho fatto in passato, usare un #define o un const byte per un pin è del tutto equivalente. Il compilatore ottimizza e l'impegno di ram finale dello sketch è identico sia usando la prima che la seconda soluzione.

Su questo sketch:
Code:
#define PIN 13

void setup() {
    pinMode(PIN, OUTPUT);
    digitalWrite(PIN, HIGH);
}

void loop() {
}
avr-size dà il seguente responso: 876 di flash e 9 byte di ram.

Su questo sketch:
Code:
const byte PIN = 13;

void setup() {
    pinMode(PIN, OUTPUT);
    digitalWrite(PIN, HIGH);
}

void loop() {
}
avr-size dà gli stessi identici risultati: 876 byte di flash e 9 byte di ram.

Invece senza specificare "const":
Code:
byte PIN = 13;

void setup() {
    pinMode(PIN, OUTPUT);
    digitalWrite(PIN, HIGH);
}

void loop() {
}
avr-size dice che lo sketch occupa 882 byte di flash e 11 byte di ram.
Logged


Camisano Vicentino (VI), Italy
Offline Offline
God Member
*****
Karma: 5
Posts: 953
ƎR like no other.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

ok grazie delle conferme, magari tra qualche periodo provo anch'io quei programmi di avr che usate voi, sono cose molto interessanti smiley-wink
Logged

Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

Genova
Offline Offline
Faraday Member
**
Karma: 38
Posts: 3245
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

oggi in questo topic http://arduino.cc/forum/index.php/topic,135034.0.html era venuto fuori il discorso della dimensione delle variabili, è giusto quello che dico lì? anche quello influisce sulla ram no?

Veramente li parlavamo di spazio occupato dalla SRAM non RAM dove vengono allocate le variabili a meno che per ram non intendevi sram, che nel caso della UNO è di 2k nella MEGA invece 8k
Logged

no comment

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 120
Posts: 9158
"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

Veramente li parlavamo di spazio occupato dalla SRAM non RAM dove vengono allocate le variabili a meno che per ram non intendevi sram, che nel caso della UNO è di 2k nella MEGA invece 8k

RAM (Random Access Memory) è il termine generico per indicare la memoria di un micro dove puoi sia leggere che scrivere e accedere liberamente ad una qualunque singola cella, SRAM e DRAM sono due termini che identificano la tecnologia della RAM, SRAM = Static RAM, DRAM = Dynamic RAM, però sempre di RAM si tratta e svolge la stessa funzione.
Logged

Pages: [1] 2   Go Up
Jump to: