PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : setbit, clearbit, usw. PORTG Bitoperationen-Krampf



error41
25.09.2008, 22:15
Hi!

Ich habe eineinhalb Wochen verschwendet,
nur um festzustellen dass der gcc aus diesen beiden Zeilen
tatsächlich unterschiedlichen Code generiert:

#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:

#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:

#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

sternst
26.09.2008, 05:32
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.

error41
26.09.2008, 11:58
Hi!
Gute Idee!
Versuche ich heute abend mal nachzuholen.
Hab die Version hinzugefügt.

Gruß

sternst
26.09.2008, 13:24
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.

error41
26.09.2008, 13:51
Hi!
Hat sich erledigt!
Hab gestern die neuste winavr-Version drüberinstalliert.
Jetzt kommt beides mal das selbe raus.

+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ß