Lowlevel
Lowlevel => Das Wiki => Thema gestartet 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.
-
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:
-
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
-
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.
-
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!
-
Bist du dir sicher, dass du mit Optimierungen und ohne Debugblub baust?
-
Debugblub
Ist das der -g parameter? wenn ja, dann mach ich das.
-
Exakt.
-
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?
-
Lies mal "man gcc". Optimierungen stellst du mit -Owert ein, wobei wert eines aus {0, 1, 2, 3, s} ist.