Autor Thema: outb in Tutorials  (Gelesen 6420 mal)

micha

  • Beiträge: 141
    • Profil anzeigen
Gespeichert
« 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.

XanClic

  • Beiträge: 261
    • Profil anzeigen
    • github
Gespeichert
« Antwort #1 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:

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #2 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

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #3 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.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

micha

  • Beiträge: 141
    • Profil anzeigen
Gespeichert
« Antwort #4 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!

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #5 am: 11. April 2012, 19:15 »
Bist du dir sicher, dass du mit Optimierungen und ohne Debugblub baust?
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

micha

  • Beiträge: 141
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 11. April 2012, 19:39 »
Zitat
Debugblub
Ist das der -g parameter? wenn ja, dann mach ich das.

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #7 am: 12. April 2012, 21:40 »
Exakt.
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

micha

  • Beiträge: 141
    • Profil anzeigen
Gespeichert
« Antwort #8 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?

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #9 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.

 

Einloggen