Pages: 1 ... 3 4 [5] 6 7 8   Go Down
Author Topic: Velocità del loop Mega 2560  (Read 7130 times)
0 Members and 1 Guest are viewing this topic.
Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 110
Posts: 6975
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ricorda che il main.c di Arduino è così:
Code:
#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.
« Last Edit: January 08, 2013, 08:49:23 am by PaoloP » Logged

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

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

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

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

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

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

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

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
Logged

Offline Offline
Edison Member
*
Karma: 26
Posts: 1339
You do some programming to solve a problem, and some to solve it in a particular language. (CC2)
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

smiley-grin
Logged

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

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

Logged

no comment

Offline Offline
Edison Member
*
Karma: 26
Posts: 1339
You do some programming to solve a problem, and some to solve it in a particular language. (CC2)
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Edison Member
*
Karma: 26
Posts: 1339
You do some programming to solve a problem, and some to solve it in a particular language. (CC2)
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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

Quello che non ho capito se Astro dice che il serial.begin crea un rallentamento, perchè questo non fa cambiare nulla??
Code:
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
« Last Edit: January 08, 2013, 06:33:43 pm by pablos » Logged

no comment

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

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

no comment

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

Sul file HardwareSerial.cpp
percorso .... arduino-1.0.1-rc2\hardware\arduino\cores\arduino

ho escluso queste linee dalla 167 alla 177
Code:
/*  ---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:
/*  ---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
« Last Edit: January 09, 2013, 05:31:10 am by pablos » Logged

no comment

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 110
Posts: 6975
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

arduino-1.0.1-rc2

Dovresti aggiornarti.  smiley-roll-sweat --> http://arduino.cc/en/Main/Software
Logged

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

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

hai ragione, ma ho un po' di lib modificate Ethernet, SD, IRremote e ora pure  HardwareSerial.cpp poi non so più quali smiley), 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
« Last Edit: January 09, 2013, 01:33:54 pm by pablos » Logged

no comment

Offline Offline
Edison Member
*
Karma: 26
Posts: 1339
You do some programming to solve a problem, and some to solve it in a particular language. (CC2)
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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

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
« Last Edit: January 09, 2013, 02:09:27 pm by pablos » Logged

no comment

Pages: 1 ... 3 4 [5] 6 7 8   Go Up
Jump to: