Genova
Offline
Edison Member
Karma: 14
Posts: 2451
|
 |
« on: January 07, 2013, 05:48:30 am » |
Ho voluto per curiosità vedere quanti cicli loop fa il mio arduino in un secondo con un programma a vuoto. Possibile che su 16MHz di clock arrivo a 80Khz (80.000 cicli) ??? Dove vanno a finire tutti quei Mhz, va bene che ci sono un po' di cosette da gestire nel micro, ma secondo me è una perdita enorme di risorse.
ciao
|
|
|
|
« Last Edit: January 09, 2013, 05:18:25 am by pablos »
|
Logged
|
Meglio imparare dalle cose inutili piuttosto che non imparare niente. [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]
|
|
|
|
Cagliari
Online
Faraday Member
Karma: 49
Posts: 3030
|
 |
« Reply #1 on: January 07, 2013, 06:01:07 am » |
|
|
|
|
|
Logged
|
|
|
|
|
Genova
Offline
Edison Member
Karma: 14
Posts: 2451
|
 |
« Reply #2 on: January 07, 2013, 06:06:36 am » |
no non ho provato, a me interessa sapere quante volte mi esegue il loop unsigned long preMillis=0; unsigned long counter=0;
void setup(){ Serial.begin(9600); }
void loop (){
counter++; if(millis() - preMillis >= 1000) { preMillis = millis(); Serial.println((String)counter); counter=0; } }
|
|
|
|
|
Logged
|
Meglio imparare dalle cose inutili piuttosto che non imparare niente. [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]
|
|
|
|
Genova
Offline
Edison Member
Karma: 14
Posts: 2451
|
 |
« Reply #3 on: January 07, 2013, 06:30:12 am » |
La curiosità è nata dal fatto che avendo una Mega con 70 pin utilizzabili, mi chiedevo se era davvero utile convertire tutti i cicli for di digital.write(x,0) e digital.read in PORTxx |= _BV(PORTxx); e PINxx e direi proprio di si!! il tempo si dimezza quasi, un programma molto lungo, va ottimizzato al massimo, sapevo che era + veloce la manipolazione delle porte, ma non sapevo quanto  unsigned long preMillis=0; unsigned long counter=0;
void setup(){ Serial.begin(9600); }
void loop (){ //---------------------------------- /* accendi il led */ //44 //PORTL |= _BV(PORTL5); /* spegni il led */ //44 questo lo fa 76.123/sec //PORTL &= ~_BV(PORTL5); //----------------------------------
//---------------------------------- digitalWrite(44,1); digitalWrite(44,0);// questo lo fa 38.324/sec //----------------------------------
counter++; if(millis() - preMillis >= 1000) { preMillis = millis(); Serial.println((String)counter); counter=0; } }
|
|
|
|
« Last Edit: January 07, 2013, 06:41:11 am by pablos »
|
Logged
|
Meglio imparare dalle cose inutili piuttosto che non imparare niente. [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 219
Posts: 16509
Don't know what I do
|
 |
« Reply #4 on: January 07, 2013, 07:00:09 am » |
La lentezza della digitalWrite è rinomata. La digitalWrite esegue diversi controlli, primo fra tutti vedere se stai lavorando su un pin PWM, nel caso disattiva il corrispondente segnale ecc... Alla fine tutta 'sta roba la paghi.
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Sr. Member
Karma: 7
Posts: 293
|
 |
« Reply #5 on: January 07, 2013, 07:05:12 am » |
no non ho provato, a me interessa sapere quante volte mi esegue il loop unsigned long preMillis=0; unsigned long counter=0;
void setup(){ Serial.begin(9600); }
void loop (){
counter++; if(millis() - preMillis >= 1000) { preMillis = millis(); Serial.println((String)counter); counter=0; } } però questo programma non è esattamente scevro di operazioni... incrementa un long chiama la millis (che chissà quante operazioni fa) , sottrae due long, compara... quanto impiega una funzione millis? la seriale poi ... presumo venga gestita ad interrupt?
|
|
|
|
|
Logged
|
|
|
|
|
Genova
Offline
Edison Member
Karma: 14
Posts: 2451
|
 |
« Reply #6 on: January 07, 2013, 07:10:02 am » |
Bhe la seriale è l'unica istruzione che impegna il micro alla fine del secondo trascorso
|
|
|
|
|
Logged
|
Meglio imparare dalle cose inutili piuttosto che non imparare niente. [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]
|
|
|
|
Genova
Offline
Edison Member
Karma: 14
Posts: 2451
|
 |
« Reply #7 on: January 07, 2013, 07:17:48 am » |
La lentezza della digitalWrite è rinomata. La digitalWrite esegue diversi controlli, primo fra tutti vedere se stai lavorando su un pin PWM, nel caso disattiva il corrispondente segnale ecc... Alla fine tutta 'sta roba la paghi.
Certo che è rinomata, ma sono quei miseri 80.000 cicli a vuoto che mi lasciano perplesso, tu stesso in qualche post non ricordo quale, hai detto che vengono impegnate librerie che non vengono usate, vabbè era un appunto nulla di grave  ciao
|
|
|
|
|
Logged
|
Meglio imparare dalle cose inutili piuttosto che non imparare niente. [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]
|
|
|
|
Offline
Sr. Member
Karma: 7
Posts: 293
|
 |
« Reply #8 on: January 07, 2013, 07:30:34 am » |
Bhe la seriale è l'unica istruzione che impegna il micro alla fine del secondo trascorso
si quella non mi preoccupa... però sta all'ascolto sulla seriale... questo mi preoccupa di più ma non tanto... imho il problema è il millis... e vorrei (ma ora no posso) fare un esperimento... 80000? setup cont = 0 oldmillis = millis
loop
cont ++ if cont > 100000 serial print millis()-oldmillis oldmillis = millis cont =0 endif
capito cosa vorrei fare? quanti millis impiega ad incrementare una variabile e testare la stessa 100000 volte? vorrei quasi scommettere che questo ciclo te lo fa in un 10-15 clock... 1 megahz... stasera provo.
|
|
|
|
|
Logged
|
|
|
|
|
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)
|
 |
