Pages: [1] 2   Go Down
Author Topic: [Risolto] PROBLEMA IDE O SKETCH AMR ???  (Read 1734 times)
0 Members and 1 Guest are viewing this topic.
Torino (Italy)
Offline Offline
Sr. Member
****
Karma: 0
Posts: 269
Fare insegna a fare.Do teaches how to make.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

 smiley-roll
Un saluto a tutti.

Durante l'upgrade del firmware AMR (Arduo Memory Reminder) ho riscontrato un problema non credo da sottovalutare.

Le versioni che ho postato, la R05i compilata con IDE 0023 e la R05J2 compilata con IDE 1.0.3 non hanno avuto mai problemi di questo tipo.
Non ho fatto alcuna modifica pesante, a parte la prima che ho dovuto abbandonare per mancanza di sram, quando ho cercato di inserire più lingue.

Verificando la nuova release su l' IDE 101, 102, 103 viene generato un bug, che credevo fosse legato allo sketch, ma dubito, a meno che qualcuno mi sappia dare una spiegazione non semplice da trovare.

I limiti della memoria, credo di averli rispettati, anche perchè con l' IDE 0023, non ho mai riscontrato problemi simili.
Al momento ci sono più di 700 byte di sram e più di 17k di flash liberi, anche con sketch più contorto.

Non comprendendo certi comportamenti del dispositivo, ho pulito il codice, semplificandolo sempre più e riducendolo.

