Go Down

Topic: " Snellire " il codice (Read 2378 times) previous topic - next topic

GINGARDU

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); }

cyberhs

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);
}

superp

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.

astrobeed


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.
Scientia potentia est

GINGARDU

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:

lestofante

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
Guida per principianti http://playground.arduino.cc/Italiano/newbie
Unoffical Telegram group https://t.me/genuino

niki77



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.
Vi è una spiegazione scientifica a tutto.
La fede è solo quell'anello che si porta al dito dopo il matrimonio.

leo72

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

m_ri

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

marcello.romani

#9
Sep 25, 2012, 11:51 am Last Edit: Sep 25, 2012, 12:00 pm by tuxduino Reason: 1


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

niki77


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.
Vi è una spiegazione scientifica a tutto.
La fede è solo quell'anello che si porta al dito dopo il matrimonio.

GINGARDU


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

Go Up