PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Was strengt einen Controller an?



Willa
21.03.2008, 21:46
Hallo!
Sorry für den Titel, mir fällt keine kurze, passende Beschreibung meiner Frage ein.... Ist ja auch schon spät und Ostern und so.....

Ich würde gerne folgendes wissen:

Angenommen in einem ATmega steht folgender PseudoCode



if A = 1 then
Y=sin(x)^10*PI*cos(y)^e*.....*.....*....
end if


ist es dem Controller dann absolut egal was zwischen if und endif steht solange A <> 1 ? Wenn A also <> 1 wird dann durch diese lange Kalkulation keine Rechenzeit verbraucht?
Ich würde das gerne wissen weil ich in der Hauptschleife eine Taste per Inkey() abfrage und danach dann viele Select Case Fälle kommen. Diese ganze Abfrage soll aber möglichst keine Rechenzeit verbrauchen, da der ATmega32 nebenbei einen Stepper im 1/16 Mikroschritt antreibt und ein dementsprechend schnelles Clocksignal erzeugt bzw. ziemlich ausgelastet ist.

Vielen Dank für eure Antworten,
viele Grüße,
William

Dirk
21.03.2008, 22:07
Ja, wenn A <> 1 ist, wird die lange Formel übersprungen (nicht ausgeführt).

Gruß Dirk

Willa
21.03.2008, 22:14
Danke, das ist ja prima :-)
Gibt es eigentlich einen Unterschied ob man fragt
if A = true then ...
und
if A <> false then ...

Beim ersten Fall muss der µC ja gucken ob A genau "true" ist, beim zweiten Fall muss er ja "nur" gucken ob A irgendetwas anderes als "false" ist.
Sorry für die evtl. leicht bescheuert anmutenden Fragen, aber ich bin programmiertechnisch relativ ahnungsbefreit...

Viele Grüße,
William

uwegw
21.03.2008, 22:26
Das kommt ganz drauf an, was A für ein Datentyp ist. Am schnellsten testet sich theoretisch (Assembler), ob ein Register gleich oder ungleich Null ist. Aber was dein Compiler draus macht, muss du im Listfile nachschauen.
[Der Unterschied dürfte aber nur wenige Takte ausmachen].

Jaecko
22.03.2008, 09:18
in C soll man statt "a == TRUE" auch mal eher "a != FALSE" verwenden; FALSE ist immer 0, TRUE aber manchmal 1, manchmal -1, 0xFF,... irgendwas ungleich 0 eben.

radbruch
22.03.2008, 10:25
Noch eine Ergänzung weils grad gut passt: Bei mehrfachen Verknüpfungen wird sofort abgebrochen wenn das Ergebniss nicht mehr true werden kann:

if (a*wurzel(x)-sin(y) < b) && (a!=0)

Der Unsinn wird immer ausgerechnet, aber

if (a!=0) && (a*wurzel(x)-sin(y) < b)

berechnet nix wenn a==0 :)

Irgendwo habe ich das mal aufgeschnappt:

false=(1==0);
true=!false;

Wie der Kompiler das speichert ist nicht festgelegt.

Gruß

mic

pctoaster
22.03.2008, 11:00
Es gibt aber auch Compiler, die rechnen erst gnadenlos alles aus, was in der If Bedingung steht. (VB macht das z.B. so). Was Bascom daraus macht, weiß ich nicht.
Wenn man also sicher gehen will: IFs verschachteln und außen die Bedingung abfragen, die am einfachsten und deren Erfüllung am unwahrscheinlichsten ist.

Gruß
pctoaster

Willa
22.03.2008, 11:59
Super, da ist ja jetzt einiges an Tipps zusammengekommen. Vielen Dank!
William