-         

Ergebnis 1 bis 5 von 5

Thema: setbit, clearbit, usw. PORTG Bitoperationen-Krampf

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    07.03.2008
    Ort
    Nürnberg
    Alter
    34
    Beiträge
    51

    setbit, clearbit, usw. PORTG Bitoperationen-Krampf

    Anzeige

    Hi!

    Ich habe eineinhalb Wochen verschwendet,
    nur um festzustellen dass der GCC aus diesen beiden Zeilen
    tatsächlich unterschiedlichen Code generiert:
    Code:
    #define SETBIT(ADRESS, BIT)   (ADRESS |=  (1<<BIT))
    #define SETBIT(ADRESS, BIT)   (ADRESS = (ADRESS | (1<<BIT)))
    Jeder der ANSI-C kennt wird sich denken dass die Zeilen ja eigentlich identisch sind (inklusive mir), da es sich ja eigentlich nicht um einen Bitweisen Zugriff des Registers handelt. Der GCC sieht das aber anders.
    Die Leute unter euch die den ATmega in Assembler programmieren kennen das ja bereits, für jemanden der C programmiert ist das aber eine Neuheit.

    Da beim Atmega128 der PortG in einem höheren Speicherbereich liegt,
    funktionieren für diesen die normalen Bitoperationen nicht mehr.
    Also statt:
    Code:
    #define SETBIT(ADRESS, BIT)   (ADRESS |=  (1<<BIT))
    #define CLEARBIT(ADRESS, BIT) (ADRESS &= ~(1<<BIT))
    #define CHECKBIT(ADRESS, BIT) (ADRESS &   (1<<BIT))
    #define TOGGLEBIT(ADRESS, BIT) (ADRESS ^= (1 << BIT))
    Einfach folgendes nehmen:
    Code:
    #define SETBIT(ADRESS, BIT)   (ADRESS = (ADRESS | (1<<BIT)))
    #define CLEARBIT(ADRESS, BIT) (ADRESS = (ADRESS & ~(1<<BIT)))
    #define CHECKBIT(ADRESS, BIT) (ADRESS & (1<<BIT))
    #define TOGGLEBIT(ADRESS, BIT) (ADRESS = (ADRESS ^(1 << BIT)))
    Hab sonst nichts dazu im Netz gefunden.
    Den entscheidenden Hinweis hab ich irgendwo im Netz in einer Assembler-Ecke gefunden.

    Hab das jetzt hier mal gepostet damit die nächste arme Sau das nicht mitmachen muss...

    Hatte von euch schon mal jemand das Problem?

    Gruß

    PS: Hat jemand einen passenderen Titel für den Thread?

    Edit 1: Verwendete AVR Studio Version: 4.14 Build 589
    Verwendete Optimierung: -Os

  2. #2
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Ich habe eineinhalb Wochen verschwendet,
    nur um festzustellen dass der GCC aus diesen beiden Zeilen
    tatsächlich unterschiedlichen Code generiert:
    Wäre schön gewesen, wenn du diesen unterschiedlichen Code mitgepostet hättest, und am besten auch noch die verwendetet Kommandozeile und die AVR-GCC-Version.
    Bei mir ist der generierte Code nämlich absolut identisch.
    MfG
    Stefan

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    07.03.2008
    Ort
    Nürnberg
    Alter
    34
    Beiträge
    51
    Hi!
    Gute Idee!
    Versuche ich heute abend mal nachzuholen.
    Hab die Version hinzugefügt.

    Gruß

  4. #4
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Die Version vom AVR-Studio ist eigentlich uninteressant, denn das Studio hat mit der Codegenerierung nichts zu tun. Die Version vom AVR-GCC ist wichtig.
    MfG
    Stefan

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    07.03.2008
    Ort
    Nürnberg
    Alter
    34
    Beiträge
    51
    Hi!
    Hat sich erledigt!
    Hab gestern die neuste winavr-Version drüberinstalliert.
    Jetzt kommt beides mal das selbe raus.
    Code:
    +00000300:   E6E5        LDI     R30,0x65         Load immediate
    +00000301:   E0F0        LDI     R31,0x00         Load immediate
    +00000302:   8180        LDD     R24,Z+0          Load indirect with displacement
    +00000303:   7F8B        ANDI    R24,0xFB         Logical AND with immediate
    +00000304:   8380        STD     Z+0,R24          Store indirect with displacement
    Im Prinzip ist dieser Thread jetzt überflüssig...

    Gruß

Berechtigungen

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