Hallo, ich arbeite mich gerade in das Thema µC Programmierung ein. In einem Beispiel bin ich auf folgende Zeile gestoßen: GPIOA->MODER &= ~((3UL << 2*0) ); ich weiß, dass ein Bit manipuliert wird aber ich kann mit dem Code "3UL << 2*0" nicht anfangen und habe auch in dem Artikel zur Bitmanipulation nichts gefunden. Kann mir jemand helfen? Vielen Dank Klaus
Ist mir auch etwas schleierhaft was das soll... Ein 3 << 2 tuts doch auch.
Ingo schrieb: > Ist mir auch etwas schleierhaft was das soll... Ein 3 << 2 tuts doch > auch. nicht wenn GPIOA->MODER 32bit ist und das ganze auf einer 8 oder 16 bit platform läuft.
Normalerweise ist das "0" ja die Pin-Nummer, dann würde das z.B. eher so aussehen:
1 | GPIOA->MODER &= ~(0x03<<(2*PIN)) ; // Mode mask |
Wobei PIN dann z.B. der Übergabeparameter einer Funktion ist.
Naja, das UL macht schon Sinn, aber das 2*0 verstehe ich nicht
Wie gesagt, normalerweise ist das "0" eine Pinnummer, bloß derjenige der das obige Beispiel gecoded hat, hat fest "pin0" eincodiert. Vermutlich wollte er so den Ursprung "2*PIN_nr" bewahren.
Ingo schrieb: > Naja, das UL macht schon Sinn Nicht wirklich, denn dieser Code findet sich in einem uvision Beispiel für ARM, Blinky.c. Das 2*0 allerdings ergibt Sinn, wenn man von 2 Config-Bits pro Portbit ausgeht. Es sich also um Bit 0 handelt. Ingo schrieb: > Ein 3 << 2 tuts doch Weil 2*0 == 2?
Vielen Dank für die ganze Hilfe. Also ich habe jetzt gerade einfach mal etwas rumprobiert: wenn ich GPIOA->MODER &= ~((3UL << 2*0) ); ersetze durch GPIOA->MODER &= ~((0x03 << 2*0) ); Ändert sich an der Funktion auf dem Board nichts. Kann ich also davon ausgehen dass es identisch ist? Was mir aber immernoch nicht ganz klar ist: was war die ursprüngliche Überlegung der Person die den Code erstellt hat?
aus "~(3UL)" wird immer 0xFFFFFFFC, aus ~(0x03) kann je nach Compiler und Architektur auch nur ein 0xFC werden. Damit würden in diesem Fall auch die oberen Bits [31:8] zurückgesetzt, was aber in diesem Fall ja gerade nicht gewünscht ist.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.