Pensavo fosse un problema di sram, poi di stack. (PS: quale è il limite dello stack se c'è ?)

Sono arrivato a pensare che fosse un problema di micro, ma utilizzando un altro arduino uno r3 ho riscontrato lo stesso problema.

Cosa accade: se imposto la costante booleana che nel mio caso è "ablser=1", abilito la seriale e quindi il comando di stampa nel monitor seriale, mi viene visualizzato il valore free della sram che è di 738.

Per assurdo il device funziona correttamente e non visualizza anomalie.

Se imposto la costante booleana "ablser=0", disabilito la seriale e quindi il comando di stampa, credo liberando un bel po' di sram e codice.
Ecco che però si presenta il problema. Durante la visualizzazione degli allarmi, nella descrizione delle medicine, appare il carattere "||" (per intenderci l'OR per il linguaggio C), sia con la selezione della lingua italiana che inglese perchè ????????

Il dispositivo funziona comunque bene, ma se il carattere non si trova in un punto di print, può generare altri problemi.

Grazie per l'attenzione.

Giuseppe G.
« Last Edit: February 01, 2013, 06:18:08 pm by Giuseppe G. » Logged

Un saluto a tutta la comunità.
Giuseppe G.

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 112
Posts: 7126
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Per abilitare e disabilitare la seriale ti conviene usare un define e la macro indef.

Un link alla discussione o al codice sarebbe gradito.
Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

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

Ecco che però si presenta il problema. Durante la visualizzazione degli allarmi, nella descrizione delle medicine, appare il carattere "||" (per intenderci l'OR per il linguaggio C), sia con la selezione della lingua italiana che inglese perchè ????????
Codice...
Logged


Torino (Italy)
Offline Offline
Sr. Member
****
Karma: 0
Posts: 269
Fare insegna a fare.Do teaches how to make.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Scusate ! Ecco il codice.

Ho esegiuto un cambiamento, inserendo una void "VIEWCFGALM" che contiene la visualizzazione delle "MEDicine" alla linea di codice 943 ed il carattere ora mi appare sulla scritta "Suoneria__P||t._2", (linea di codice 698) circa 300 righe di codice prima.

 smiley-kiss

* A_M_R_05K03.ino (46.55 KB - downloaded 16 times.)
Logged

Un saluto a tutta la comunità.
Giuseppe G.

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

Prova come ha detto Paolo, a togliere la seriale con le direttive per il compilatore.
Una semplice variabile non basta, la lib viene caricata ed inizializzata lo stesso perché il compilatore mica può sapere se durante l'esecuzione la seriale la userai oppure no.
Logged


Torino (Italy)
Offline Offline
Sr. Member
****
Karma: 0
Posts: 269
Fare insegna a fare.Do teaches how to make.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ho già provato, addirittura ad escluderla proprio dal codice con //, ma il problema è sempre presente.
Quello che ho creato, è un modo per chi può, di verificare se il problema è del codice o dell'IDE, al di là della modalità di attivazione o meno della seriale.

Vi ricordo che se la seriale viene disabilitata, il problema si presenta, al contrario no. Questo è il problema.  smiley-eek
Logged

Un saluto a tutta la comunità.
Giuseppe G.

Torino (Italy)
Offline Offline
Sr. Member
****
Karma: 0
Posts: 269
Fare insegna a fare.Do teaches how to make.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Per Leo72  smiley-roll
Quote
Una semplice variabile non basta, la lib viene caricata ed inizializzata lo stesso perché il compilatore mica può sapere se durante l'esecuzione la seriale la userai oppure no.

Prova a compilare lo sketch con la variabile "ablser=1" che (abilita) la seriale e poi dimmi qualcosa !!!!!

Non è semplice come sembra ! smiley-kiss

Credo che il compilatore si accorge di questo e altro, come puoi vedere dal codice compilato che cambia di circa 1K.
Logged

Un saluto a tutta la comunità.
Giuseppe G.

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

Per Leo72  smiley-roll
Quote
Una semplice variabile non basta, la lib viene caricata ed inizializzata lo stesso perché il compilatore mica può sapere se durante l'esecuzione la seriale la userai oppure no.

Prova a compilare lo sketch con la variabile "ablser=1" che (abilita) la seriale e poi dimmi qualcosa !!!!!

Non è semplice come sembra ! smiley-kiss

Credo che il compilatore si accorge di questo e altro, come puoi vedere dal codice compilato che cambia di circa 1K.

Code:
byte abilita = 1;

void setup() {
    if (abilita) {
        Serial.begin(9600);
    }
}

void loop() {
    static long contatore = 0;
    contatore++;
    if (abilita) {
        Serial.println(contatore, DEC);
    }
    delay(1000);
}
Compilato, viene 2836 byte.
Se metto "abilita" a 0, la compilazione dà 2836.
Questo per farti capire che il compilatore NON può sapere se nel corso del programma "abilita" cambia valore.

Ora compila questo:
Code:
#define abilita

void setup() {
#ifdef abilita
    Serial.begin(9600);
#endif
}

void loop() {
    static long contatore = 0;
    contatore++;
#ifdef abilita
    Serial.println(contatore, DEC);
#endif
    delay(1000);
}
Compilato, dà 2820 byte.
Se commento la define iniziale, la compilazione mi dà 750 byte! Come vedi, in questo caso la seriale non viene inizializzata.
Logged


0
Offline Offline
Shannon Member
****
Karma: 131
Posts: 10474
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

la seriale usa ram anche se non usatata, ne abbiamo discusso qualche tempo fa con la storia dei buffer.
Essi sono dichiarati alla creazione della classe Serial, che viene creata quando la Serial è inclusa, che è inclusa automaticamente.
Sempre in quella discussione puyoi trovare uno snippet di codice che risolve questo problema: il buffer viene inizializzato nella Begin, però il codice è stato provato come funzionante solo da me, quindi sarà pieno di bug (però funzionare funziona...)

edit: discussione + il codice per aruino ide 1.0.2: http://arduino.cc/forum/index.php/topic,141254.msg1065517.html#msg1065517
« Last Edit: February 01, 2013, 06:04:49 am by lesto » Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Torino (Italy)
Offline Offline
Sr. Member
****
Karma: 0
Posts: 269
Fare insegna a fare.Do teaches how to make.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

 smiley-roll

Intanto grazie per l'interessamento.

x Leo72, non metto in discussione quello che segnali, o sul fatto che quello che dici sia errato.
Vorrei semplicemente farti presente che se compili il mio codice, con la variabile = 1 e poi = 0, ti accorgerai che una "if" non può cambiare così tanto l'assembler per il micro.

x Lesto, il problema non è abilitare o meno la seriale, ma capire perchè quando è abilitata il problema non si presenta, mentre quando è disabilitata, il problema c'è.

Potrei lasciare abilitata la seriale per ovviare il problema, ma credo ci sia qualcosa di non chiaro in tutto questo.

Nel frattempo, ho buttato giù un hardware con un' altro display ed arduino, ma il problema rimane.  smiley-cry
Logged

Un saluto a tutta la comunità.
Giuseppe G.

0
Offline Offline
Shannon Member
****
Karma: 131
Posts: 10474
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ma quel carattere ti compare sull'LCD?

edit: se la variabile è boolean usalal con i valori true e false, altrimenti dichiarala come byte.

Sinceramente ad occhio non vedo che problemi possano sserci, a parte il fatto che la LCD possa usare  senza saperlo delle impostazioni che vengono effettuate nella Serial.begin()....
« Last Edit: February 01, 2013, 10:58:08 am by lesto » Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Torino (Italy)
Offline Offline
Sr. Member
****
Karma: 0
Posts: 269
Fare insegna a fare.Do teaches how to make.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Questo:         ||
come l' OR del linguaggio C.

Ho notato che spostando l'attivazione della seriale "Serial.begin" questo viene spotato in un' altro punto dei messaggi  smiley-eek smiley-eek
Logged

Un saluto a tutta la comunità.
Giuseppe G.

0
Offline Offline
Shannon Member
****
Karma: 131
Posts: 10474
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ho editato il messaggio sopra
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

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

x Leo72, non metto in discussione quello che segnali, o sul fatto che quello che dici sia errato.
Vorrei semplicemente farti presente che se compili il mio codice, con la variabile = 1 e poi = 0, ti accorgerai che una "if" non può cambiare così tanto l'assembler per il micro.
Ti devo fare le mie scuse perché tu hai dichiarato il flag di tipo "const" quindi il compilatore vede che tale variabile non può più essere modificata nel corso dell'esecuzione del programma, ed ottimizza la compilazione escludendo la seriale.
Avevi ragione tu, me ne sono accorto solo ora. Difatti nello sketch che ti ho allegato come esempio dei miei test vedi che non avevo dichiarato il flag come costante.
Logged


Torino (Italy)
Offline Offline
Sr. Member
****
Karma: 0
Posts: 269
Fare insegna a fare.Do teaches how to make.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

 smiley-wink
No problem Leo72.

Tornando al problema "bug", mi sfugge qualcosa....... esistono dei limiti legati al numero di istruzioni "if" consecutive in uno sketch?

E' probabile che questo problema sia venuto fuori solo con l'utilizzo dell'IDE 1.0.3.

Provo a ricompilarlo con lo 0023, togliendo l'audio però, visto che non è supportato, e credo che cambi un pò troppo, e che quindi il problema non si manifesti.

Un' altra cosa che ho constatato è che il carattere "||" per il display non esiste ed ancora se al posto di un carattere alfanumerico inserisco degli spazi, il messaggio viene troncato del tutto da quel carattere in poi.

Alquanto strano no?

Se con la versione IDE 0023 il problema non si manifesta, torno ad usare quella. Eventualmente, ora ho a disposizione un codice di verifica per le nuove versioni dell' IDE.

Un ultima cosa! Se avessi usato una variabile con lo stesso nome già dichiarato nelle librerie, l' IDE si sarebbe accorto, giusto?
Logged

Un saluto a tutta la comunità.
Giuseppe G.

Pages: [1] 2   Go Up
Jump to: