Return Anweisung mit Rückgabe vom Zustand des Ports

Gast #1977067
Lesenswert?

Hi,

bastel gerade ein wenig an einem neuen Projekt und hab ne Funktion die 
mir einfach nur den Zustand eines Pins zurückgibt....
1
int get_rx_pin_status(void)
2
{
3
  if (RX_PORT & (1 << RX))
4
  {
5
    return FALSE;
6
  }
7

8
  else
9
  {
10
    return TRUE;
11
  }
12
}

Funktioniert, aber irgendwie hab ich das Gefühl es geht auch einfacher 
bzw. kürzer. Hat einer ne Idee? Nur so aus reiner Neugier.....


Gruß
Gast #1977080
Lesenswert?

Wenn du dein Programm übersichtlich haben willst, aber trotzdem sehr 
Code-Effizient würde ich diese Abfrage in ein Makro packen. Wenn du den 
Pin natürlich sehr häufig an verschiedenen Stellen abfrägst ist das 
natürlich nicht so gut.
Gast #1977089
Lesenswert?

Als normale Funktion ist es schon okay. Der Compiler sollte eigentlich 
sehr klug entscheiden, ob er die Funktion von allein inlined (schneller 
in der Ausführung) oder nicht (weniger Code wenn die Funktion oft 
gebraucht wird), je nach Optimierungs-Parameter.
#1977090
Lesenswert?

Antwort schrieb:
> Wenn du dein Programm übersichtlich haben willst, aber trotzdem sehr
> Code-Effizient würde ich diese Abfrage in ein Makro packen. Wenn du den
> Pin natürlich sehr häufig an verschiedenen Stellen abfrägst ist das
> natürlich nicht so gut.

Daß ein Makro (oder das inline) ungünstiger wäre bei häufigem
Aufruf, glaube ich hier noch nicht einmal.
Ein Funktionsaufruf ist auch nicht kostenlos und kaum billiger
als das Testen eines Bits.
Gast #1977131
Lesenswert?

Klaus Wachtler schrieb:
> Daß ein Makro (oder das inline) ungünstiger wäre bei häufigem
> Aufruf, glaube ich hier noch nicht einmal.
> Ein Funktionsaufruf ist auch nicht kostenlos und kaum billiger
> als das Testen eines Bits.

Hmm? Das Bit muss so oder so getestet werden. Und wenn ich durch ein 
Makro oder ein "inline" einen Funktionsaufruf und einen Rücksprung 
spare, so ist die Ausführungszeit schneller. Eine ge-inline-te Funktion 
wird immer mindestens 2 Befehle schneller ausgeführt als eine normale 
Funktion, würde ich sagen. Zudem kann der Compiler die Funktion mit dem 
umgebenden Code optimieren, also noch ein bisschen Zeitgewinn. Auf 
Kosten der Codegröße. Der gcc entscheidet das bei entsprechenden 
Optionen sogar selbst.

(Andere Optimierungen wie const-Funktionen könnten u.U. noch besser 
sein. [const passt nicht zu unserem konkreten Beispiel.] Deshalb sollte 
man die Funktionen immer ausreichend markieren.)
Gast #1977133
Lesenswert?

Wow,

vielen Dank für die schnellen und vielen Antworten!

Werd wohl bei der Variante von Klaus bleiben, einfach der 
Übersichtlichkeit halber. Nur warum gibts bei
1
return (RX_PORT & (1 << RX))==0;

folgende Fehlermeldung?

"..error: expected expression before '=' token"
#1977219
Lesenswert?

mh schrieb:
> Klaus Wachtler schrieb:
>> Daß ein Makro (oder das inline) ungünstiger wäre bei häufigem
>> Aufruf, glaube ich hier noch nicht einmal.
>> Ein Funktionsaufruf ist auch nicht kostenlos und kaum billiger
>> als das Testen eines Bits.
>
> Hmm? Das Bit muss so oder so getestet werden. Und wenn ich durch ein
> Makro oder ein "inline" einen Funktionsaufruf und einen Rücksprung
> spare, so ist die Ausführungszeit schneller. Eine ge-inline-te Funktion
> wird immer mindestens 2 Befehle schneller ausgeführt als eine normale
> Funktion, würde ich sagen.

Ich habe auch nicht von Rechenzeit gesprochen. Da ist die
inline-Version eh schneller.

Es ging mit bei dem obigen Zitat um die Anmerkung mit dem
häufigen Aufruf; der Nachteil hierbei kann bei Makro/inline sein,
daß der Code größer werden kann.
Dem habe ich für diesen Fall widersprochen, weil der Funktionsrumpf
eben nicht größer ist als der Aufruf (gemessen in Code im ROM).

> Zudem kann der Compiler die Funktion mit dem
> umgebenden Code optimieren, also noch ein bisschen Zeitgewinn. Auf
> Kosten der Codegröße. Der gcc entscheidet das bei entsprechenden
> Optionen sogar selbst.
>
> (Andere Optimierungen wie const-Funktionen könnten u.U. noch besser
> sein. [const passt nicht zu unserem konkreten Beispiel.] Deshalb sollte
> man die Funktionen immer ausreichend markieren.)

static ist hier das Mittel der Wahl, weil der Compiler dann
weiß, daß es außerhalb der Datei nicht benötigt wird.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren