Go Down

Topic: Velocità del loop Mega 2560 (Read 9 times) previous topic - next topic

PaoloP

#60
Jan 08, 2013, 02:45 pm Last Edit: Jan 08, 2013, 02:49 pm by PaoloP Reason: 1
Ricorda che il main.c di Arduino è così:
Code: [Select]
#include <Arduino.h>

int main(void)
{
init();

#if defined(USBCON)
USBDevice.attach();
#endif

setup();
   
for (;;) {
loop();
if (serialEventRun) serialEventRun();
}
       
return 0;
}

quindi se c'è la seriale controlla il serialevent; a parte controllare i vari interrupt.
Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

astrobeed


quindi se c'è la seriale controlla il serialevent.


Questo lo so benissimo, quello che non quadra è perché ci deve mettere oltre 3us in più rispetto alla UNO per fare la stessa cosa, di UART inizializzata ce n'è solo una, le altre tre sono inattive, posso capire che ci vuole qualche ciclo macchina in più per verificare quali UART sono attive, ma qui parliamo di oltre 50 cicli macchina in più.
Tocca controllare il core per capire dove sta il "problema" e vedere se è possibile porvi un rimedio.

lesto

ahahh si inizia a fare una domanda "innocua" e si finisce a debuggare il core... sarà felice Pablos  :smiley-mr-green:
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

astrobeed


ahahh si inizia a fare una domanda "innocua" e si finisce a debuggare il core... sarà felice Pablos  :smiley-mr-green:


Diciamo che adesso è scattata la molla della curiosità, in realtà non credo che questo sia un reale problema, stiamo usando piccoli sketch mirati per esaltare il "difetto", in una normale applicazione qualche us in più sull'esecuzione della loop hanno impatto zero sul totale del programma.
Però potrebbe essere che si annidano altre sorprese nascoste, quindi indagare male non fa  :smiley-mr-green:

tuxduino


ahahh si inizia a fare una domanda "innocua" e si finisce a debuggare il core... sarà felice Pablos  :smiley-mr-green:


:D

pablos

Quote
ahahh si inizia a fare una domanda "innocua" e si finisce a debuggare il core... sarà felice Pablos  smiley-mr-green

Ahahah ... Sisi sono felice ora che si è scoperta una causa  :smiley-mr-green:, grazie ad uno strumento che ha permesso di farlo senza debug seriale e grazie ad Astro, in fondo io la serial una volta finito il lavoro la levo, mi serve solo per i debug.
Purtroppo sarà meno felice quello che nel suo programma ne avrà bisogno penalizzando il rendimento.

ciao

no comment

tuxduino

A proposito dell'influenza della seriale sulle prestazioni, vorrei sottolineare i risultati che ho ottenuto nel mio sketch di prova: tra baud rate di 9600 e 115200 c'è una differenza significativa.
Va ricordato però che nelle ultime versioni di Arduino anche la trasmissione seriale è fatta via interrupt, e diventa bloccante solo nel momento in cui il buffer di trasmissione è pieno, quindi in realtà se si trasmettono "pochi" (1) byte alla volta, l'impatto complessivo dovrebbe essere molto limitato.

(1) ora vado a vedere la dimensione del buffer di trasmissione.

PS: e adiamo con un altro sketch di test... :)

tuxduino

In HardwareSerial.cpp abbiamo:

#if (RAMEND < 1000)
  #define SERIAL_BUFFER_SIZE 16
#else
  #define SERIAL_BUFFER_SIZE 64
#endif

quindi sulla UNO / 2009, con 2K di RAM, i buffer di ricezione e invio della seriale hardware hanno dimensione 64 byte.

pablos

#68
Jan 09, 2013, 12:26 am Last Edit: Jan 09, 2013, 12:33 am by pablos Reason: 1
Quello che non ho capito se Astro dice che il serial.begin crea un rallentamento, perchè questo non fa cambiare nulla??
Code: [Select]
unsigned long prevMillis=0;
const long CNT_MAX=100000;
unsigned long cnt=0;
unsigned long memo[10];
byte count_memo_pos=0;

void setup() {
delay(2000);
//Serial.begin(9600); //<<< se lo commento o decommento il risultato non cambia
prevMillis = millis();
}
void loop(){
 
   cnt++;
   if (cnt > CNT_MAX){    
       memo[count_memo_pos]= millis() - prevMillis;
       count_memo_pos++;
       cnt = 0;
       if(count_memo_pos==10) read_memo();
       prevMillis = millis();
   }
}

