-
        

Ergebnis 1 bis 4 von 4

Thema: Compiler-Optimierung bei Register-Variablen

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    25.10.2005
    Alter
    64
    Beiträge
    157

    Compiler-Optimierung bei Register-Variablen

    Anzeige

    Hallo, ich bin am verzweifeln!

    Google und auch die Suche hier im Forum hat mir nicht weiter geholfen. Ich möchte Variablen in einem Register ablegen. Leider optimiert der Compiler die Zugriffe auf die Variable komplett weg.

    Hier das auf das Minimum reduzierte Testprogramm (Optimierungseinstellung -Os, wie bei µC-Programme üblich):

    Code:
    register unsigned char Data asm("r6");
    
    int main(void)
    { while(1)  
      { Data++;  
      }
    }
    führt zu Assembler-Code:
    Code:
    int main(void)
    { while(1)
    30: ff cf    rjmp .-2 ; 0x30 <main>
    Deklariere ich "Data" als
    Code:
    volatile unsigned char Data;
    erhalte ich das erwartete Ergebnis (Assembler):
    Code:
    int main(void)
    { while(1)
      { Data++;  
    40: 80 91 60 00   lds   r24, 0x0060  
    44: 8f 5f         subi  r24, 0xFF  ; 255
    46: 80 93 60 00   sts   0x0060, r24  
    44: fa cf         rjmp  .-12       ; 0x40 <main>
    Wenn man bei der Register-Deklaration ein "volatile" hinzufügt, ändert sich außer einer zusätzlichen Compiler-Warnung nichts.

    Benutzen möchte ich solch einen Code in einem Projekt, bei dem eine in Assembler geschriebene ISR einen Wert in einem Register ablegt. Die Speicherzugriffe möchte ich mir deshalb -besonders in der ISR- ersparen.

    Ich benutze das Atmel-Studio in der Version 6.1. Das komplette Projekt habe ich als Datei angefügt.

    Wie kann ich den Compiler dazu überreden, den Registerinhalt zu ändern?

    Viele Grüße RedBaron
    Angehängte Dateien Angehängte Dateien

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    27.08.2013
    Ort
    Region Basel
    Alter
    59
    Beiträge
    2.435
    Hallo RedBaron,

    1. Naja:
    Code:
    register unsigned char Data asm("r6");
    
    int main(void)
    { while(1)  
      { Data++;  
      }
    }
    Ist für einen optimierenden Compiler auch unsinnig, Data wird nirgends verwendet, also weg damit.
    Versuch mal:
    Code:
    register unsigned char Data asm("r6");
    unsigned char b;
    
    int main(void)
    { while(Data)  
      { Data++;  
      }
      b = Data;
    }
    2. register ist und war immer nur eine Empfehlung an den Compiler. Der kann das berücksichtigen.
    Was er Compiler mit register macht, sollte unter "Implementation Specific" nachzulesen sein.

    MfG Peter(TOO)

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.801
    > Versuch mal [...]

    Das ist dann gleichbeutend mit R6 = 0

    > 2. register ist und war immer nur eine Empfehlung an den Compiler.

    Nein, hier ist es keine "Empfehlung". Globale Register sind eine GNU-Erweiterung. Guckst du im GCC-Handbuch bei

    Extensions to the C Language Family -> Variables in Specified Registers ->Defining Global Register Variables

    Die Frage des OP bezüglich globaler Register wird hier beantwortet: http://www.mikrocontroller.net/topic/312598
    Disclaimer: none. Sue me.

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    25.10.2005
    Alter
    64
    Beiträge
    157
    ich glaube, ich habe jetzt eine akzeptable Lösung gefunden:

    register uint8_t Reg3 asm("r3");

    static inline __attribute__((always_inline)) void SetReg3(uint8_t tmp)
    { asm volatile ("mov r3, %0" : : "r" (tmp): "r3");}

    static inline __attribute__((always_inline)) uint8_t GetReg3(void)
    { uint8_t tmp; asm volatile ("mov %0, r3": "=r" (tmp)); return tmp;}

    wird kompiliert zu "mov r3, r24" und "mov r24, r3". Je nach Konstellation ersetzt der Compiler r24 durch ein anderes Register.

    Das Ganze ist (noch) nicht 100%-tig optimal, kommt der Anforderung aber schon sehr nahe. Hier hab ich noch einmal beschrieben.

    vg RdBaron

Ähnliche Themen

  1. gleiche register bei atmega32 und 16
    Von avrrobot im Forum C - Programmierung (GCC u.a.)
    Antworten: 1
    Letzter Beitrag: 20.02.2011, 10:19
  2. Hilfe bei Optimierung von Ports setzen
    Von graffiti im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 4
    Letzter Beitrag: 06.07.2008, 22:25
  3. benötige Hilfe bei Register
    Von Hansi41 im Forum Asuro
    Antworten: 5
    Letzter Beitrag: 19.01.2008, 14:33
  4. 2 verschiedene Variablen greifen auf das selbe Register zu
    Von Hepta im Forum C - Programmierung (GCC u.a.)
    Antworten: 6
    Letzter Beitrag: 10.09.2007, 16:39
  5. Gefahren bei schreiben ins Register TIMSK?
    Von fambi_mail im Forum AVR Hardwarethemen
    Antworten: 4
    Letzter Beitrag: 28.02.2006, 14:36

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •