Arduino Forum

International => Italiano => Software => Topic started by: GINGARDU on Sep 22, 2012, 01:53 pm

Title: " Snellire " il codice
Post by: GINGARDU on Sep 22, 2012, 01:53 pm
volevo chiedere se e possibile associare il codice tra parentesi graffe a "qualcosa"
im modo da scrivere solo una parola
questo per evitare di ripetere per molte volte la stessa cosa e finire di esaurire le risorse

if (C2 >= 0 && C2 <= 10)
{
   // OO 
digitalWrite (2, LOW);
digitalWrite (3, LOW);  //centrale
digitalWrite (4, HIGH);  //destro
digitalWrite (5, LOW);
digitalWrite (6, LOW);
digitalWrite (7, LOW);
digitalWrite (8, LOW);
digitalWrite (9, LOW);
digitalWrite (10,HIGH);
digitalWrite (11, HIGH); }
Title: Re: " Snellire " il codice
Post by: cyberhs on Sep 22, 2012, 02:06 pm
Parli di una funzione?

Code: [Select]


SetOutput(LOW, LOW, HIGH, LOW, LOW, LOW, LOW, LOW, HIGH, HIGH);

...
void SetOutput(boolean Out2, boolean Out3, boolean Out4, ... boolean Out11) {
digitalWrite (2, Out2);
digitalWrite (3, Out3);  //centrale
digitalWrite (4, Out4);  //destro
digitalWrite (5, Out5);
digitalWrite (6, Out6);
digitalWrite (7, Out7);
digitalWrite (8, Out8);
digitalWrite (9, Out9);
digitalWrite (10,Out10);
digitalWrite (11, Out11);
}
Title: Re: " Snellire " il codice
Post by: superp on Sep 22, 2012, 02:11 pm
Pensavo di aver avuto un dejavù..ed infatti
http://arduino.cc/forum/index.php/topic,112350.msg844509.html#msg844509
Stai chiedendo la stessa cosa?
N.
Title: Re: " Snellire " il codice
Post by: astrobeed on Sep 22, 2012, 02:26 pm

questo per evitare di ripetere per molte volte la stessa cosa e finire di esaurire le risorse


Anche se realizzi una macro, o una funzione dedicata, per snellire la scrittura del codice sempre e comunque dovrai avere quel tot di istruzioni in cascata ripetute tot volte, anche se non le vedi nel codice direttamente verranno comunque compilate con il relativo impegno della flash/ram.
Title: Re: " Snellire " il codice
Post by: GINGARDU on Sep 22, 2012, 02:43 pm
questo non me lo dovevi dire  ]:D ]:D ]:D


allora ci stiamo prendendo in giro da soli   =( =( =(


alla  fine per scrivere meno "scriviamo" di piu  :smiley-eek-blue:
Title: Re: " Snellire " il codice
Post by: lestofante on Sep 24, 2012, 10:40 am
puoi usare gli array (quì uso 2 array paralleli, ma una matrice è più "pulita" per evitare diverse dimensioni tra i 2 array):

Code: [Select]

int dimensioneArray=10;
int arrayPin[] = {2,3,4,5,6,7,8,9,10,11};
int arrayStato[] = {HIGH,HIGH,LOW,HIGH,LOW,HIGH,HIGH,LOW,LOW,LOW}; //attenzione HIGH e LOW non sono boolean ma int!!!

int settaPin(int pin[], int stati[], int dimensione){
   for(int i=0;i<dimensione;i++){
      digitalWrite(arrayPin[i], stati[i]);
   }
}


altra versione, che però deve settare tutti i pin in nel range da "inizio" a "fine":

Code: [Select]

int settaPin(int stati[], int inizio, int fine){
   for(int i=inizio;i<fine;i++){
      digitalWrite(i, stati[i]);
   }
}


In tutti i casi devi fare attenzione alle dimensioni e all'inizializzazione degli array, ovviamente
Title: Re: " Snellire " il codice
Post by: niki77 on Sep 24, 2012, 10:40 pm


questo per evitare di ripetere per molte volte la stessa cosa e finire di esaurire le risorse


Anche se realizzi una macro, o una funzione dedicata, per snellire la scrittura del codice sempre e comunque dovrai avere quel tot di istruzioni in cascata ripetute tot volte, anche se non le vedi nel codice direttamente verranno comunque compilate con il relativo impegno della flash/ram.


Il pre processore in questo non esegue nessuna ottimizzazione?
Sapevo,forse erroneamente, che una serie di operazioni identiche consecutive venivano comunque ridotte ad un unico set di istruzioni chiamato ripetutamente.
Title: Re: " Snellire " il codice
Post by: leo72 on Sep 24, 2012, 11:02 pm
Dipende da come il compilatore ottimizza il codice. Per avere la certezza di ciò andrebbe disassemblato un firmware compilato.
Title: Re: " Snellire " il codice
Post by: m_ri on Sep 24, 2012, 11:04 pm
se vuoi allegerire le istruzioni di digitalwrite,potresti considerare l'idea,se hai molte digitalwrite di pin consecutivi con valori noti a compile-time,di settare direttamente i registri..in questo modo setti(o resetti) più pin per volta..
Title: Re: " Snellire " il codice
Post by: marcello.romani on Sep 25, 2012, 11:51 am


questo per evitare di ripetere per molte volte la stessa cosa e finire di esaurire le risorse


Anche se realizzi una macro, o una funzione dedicata, per snellire la scrittura del codice sempre e comunque dovrai avere quel tot di istruzioni in cascata ripetute tot volte, anche se non le vedi nel codice direttamente verranno comunque compilate con il relativo impegno della flash/ram.


Macro e funzioni sono due cose completamente diverse. Se scrivi una funzione e la richiami in 10 punti del codice _non_ hai occupazione di progmem pari a 10 x dimensione della funzione. In altre parole, il codice di una funzione non viene ripetuto (ricopiato) ad ogni chiamata, ma è presente una sola volta in tuto il programma e viene, appunto, soltanto "richiamato".
Title: Re: " Snellire " il codice
Post by: niki77 on Sep 29, 2012, 09:32 pm

Dipende da come il compilatore ottimizza il codice. Per avere la certezza di ciò andrebbe disassemblato un firmware compilato.


E la madonna.... se non ricordo male è possibile avere in uscita insieme al file hex anche il file asm , non occorre disassemblare.
Title: Re: " Snellire " il codice
Post by: GINGARDU on Sep 29, 2012, 09:45 pm

se vuoi allegerire le istruzioni di digitalwrite,potresti considerare l'idea,se hai molte digitalwrite di pin consecutivi con valori noti a compile-time,di settare direttamente i registri..in questo modo setti(o resetti) più pin per volta..


he he  ci sono arrivato ma in ritardo ormai avevo quasi scritto tutto
comunque anche se mi fa incazz***    ho deciso di ririscrivere tutto l'ambaradan

cosi la prossima volta imparo  =(

e quando faccio un qualcosa ci penso bene quali pin assegnare  e a risparmiare pin e memoria
accorpare pin dove possibile

ah mannaggia  l'esperienza