Forum: Mikrocontroller und Digitale Elektronik Cortex M4 MK20DX256VMC7


von Chris (Gast)


Lesenswert?

Kann mir jemand erklären, warum zwei "uint32__t" hintereinadner 
geschrieben werden?!?
z.B. so:

PORTA_PCR19 &= (uint32_t)~(uint32_t)((PORT_PCR_ISF_MASK | 
PORT_PCR_MUX(0x07)));

Ist das nicht doppelt?!? Oder bezieht sich das erste uint32_t auf 
PORTA_PCR19 und das ~uint32_t auf den Ausdruck ((PORT_PCR_ISF_MASK | 
PORT_PCR_MUX(0x07)))?!?

Oder wie muss ich das verstehen?

P.S.: Das ist ein Auszug aus einem Beispiel von einem MK20DX256VMC7.

von W.S. (Gast)


Lesenswert?

Chris schrieb:
> Das ist ein Auszug aus einem Beispiel von einem MK20DX256VMC7.

MK20DX256VMC7.was bitte?

Der tatsächliche Inhalt der betr. Zeile dürfte etwa so aussehen:
PORTA_PCR19 &= ~(0xirgendwas | (1<<7));

Dieses PORT..MASK und PORT..MUX Geraffel finde ich einfach nur sch...e

Mein Rat: Schreib dir deine Port-Setup-Routinen lieber selbst - nach dem 
Lesen der diversen Manuals. Ja, ich weiß, bei den ExMotorolas ist alles 
Geschriebene recht schwer verdaulich. Ich kriege auch jedesmal Zustände 
beim Suchen und MichHalbtotBlättern.

W.S.

von Chris (Gast)


Lesenswert?

Danke Dir. Mitlerweile sind wir drauf gekommen. Ziemlich trivial und 
eigentlich logisch:

PORTA_PCR19 &= (uint32_t)~(uint32_t)((PORT_PCR_ISF_MASK |
PORT_PCR_MUX(0x07)));

((PORT_PCR_ISF_MASK | PORT_PCR_MUX(0x07))) ist halt irgendeine Maske. 
Die aber nicht 32 bit sein muss.
Deswegen wird sie in eine 32 bit gewandelt und jedes bit "gedreht" 
(~(uint32_t)).
Da diese Zahl aber auch negativ werden kann, wird sie in eine positive 
Zahl gewandelt ((uint32_t)). Deswegen die beiden (uint32_t)~(uint32_t). 
Die hatten mich verwirrt.

Trotzdem Danke für die Hilfe.

von Sascha (Gast)


Lesenswert?

Hallo, ohhh diese Definitionen ist wirklich manchmal sonstwo hergeholt.

Gruß Sascha

PS.Die Dokumentation in den Manuals ist wirklich Kapitelübergreifend 
verstreut.

von W.S. (Gast)


Lesenswert?

Chris schrieb:
> ((PORT_PCR_ISF_MASK | PORT_PCR_MUX(0x07))) ist halt irgendeine Maske.
> Die aber nicht 32 bit sein muss.
> Deswegen wird sie in eine 32 bit gewandelt und jedes bit "gedreht"
> (~(uint32_t)).
> Da diese Zahl aber auch negativ werden kann, wird sie in eine positive
> Zahl gewandelt ((uint32_t)). Deswegen die beiden (uint32_t)~(uint32_t).
> Die hatten mich verwirrt.

zu Recht.
Ich möchte mal denjenigen sehen, der eine dediziert unsigned Zahl 
negativ hinbekommt...

Aber zum Verständnis: mit einem Typecast ist keinelei Umwandlung 
verbunden, sondern lediglich die Auffassung vom Operanden festgenagelt. 
Das ist ein gravierender Unterschied. Deine Worte lesend bin ich mir 
nicht sicher, ob du das richtig verstanden hast.

Nochmal: Laß von all diesen vigilantischen 
Präprozessor-Steptanz-Einlagen lieber die Finger und schreib dir das 
benötigte Zeugs selber - und zwar so, daß du es auf den 1. Blick 
verstehst. Auf Dauer lebst du damit besser, weil es einfacher und damit 
überschaubarer ist.

W.S.

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
Noch kein Account? Hier anmelden.