Gast
#5681264
Nabend, Wieso verundet man das Register mit 0? Was macht das für einen Sinn?
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
|
Anzeige
|
Wieso Wert nicht gleich auf 0 setzen?
Gast
#5681264
Nabend, Wieso verundet man das Register mit 0? Was macht das für einen Sinn?
Gast
#5681276
>Wieso verundet man das Register mit 0? Was macht das für einen Sinn?
Es macht keinen Sinn.
Gast
#5681277
Ich wüsste keinen allgemeinen Grund. Für welchen Controller und welchen Compiler ist das? Hansi H. schrieb: > Wieso verundet man das Register mit 0? Das mußt Du den Autor des Schnipsels fragen. Vielleicht steht auch was dazu im Datenblatt des unbekannten MCs.
Gast
#5681291
Es handelt sich um einen At90CAN128. Hier der Code.
Hansi H. schrieb: > Hier der Code. Und woher ist der? Ist das ein offizielles Beispiel von Microchip.
Gast
#5681340
Hallo Laut Datenblatt des At90CAN128: To acknowledge a MOb interrupt, the corresponding bits of CANSTMOB register (RXOK, TXOK,...) must be cleared by the software application. This operation needs a read-modify-write software routine. Hansi H. schrieb: > CANSTMOB &= 0; entspricht ja CANSTMOB = CANSTMOB & 0; Das Register wird hier zuerst gelesen (read), danach mit & 0 auf 0 gesetzt (modify) und abschließend wieder geschrieben (write).
Gast
#5681345
Habe ich hier auf der Seite gefunden.. https://github.com/dergraaf/avr-can-lib/blob/master/src/at90can.c
Gast
#5681352
Datenblatt schrieb im Beitrag #568134 > Hansi H. schrieb: > CANSTMOB &= 0; > > entspricht ja > CANSTMOB = CANSTMOB & 0; > > Das Register wird hier zuerst gelesen (read), danach mit & 0 auf 0 > gesetzt (modify) und abschließend wieder geschrieben (write). Das macht natürlich Sinn. Danke für die Erklärung. Hansi H. schrieb: > Wieso verundet man das Register mit 0? Was macht das für einen Sinn? Bugreport an den Author des Quellcodes. (Github: Issues). Falls das wirklich so gedacht war (Zusätzlicher Lesezugriff auf das Register) dann muss da mindestens ein aussagekräftiger Kommentar sein.
Gast
#5681370
Hansi H. schrieb: > CANGIT |= 0; Register lesen und unverändert zurückschreiben ist mir bisher auch noch nicht untergekommen. Wenn das denn sein muss würde ich zumindest CANGIT = CANGIT schreiben
Gast
#5681385
Walter schrieb: > Hansi H. schrieb: > CANGIT |= 0; > > Register lesen und unverändert zurückschreiben ist mir bisher auch noch > nicht untergekommen. Wenn das denn sein muss würde ich zumindest > CANGIT = CANGIT > schreiben Zumal ist das wahrscheinlich noch schneller.
Gast
#5681395
Jim M. schrieb: > Falls das wirklich so gedacht war (Zusätzlicher Lesezugriff auf das > Register) dann muss da mindestens ein aussagekräftiger Kommentar sein. Bei uC, besonders bei serieller IO ist es üblich, das Register gelesen und beschrieben werden müssen. Niemand würde, ohne das DB zu lesen, solch Registerzugriffe in der Reihenfolge vertauschen oder "optimieren". Ein Kommentar? Didaktisch OK. Je nach skills der Zielgruppe. Am Ende will man aber weder das DB im Code haben, noch bei jeder RMW-operation dabeischreiben, dass es eine sein soll. Walter schrieb: > Hansi H. schrieb: >> CANGIT |= 0; > > Register lesen und unverändert zurückschreiben ist mir bisher auch > noch nicht untergekommen. Der Grund dürfte der gleiche sein wie im Beispiel weiter oben: das Lesen des Registers hat einen hardwareseitigen Effekt, der benötigt wird. Hansi H. schrieb: >> Wenn das denn sein muss würde ich zumindest >> CANGIT = CANGIT schreiben > Zumal ist das wahrscheinlich noch schneller. Der Compiler wird die Veroderung mit 0 wegoptimieren.
Gast
#5681424
>Der Compiler wird die Veroderung mit 0 wegoptimieren.
Das darf er nicht weil CANGIT volatile ist.
Gast
#5681447
holger schrieb: >>Der Compiler wird die Veroderung mit 0 wegoptimieren. > > Das darf er nicht weil CANGIT volatile ist. Es geht ums oder. Das darf er wegoptumieren. Dann sind beide Zeilen gleichwertig. Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|