void read_memo(){
 Serial.begin(9600);  
 
 for (byte i = 0; i < 10; i++){
      Serial.println((String)i + " "+ (String)memo[i]);
 }        
}


qui il begin lo faccio dopo aver salvato 10 dati e quando li vado a leggere.
Bho mistero ... sembra che il programma in qualche modo lo veda
no comment

pablos

Da questi dati che ha prelevato Astro con precisione
Quote
con seriale attiva sulla MEGA2560 dura 7.75 us, disattivando la seriale sulla MEGA2560 il tempo del ciclo crolla a solo 1.95 us.


tra 7.75 e 1.95 c'e' un rapporto di valore 4, stai a vedere che una volta scritto serial.begin il sistema mi va a controllare tutte e 4 le seriali.
Posso aver detto una fesseria ma la coincidenza è strana.
no comment

pablos

#70
Jan 09, 2013, 10:59 am Last Edit: Jan 09, 2013, 11:31 am by pablos Reason: 1
Sul file HardwareSerial.cpp
percorso .... arduino-1.0.1-rc2\hardware\arduino\cores\arduino

ho escluso queste linee dalla 167 alla 177
Code: [Select]
/*  ---escluso temporaneamente ------------------------------------------------
#ifdef serialEvent1_implemented
 if (Serial1.available()) serialEvent1();
#endif
#ifdef serialEvent2_implemented
 if (Serial2.available()) serialEvent2();
#endif
#ifdef serialEvent3_implemented
 if (Serial3.available()) serialEvent3();
#endif
-------------------------------------------------------------------------------*/


e queste dalla linea 415 alla 425
Code: [Select]
/*  ---escluso temporaneamente ------------------------------------------------
#if defined(UBRR1H)
 HardwareSerial Serial1(&rx_buffer1, &tx_buffer1, &UBRR1H, &UBRR1L, &UCSR1A, &UCSR1B, &UDR1, RXEN1, TXEN1, RXCIE1, UDRIE1, U2X1);
#endif
#if defined(UBRR2H)
 HardwareSerial Serial2(&rx_buffer2, &tx_buffer2, &UBRR2H, &UBRR2L, &UCSR2A, &UCSR2B, &UDR2, RXEN2, TXEN2, RXCIE2, UDRIE2, U2X2);
#endif
#if defined(UBRR3H)
 HardwareSerial Serial3(&rx_buffer3, &tx_buffer3, &UBRR3H, &UBRR3L, &UCSR3A, &UCSR3B, &UDR3, RXEN3, TXEN3, RXCIE3, UDRIE3, U2X3);
#endif
-------------------------------------------------------------------------------*/


Ora ottengo lo stesso risultato della UNO con Serial.begin attivato nello sketch, non è una soluzione perchè non vanno più le altre 3 seriali però ......

uguali a quelli di Tuxduino
Tempo medio: 230 ms (in realtà sarebbe 236 ma è trascurabile)
65000 / 0,230 = 282608 chiamate di loop() al secondo

Se qualcuno potesse confermare la correttezza dei risultati ... sarei grato

ciao
no comment

PaoloP


arduino-1.0.1-rc2


Dovresti aggiornarti.  :smiley-roll-sweat: --> http://arduino.cc/en/Main/Software
Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

pablos

#72
Jan 09, 2013, 07:03 pm Last Edit: Jan 09, 2013, 07:33 pm by pablos Reason: 1
hai ragione, ma ho un po' di lib modificate Ethernet, SD, IRremote e ora pure  HardwareSerial.cpp poi non so più quali :)), se prendessi l'ultimo IDE mi troverei nei guai  

e poi nella 102 e 103 non vedo nulla di significativo che mi potrebbe cambiare qualcosa http://arduino.cc/en/Main/ReleaseNotes
no comment

tuxduino

Quindi a quanto pare i "processi di sistema aggiuntivi" cui accennava astro potrebbero essere i test sugli eventuali caratteri ricevuti dalle 3 seriali aggiuntive presenti sul mega. E' corretto ?

pablos

#74
Jan 09, 2013, 08:00 pm Last Edit: Jan 09, 2013, 08:09 pm by pablos Reason: 1

Quindi a quanto pare i "processi di sistema aggiuntivi" cui accennava astro potrebbero essere i test sugli eventuali caratteri ricevuti dalle 3 seriali aggiuntive presenti sul mega. E' corretto ?


che cosa succeda esattamente non ho guardato, probabilmente le 3 seriali non usate non vengono correttamente escluse, qualche "#if define" si trova nel posto sbagliato ... if (Serial1/2/3.available() serialEvent1/2/3();a quanto pare sono trues

ciao
no comment

Go Up