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