« Reply #9 on: January 07, 2013, 07:49:02 am » |
Per curiosità ho fatto qualche esperimento: unsigned int cnt = 0; const unsigned int CNT_MAX = 65000;
unsigned long prevMillis = 0;
void setup() { Serial.begin(115200); }
void loop() { cnt++; if (cnt > CNT_MAX) { Serial.println(millis() - prevMillis); prevMillis = millis(); cnt = 0; } } Tempo medio: 230 ms 65000 / 0,230 = 282608 chiamate di loop() al secondo Modificando le prime due righe in: unsigned long cnt = 0; const unsigned long CNT_MAX = 65000; Tempo medio: 278 ms 65000 / 0,278 = 233812 chiamate di loop() al secondo
|
|
|
|
|
Logged
|
|
|
|
|
Rome (Italy)
Offline
Tesla Member
Karma: 74
Posts: 7379
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
|
 |
« Reply #10 on: January 07, 2013, 08:04:06 am » |
Ho voluto per curiosità vedere quanti cicli loop fa il mio arduino in un secondo con un programma a vuoto.
Il tuo non è un programma a vuoto, contiene calcoli con valori long che richiedono molti cicli macchina. Questo è un programma quasi a vuoto: void setup() { pinMode(13, OUTPUT); }
void loop() { PORTB = 0xff; PORTB = 0x00; }
Le due scritture dirette su PORTB richiedono solo 125 ns, come evidenziato nell'immagine allegata della misura sul pin 13 con un DSO, mi è toccato fare una foto al volo della schermata perché vicino al pc ho il Tektronix per il quale non tengo installato il software per scaricare le schermate. Come si vede la frequenza per questo loop è 1.06 MHz, il periodo necessario per la sola loop, è di 875 ns - 62.5 ns = 812.5 ns = 13 cicli macchina. Comunque no ha molto senso parlare di massima velocità della loop visto che in realtà dipende da quello che fai al suo interno a cui devi sommare 875 ns ( ~1.43 MHz) per la sua durata reale
|
|
|
|
|
Logged
|
|
|
|
|
Genova
Offline
Edison Member
Karma: 14
Posts: 2451
|
 |
« Reply #11 on: January 07, 2013, 09:09:43 am » |
@Astro, mi rendo conto che non è proprio a vuoto, ma tu hai un oscilloscopio eheheh io non potevo farlo se non contando approsimativamente i secondi, grazie per la prova a banco (o l'avevi già fatta  ) é anche molto probabile che il mio millis che parte al reset è già abbastanza avanti, il valore di paragone che uso è comunque una costante dove lo stesso errore viene riportato ogni volta che aggiungo un pezzetto di prova. Il mio programma su arduino 2560 è diventato quasi 2000 righe con un 60k circa occupati e ho notato tristemente che nel loop ci passa circa 23 volte al secondo cercavo di capire facendo piccoli pezzi alla volta quale fosse la procedura migliore per migliorarne le prestazioni ciao
|
|
|
|
|
Logged
|
Meglio imparare dalle cose inutili piuttosto che non imparare niente. [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]
|
|
|
|
Genova
Offline
Edison Member
Karma: 14
Posts: 2451
|
 |
« Reply #12 on: January 07, 2013, 09:30:32 am » |
@tuxduino Tempo medio: 230 ms 65000 / 0,230 = 282608 chiamate di loop() al secondo A me il tuo sketch mi da meno della metà 131000 circa, allora sto arduino ha dei seri problemi!!! ciao
|
|
|
|
|
Logged
|
Meglio imparare dalle cose inutili piuttosto che non imparare niente. [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]
|
|
|
|
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)
|
 |
« Reply #13 on: January 07, 2013, 10:05:43 am » |
Che velocità hai impostato per la seriale ?
|
|
|
|
|
Logged
|
|
|
|
|
Genova
Offline
Edison Member
Karma: 14
Posts: 2451
|
 |
« Reply #14 on: January 07, 2013, 10:25:10 am » |
9600 ma che importa, non la usa fino a quando l'if non è vero, tra l'altro l'attivo dopo.... void setup() {} void loop() { cnt++; if (cnt > CNT_MAX) { Serial.begin(9600); Serial.println(millis() - prevMillis); Serial.end(); cnt = 0; prevMillis = millis(); } } ps .. ho provato anche con 115200 è uguale il risultato 0.495 anche Serial.begin nel setup, cambia nulla Può darsi che la mega debba fare più cose e quindi più lenta tu di quale MCU parli?
|
|
|
|
« Last Edit: January 07, 2013, 10:39:01 am by pablos »
|
Logged
|
Meglio imparare dalle cose inutili piuttosto che non imparare niente. [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]
|
|
|
|
|