Go Down

Topic: Dimensione del file binario dello sketch - arduino impazzito (Read 4728 times) previous topic - next topic

lobo01

La mia configurazione e' arduino uno rev 3 , IDE 1.0.1


Dimensione del file binario dello sketch: 20.758 bytes (su un massimo di 32.256 bytes )

compilando il mio sketch ho ottenuto il risultato sopra riportato ed una volta compilato senza errori e caricato su arduino, questi non funziona più!
Ho letto qualche post , purtroppo in inglese ( che non e' il mio forte ) riguardo un bag sulle dimensioni e sul bootloader.
Infatti togliendo delle librerie ed un sensore con relative istruzioni nello sketch sono sceso sotto la soglia dei 20500 byte circa, e tutto e' tornato a funzionare.

Mi potreste dare qualche suggerimento?

Grazie

leo72

Ti consiglio intanto la lettura di questa guida:
http://www.leonardomiliani.com/?p=572

E poi ti chiedo se nel tuo sketch usi molte variabili di tipo string, ad esempio per stampare su seriale o su LCD.

lobo01


Ti consiglio intanto la lettura di questa guida:
http://www.leonardomiliani.com/?p=572

E poi ti chiedo se nel tuo sketch usi molte variabili di tipo string, ad esempio per stampare su seriale o su LCD.


Ho eseguito la procedura e questo e' il risultato della memoria
" AVR Memory Usage
----------------
Device: Unknown

Program:   20798 bytes
(.text + .data + .bootloader)

Data:       1916 bytes
(.data + .bss + .noinit) "

Ma non uso molto il comando per stampare essendo un controllo per la domotica
non uso il monitor seriale ne il display LCD.......



lobo01

:smiley-roll-sweat:

Volevo aggiungere che anche epurando lo sketch....20480 byte caricati....il sistema e' instabile!!!!!!

uwefed

L' arduino UNO ha 2kByte percui 2048 byte di RAM.

se hai usato avr-size.exe C:\DOCUME~1\User\IMPOST~1\Temp\build3857425205743446753.tmp\nome_del_vostro_sketch.cpp.elf -C
Per sapere l' ocupazione della RAM é un valore statico che non considera il consumo di RAM per una stampa su un display o la seriale. 120 Byte liberi sono pochissimi.

Il problema che hai é che stai usando piú RAm di quella disponibile.

Ciao Uwe

lobo01


L' arduino UNO ha 2kByte percui 2048 byte di RAM.

se hai usato avr-size.exe C:\DOCUME~1\User\IMPOST~1\Temp\build3857425205743446753.tmp\nome_del_vostro_sketch.cpp.elf -C
Per sapere l' ocupazione della RAM é un valore statico che non considera il consumo di RAM per una stampa su un display o la seriale. 120 Byte liberi sono pochissimi.

Il problema che hai é che stai usando piú RAm di quella disponibile.

Ciao Uwe



Ero convinto di avere 30k disponibili.....!!! :smiley-eek-blue:

uwefed

30 kByte di memoria FLASH non di RAM.
Ha 32kByte FLASH (di cui ocupata 0,5 kByte dal Bootloader), 2 kByte RAM e 1 kByte di EEProm che non sono usati da Arduino.
Se ci dai il Sketch possiamo verdere di risparmiare RAM.

Ciao Uwe


leo72

#7
Nov 26, 2012, 06:55 am Last Edit: Nov 26, 2012, 10:04 am by leo72 Reason: 1

30 kByte di memoria FLASH non di RAM.
Ha 32kByte FLASH (di cui ocupata 0,5 kByte dal Bootloader), 2 kByte RAM e 1 kByte di EEProm che non sono usati da Arduino.

@lolo:
E' l'architettura Harvard, in cui la memoria del programma e la memoria che contiene le variabili sono separate. Siccome la RAM che contiene le variabili è di piccole dimensioni, saturarla è molto più facile di quel che non si creda.

lobo01


30 kByte di memoria FLASH non di RAM.
Ha 32kByte FLASH (di cui ocupata 0,5 kByte dal Bootloader), 2 kByte RAM e 1 kByte di EEProm che non sono usati da Arduino.
Se ci dai il Sketch possiamo verdere di risparmiare RAM.

Ciao Uwe




  :D vi ringrazio molto questa sera posto lo sketch!!!
Grazie Mille!!

lobo01

Quote

/*****
 * COMPILARE CON ARDUINO 1.0 o successive
 ******/

#include <String.h>
#include <SPI.h>
#include <Ethernet.h>
#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is plugged into pin 2 on the Arduino
#define ONE_WIRE_BUS 6

// Setup a oneWire instance to communicate with any OneWire devices 
// (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);

///////////////////////////////////////////////////////////////////

byte mac[] = {
  0x00, 0xAA, 0xBB, 0xCC, 0xDA, 0x02 }; // mac address
byte ip[] = {
  192,168,1,7 }; // ip arduino internet in
byte gateway[] = {
  192,168,1,1 }; // internet access via router
byte subnet[] = {
  255, 255, 255, 0 }; //subnet mask

EthernetServer server(80); //server port


//definizione attuatori
int outPin = 2; // pin attuatore cancello
int outPin2 = 3; // pin attuatore tenda su
int outPin3 = 4; // pin attuatore tenda giu
int outPin4 = 5; // pin attuatore tenda metà
int outPin5 = 7; // pin controllo canale
int C = 5;       // Variabile canale
int X = 3;
int Z=0;

String readString; // legge int e assegna l'uscita




void setup()
{
  Ethernet.begin(mac, ip, gateway, subnet);
  pinMode(outPin, OUTPUT); //definisce che il pin e' un uscita
  pinMode(outPin2, OUTPUT);
  pinMode(outPin3, OUTPUT);
  pinMode(outPin4, OUTPUT);
  pinMode(outPin5, OUTPUT);
  //Serial.begin(9600);


  // start serial port
  //Serial.begin(9600);
  //Serial.println("Dallas Temperature IC Control Library Demo");

  // Start up the library
  sensors.begin();
}

void rele_ch()
{  digitalWrite(7,HIGH);
   delay(500);
}
void rele_cd()
{  digitalWrite(7,LOW);
   delay(500);
}

void loop()
{
  Z=0;

  // call sensors.requestTemperatures() to issue a global temperature
  // request to all devices on the bus
  //Serial.print(" Requesting temperatures...");
  sensors.requestTemperatures(); // Send the command to get temperatures
  //Serial.println("DONE");

  //Serial.print("Temperature for Device 1 is: ");
  sensors.getTempCByIndex(0); // Why "byIndex"?
  // You can have more than one IC on the same bus.
  // 0 refers to the first IC on the wire



  /*inizio client*/

  EthernetClient client = server.available();

  if (client) {

    boolean currentLineIsBlank = true;

    while (client.connected()) {

      if (client.available()) {
        char c = client.read();
        readString.concat(c);               //store characters to string
        //if HTTP request has ended
                        
        if (c == '\n' && currentLineIsBlank) {

          if(readString.indexOf("D=1") > 0)
          {
            C=1;   //  CONTROLLO CANALE
          }
          if(readString.indexOf("S=1") > 0)
          {
            C=2;   //  CONTROLLO CANALE
          }
          if(readString.indexOf("E=1") > 0)
          {
            C=6;   //  CONTROLLO CANALE
          }


          if(C==1)     // Cambio del canale
          {
            rele_ch();
            rele_cd();
            rele_ch();
            rele_cd();
            C=7;
            X=1;
            Z=1;
          }

          if(C==2)
          {
            rele_ch();
            rele_cd();
            rele_ch();
            rele_cd();
            rele_ch();
            rele_cd();
            C=8;
            X=2;
            Z=1;
          }

          if(C==6)
          { 
            if(X==1)
            {  
              rele_ch();
              rele_cd();
              rele_ch();
              rele_cd();
              rele_ch();
              rele_cd();
              rele_ch();
              rele_cd();
              rele_ch();
              rele_cd();
              C=9;
              X=3;
              Z=1;
            } 
            else
            {
              rele_ch();
              rele_cd();
              rele_ch();
              rele_cd();
              rele_ch();
              rele_cd();
              rele_ch();
              rele_cd();
              C=9;
              X=3;
              Z=1;
            } 
          }   
          
          if(readString.indexOf("L=1") > 0)
          {
            digitalWrite(outPin, HIGH);   //  CONTROLLO CANCELLO
            //Serial.println(outPin);
            delay(1000);
            digitalWrite(outPin, LOW);
            Z=1;
          }


lobo01

#10
Nov 26, 2012, 08:03 pm Last Edit: Nov 26, 2012, 11:41 pm by lobo01 Reason: 1
Quote

         if(readString.indexOf("A=2") > 0)
         {               //  CONTROLLO TENDE COMANDO INTERMEDIO
           digitalWrite(outPin2, HIGH);   //  Attivo il rele di salita
           delay(500);              
           digitalWrite(outPin2, LOW);      

           delay(40000);         //  Imposto il tempo di salita

           digitalWrite(outPin3, HIGH);   //  Disattivo il rele di discesa
           delay(500);            
           digitalWrite(outPin3, LOW);           

           delay(16000);              //  Imposto il tempo perche' la tenda arrivi nel mezzo

           digitalWrite(outPin4, HIGH);        //  Attivo il relo di Stop
           delay(500);            //
           digitalWrite(outPin4, LOW);      //  ----------------------
           Z=1;
          }









         // COSTRUZIONE PAGINA HTML

         client.println("HTTP/1.1 200 OK.....");

         client.println("Content-Type: text/html");

         client.println();

         // inizializzo pagina (da togliere se uso ajax)

         client.println("<html><head><title>DomusGate</title><meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1' ></head><body>");

         
         
         //inizai il body
       
         client.println("<div style='width:400px; height:600px;'>"); //risoluzione per nokia 5800 640x360      
                           
         client.println("<h1>DomusGate</h1>");
 
         client.println("<h3><p>Temperatura interna = ");
         client.print(sensors.getTempCByIndex(0));
         client.println(" C <br /></p></h3>");
   
         client.println("<br />");

         client.println("<hr>");

         client.println("<br />");

         client.println("<h2>APRICANCELLO</h2>");      

         //client.print("<h3><a href='/?L=1'>APRI</a></h3>");
         client.print("<h2><input type=\"button\" style=\"width:240px ;background-color:#E4E4E4; color:#000000; height:60px\" value=\"Cancello\" onclick =\" location.href='/?L=1'\"></h2>");
                   
         client.println("<br />");

         client.println("<hr>");        

         client.println("<hr>");              

         client.println("<h2>CONTROLLO TENDE</h2>");      

         
         //client.print("<h3><a href='/?A=1'>SU</a></h3>");
         client.print("<h2><input type=\"button\" style=\"width:240px ;background-color:#7FFF00; color:#000000; height:60px\" value=\"tenda su\" onclick =\" location.href='/?A=1'\"></h2>");        
                           
         //client.print("<h3><a href='/?H=4'>STOP</a></h3>");
         client.print("<h2><input type=\"button\" style=\"width:240px ;background-color:#FF0000; color:#000000; height:60px\" value=\"stop\" onclick =\" location.href='/?H=4'\"></h2>");  
         
         //client.print("<h3><a href='/?A=3'>GIU</a></h3>");
         client.print("<h2><input type=\"button\" style=\"width:240px ;background-color:#008800; color:#000000; height:60px\" value=\"tenda giu'\" onclick =\" location.href='/?A=3'\"></h2>");
     
     
         //client.print("<h3><a href='/?A=2'>INTERMEDIO</a></h3>");              
         client.print("<h2><input type=\"button\" style=\"width:240px ;background-color:#FFD700; color:#000000; height:60px\" value=\"tenda mezzo\" onclick =\" location.href='/?A=2'\"></h2>");
     
         client.println("<br />");

         client.println("<hr>");       

         client.println("<hr>");        


                   
         if (X==3)
         {   client.print("<h4><a href='/?D=1'>DESTRA</a></h4>");              

             client.print("<h4><a href='/?S=1'>SINISTRA</a></h4>");
         }
         
         if (X==2)
         {  
             client.print("<h4><a href='/?E=1'>ENTRAMBE</a></h4>");
         }
           
         if (X==1)
         {  
             client.print("<h4><a href='/?E=1'>ENTRAMBE</a></h4>");
         }
         
         
           
         //client.print("<input type=\"button\" style=\"width:120px ;background-color:#c00; color:#fff; height:80px\" value=\"Aggiorna\" onclick =\" location.href='/'\">");
         
         // chiudo il div

         client.println("</div>");

         client.println("</body></html>");

         if (Z==1)
         { //client.print ("<meta http-equiv=\"refresh\" content=\"5\">");
         client.println("<META HTTP-EQUIV=REFRESH CONTENT=2;url=http://mioip/>");
         }  
         else
         { Z=0;
         }

         // pulisco la stringa per la successiva lettura

         readString="";

         //fermo il client

         client.stop();



       } //if c == /n

     } // if client available

   } // while client connesso

 } // FINE if client

} // fine loop


uwefed

#11
Nov 26, 2012, 08:59 pm Last Edit: Nov 26, 2012, 09:05 pm by uwefed Reason: 1
Prova di inserire in tutti i client.println la funzione F() che prende il testo dalla Flash.

Code: [Select]
client.println("HTTP/1.1 200 OK.....");
diventa
Code: [Select]
client.println(F("HTTP/1.1 200 OK....."));
ecc.
Vedi http://www.arduino.cc/playground/Main/Printf

Ciao Uwe



marcello.romani

@OP due consigli per migliorare la leggibilità del codice che posti (per il forum):
* CTRL+T nell'IDE per migliorare l'indentazione
* usa i code tags (tasto # qui sopra)
* oppure allega il file .ino al post (additional options sotto la finestra messaggio)

marcello.romani

A proposito di F()... mi chiedevo se si può usare anche in casi come:

Code: [Select]

readString.indexOf("D=1")


Sono andato a leggere String.h e non ho trovato alcuna versione di indexOf() né del costruttore che accetti __FlashStringHelper*.
In effetti questa riga non compila (1.0.2):

Code: [Select]

readString.indexOf(F("D=1"))


Un'altra carenza di String ? ;)

Go Up