Go Down

Topic: " Snellire " il codice (Read 1 time) 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); }
Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

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.
"The question is not whether intelligent machines can have emotions, but whether machines can be intelligent without any emotions"

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.

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:
Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

lesto

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
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

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

tuxduino

#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
Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

Go Up