bestimmte Define



  • Hallo zusammen,

    in meinem Code kommt es in einem ganz speziellen Fall auf jeden CPU-Takt an.

    Ich habe:

    #define GPRS_Power_Pin(abc) if(abc) {SetBit(Slave_Power_PORT.OUT, Slave_Power_Bit);} else {ClrBit(Slave_Power_PORT.OUT, Slave_Power_Bit);}
    

    geschrieben. Der Compiler macht die Übersetzung auch Richtig. Bin mir aber nicht sicher, ob das nur Zufall ist oder ob der Code so stimmt:

    Wenn ich

    GPRS_Power_Pin(1);
    

    im Code aufrufe, dann darf nur:

    SetBit(Slave_Power_PORT.OUT, Slave_Power_Bit);
    

    entstehen.

    Und wenn ich

    GPRS_Power_Pin(0);
    

    im Code aufrufe, dann darf nur:

    ClrBit(Slave_Power_PORT.OUT, Slave_Power_Bit);
    

    entstehen.

    Stimmt die Definition so? Oder ist es nur Zufall das es richtig übersetzt wird?

    Dank für Eure Hilfe.



  • Was spricht gegen eine "normale" Funktion statt Macro? Der Compiler wird sie schon inlinen, wenn das sinnvoll ist und sollte auch das if wegoptimieren. Überprüfe im Zweifelsfall bei gcc.godbolt.org (ok, vielleicht musst du es bei dir im größeren Zusammenhang testen). Jedenfalls: warum überhaupt diese Funktion, wenn sie nichts anderes macht als auf konstante 0/1 eine jeweils andere Funktion aufzurufen? Dann könnte man auch GPRS_Power_Pin_Off() und GPRS_Power_Pin_On() machen. Oder ein template <int N> nebst if constexpr(N == 0) ... Ich wette, dass es alles nach dem Optimieren gleich ist.

    Und schließlich: wie bist du darauf gekommen, dass das if hier kritisch sein könnte?



  • wob schrieb:

    Was spricht gegen eine "normale" Funktion statt Macro? Der Compiler wird sie schon inlinen, wenn das sinnvoll ist und sollte auch das if wegoptimieren. Überprüfe im Zweifelsfall bei gcc.godbolt.org (ok, vielleicht musst du es bei dir im größeren Zusammenhang testen). Jedenfalls: warum überhaupt diese Funktion, wenn sie nichts anderes macht als auf konstante 0/1 eine jeweils andere Funktion aufzurufen? Dann könnte man auch GPRS_Power_Pin_Off() und GPRS_Power_Pin_On() machen. Oder ein template <int N> nebst if constexpr(N == 0) ... Ich wette, dass es alles nach dem Optimieren gleich ist.

    Und schließlich: wie bist du darauf gekommen, dass das if hier kritisch sein könnte?

    Hallo Wob,

    ja ich könnte zwei verschiedene Define machen. Möchte ich aber nicht. Ich möchte entweder

    GPRS_Power_Pin(1)
    

    oder

    GPRS_Power_Pin(0)
    

    aufrufen

    Ich habe im Ansi C Buch nachgeschaut und finde kein Bespiel ob dieser Code überhaupt möglich ist.

    #define GPRS_Power_Pin(abc) if(abc) {SetBit(Slave_Power_PORT.OUT, Slave_Power_Bit);} else {ClrBit(Slave_Power_PORT.OUT, Slave_Power_Bit);}
    

    Daher bin ich auch nicht sicher, ob das so richtig ist.



  • Das sollte funktionieren:

    #define SETBIT0 ClrBit
    #define SETBIT1 SetBit
    #define GPRS_Power_Pin(abc) SETBIT##abc(Slave_Power_PORT.OUT, Slave_Power_Bit)
    

    Das transformiert

    void f() {
      GPRS_Power_Pin(0);
      GPRS_Power_Pin(1);
    }
    

    nach

    void f() {
      ClrBit(Slave_Power_PORT.OUT, Slave_Power_Bit);
      SetBit(Slave_Power_PORT.OUT, Slave_Power_Bit);
    }
    


  • @Chris233
    Bei deinem define kann abc auch durch eine Variable ersetzt werden. dann muss der Compiler das komplette if-else einbauen.

    Wenn da aber eine Konstante ist, kann er optimieren, wenn du ihn läßt.


Log in to reply