Lowlevel

Lowlevel => Das Wiki => Thema gestartet von: micha am 11. April 2012, 10:11

Titel: outb in Tutorials
Beitrag von: micha am 11. April 2012, 10:11
Hallo

Ich habe da eine Frage zu der outb-funktion, wie sie im tutorial definiert ist.
Dort sieht sie so aus:
static inline void outb(uint16_t port, uint8_t data)
{
    asm volatile ("outb %0, %1" : : "a" (data), "Nd" (port));
}
Wieso ist das denn nicht als Macro definert?

So funktioniert es doch auch:
#define outb(port, data) asm("outb %0, %1" : : "a" ((uint8_t)data), "Nd" ((uint16_t)port))
Vielleicht könnten mir das auch die Schreiber dieses Tutorials beantworten.
Titel: Re: outb in Tutorials
Beitrag von: XanClic am 11. April 2012, 11:08
Moin,

Unter anderem sicherlich deshalb, weil es ziemlich egal ist. Man könnte behaupten, aufgrund des static inline wird der Compiler die Funktion praktisch überall direkt in den Code einfügen, so, als ob es eigentlich ein Macro wäre – praktisch würde gcc das wohl auch ohne das inline tun, weil sie so kurz ist.

Und ansonsten ist es imho meist sauberer, eine Funktion zu erstellen als ein Macro in Funktionsform.

tl;dr: So ein Macro brächte keinen echten Vorteil, daher wird eine Funktion definiert. :wink:
Titel: Re: outb in Tutorials
Beitrag von: Svenska am 11. April 2012, 13:57
Hallo,

außerdem hast du das "volatile" in deinem Makro unterschlagen. Das solltest du drin lassen, damit der Compiler die OUT-Befehle nicht umheroptimiert (umsortiert, aus Schleifen herauszieht, ...).

Es gibt immer mehrere Möglichkeiten, ein Problem zu lösen. ;-)

Gruß,
Svenska
Titel: Re: outb in Tutorials
Beitrag von: kevin am 11. April 2012, 14:44
Makros sind viel einfacher falsch zu machen. Du hast das schön demonstriert: Um data und port gehören jeweils Klammern, das könnten nämlich Ausdrücke sein und du willst nicht nur den ersten Teil casten. Mit dem Cast verlierst du außerdem Typsicherheit. Du könntest jetzt zum Beispiel versehentlich einen Pointer reingeben und es würde trotzdem kompilieren.

tl;dr: Wenn es mit einer Funktion geht, ist die Funktion immer besser als ein Makro.
Titel: Re: outb in Tutorials
Beitrag von: micha am 11. April 2012, 16:51
Man könnte behaupten, aufgrund des static inline wird der Compiler die Funktion praktisch überall direkt in den Code einfügen, so, als ob es eigentlich ein Macro wäre – praktisch würde gcc das wohl auch ohne das inline tun, weil sie so kurz ist.

tl;dr: So ein Macro brächte keinen echten Vorteil, daher wird eine Funktion definiert. :wink:

Bin ich nicht der Meinung! Wenn ich mein kernel mit den Funktionen dissasembliere, fügt gcc mir das nicht ein!
Titel: Re: outb in Tutorials
Beitrag von: bluecode am 11. April 2012, 19:15
Bist du dir sicher, dass du mit Optimierungen und ohne Debugblub baust?
Titel: Re: outb in Tutorials
Beitrag von: micha am 11. April 2012, 19:39
Zitat
Debugblub
Ist das der -g parameter? wenn ja, dann mach ich das.
Titel: Re: outb in Tutorials
Beitrag von: bluecode am 12. April 2012, 21:40
Exakt.
Titel: Re: outb in Tutorials
Beitrag von: micha am 13. April 2012, 14:01
Ich habs mal ohne -g probiert. Aber einsetzten tut er das outb nicht. die Funktionen outb/w/l gibt's immernoch und der macht mir ein call outb hin. liegt das on den Optimirungen? Wie schalte ich die an?
Titel: Re: outb in Tutorials
Beitrag von: Svenska am 13. April 2012, 15:05
Lies mal "man gcc". Optimierungen stellst du mit -Owert ein, wobei wert eines aus {0, 1, 2, 3, s} ist.