PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Auswertung



oderlachs
10.07.2012, 09:07
Ich muss 4 analoge Werte auswerten, die nicht einen genauen Wert haben (5V werden über einen Spannungteiler aufgeteilt in 1 Voltschritte). Ich habe da noch nicht allzuviel Erfahrung.
gehen meine Überlegungen ??

/* Analoge Auswertung

aw = analog.Read (analogPin)

if aw < 1
{
mache dies... ;

}

else if aw < 2
{
mache dies... ;
}

else if aw < 3
{
mache dies... ;
}

else if aw < 4
{
mache dies... ;
}

else {
...alles ok ;
}

wäre das so syntaxmässig möglich ????


Gruss Gerhard

Torrentula
10.07.2012, 09:14
Ja das ist so möglich

ijjiij
10.07.2012, 09:51
Ich gehe mal davon aus der der "Alles OK" Fall der häufigste ist der eintreten wird.
Daher würde ich zur optimierung der Rechenzeit den "Alles OK" Fall gleich an oberste stelle der IF-ELSE Abfrage stellen.

Also eher so:


/* Analoge Auswertung
aw = analog.Read (analogPin)
if aw > 4
{
alles ok;
}
else if aw >3
{
mache dies... ;
}
else if aw >2
{
mache dies... ;
}
else if aw >1
{
mache dies... ;
}
else
{
//also kleiner als 1
mach was anderes;
}


Warum das ganze jetzt anders herum?
In so "einfachen" Abfragen fällt das vielleicht noch nicht so stark ins Gewicht, es schadet aber troztdem nicht, gerade in der µC Programmierung, zumindest Grundlagen der Rechenzeitoptimierung einzubringen.
Der Ablauf so einer Verzweigung sollte einfach der Warscheinlichkeit der eintretenden Fälle nach sortiert sein, da dann der komplette folgende "Abfrage-Block" ignoriert wird, wenn der Fall schon eingetreten ist.

Einfaches Beispiel:
Wir haben einen unsigned-Intager i, welcher theoretisch die Zahlenweite von 0 bis 250 (haben wir uns so limitiert) annehmen kann. Wir füttern unseren Intager mit den Temperaturwerten unseres Wohnraums (normalerweise also so zwischen 20 und 30 Grad Celsius, im Sommer auch mal mehr, im Winter auch mal weniger). Nehmen wir jetzt also an, jede if-Abfrage braucht 1ms (so lang brauchen die nicht, ist mir schon klar, aber nur als Beispiel jetzt) zur Überprüfung und Auswertung.
Beginnen wir mit unserer Abfrage jetzt bei if (i == 250) und laufen schrittweise nach unten bis 0, dann haben wir also 200 Schritte unnötig gemacht, also 200 ms Rechenzeit sinnlos verschwendet. Beginnen wir aber bei if(i==0), dann machen wir im Durchschnitt vermutlich so 20-25 Abfragen vor dem Ergebnis, also 20-25ms.

Wenn du also bei deiner Abfrage gleich von Beginn weg das warscheinlichste eintretende Ereignis (also alles funktioniert nach Plan) abfragst, wird keine Rechenzeit verschwendet bevor das Programm wie gewünscht abläuft. Die Rechenzeit wird erst dann aufgewendet, wenn du sie wirklich brauchst weil sich halt irgendwo ein Fehler eingeschlichen hat.

Hoffe das war jetzt so verständlich formuliert. :)