Hi, CORTEX M3 µC bieten ja das Bitbanding feature. Gerade wenn man nur ein einzelnes Bit in einem Register ändern will scheint das dazu ja ideal, da nur ein Schreibzugriff und kein read-modify-write notwendig (ich spreche hier von einem Fujitsu der kein BSS/BRR wie der STM32 hat). Sehe ich das richtig, oder gibt es Gründe, die gegen BitBanding sprechen? Gruß Thomas
Gast
#2591905
Hallo, ich kenne den Prozessor (welchen eigentlich) nicht, aber ich rate zum genauen Studium des Manuals: es gibt Prozessoren, die Bit-Befehle aufweisen, diese aber mit einem internen Read-Modify-Write ausführen. Dann bestehen natürlich die gleichen Probleme. Gruss Reinhard
Es handelt sich um den FM3 M9BF314L
Thomas Burkhart schrieb: > da nur ein Schreibzugriff und kein read-modify-write notwendig RMW ist es trotzdem, nur macht das beim Bitbanding der Core selbst, es sind keine 3 Befehle sondern nur einer.
ok, schon klar, aber d.h. doch, dass meine codesize kleiner wird und dass es schneller ausgeführt wird, oder nicht?
Das BitBanding is ne feine Sache, geht sehr schnell und lässt sich intuitiv bedienen, wenn man sich die Makros richtig zusammenbaut. Es gibt jedoch zumindest einen Fallstrick über den ich schon gestolpert bin. Es gibt bestimmte Bits in Statusregistern, die sich durch das Lesen automatisch zurücksetzen. Das klappt mit BitBanding nicht unbedingt. Das sollte man bei der Fehlersuche im Auge behalten und sich nicht wundern.
@rangi: Hast Du mal ein beispiel für so ein Makro?
Thomas Burkhart schrieb: > ok, schon klar, aber d.h. doch, dass meine codesize kleiner wird und > dass es schneller ausgeführt wird, oder nicht? Ob schneller weiss ich nicht, mag sein. Jedenfalls aber ist es nicht durch Interrupts unterbrechbar.
Hier z.b. fürn STM32F103 das Tx-Enable Bit der ersten seriellen Schnittstelle
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
sowas findest du aber bestimmt auch beim Hersteller
Beitrag "Re: arm-none-eabi-gcc: Verwendung von "immediate offset" erzwingen" Ist aber in dieser Form nicht direkt auf anderen Compilern als GCC verwendbar.
Gast
#2592139
A. K. schrieb: > Ob schneller weiss ich nicht, mag sein. Jedenfalls aber ist es nicht > durch Interrupts unterbrechbar. Das ist nur ein Problem, ein anderes ist die Frage, mit welchem Register RMW ausgeführt wird. Handelt es sich um ein Ausgaberegister des entsprechenden Ports, ist das ok, wird dagegen RMW direkt am Port ausgeführt, so werden Eingänge eingelesen und dann mit dem gleichen Wert beschrieben, was Nebenwirkungen auf die nicht betroffenen Bits hat. Eigentlich müsste ein solcher Bit-Set-Befehl verboten sein, wenn er Nebenwirkungen hat, aber meines Wissens gibt es das doch irgendwo. Gruss Reinhard
Gast
#2592178
Thomas Burkhart schrieb: > @rangi: Hast Du mal ein beispiel für so ein Makro? Ich nehm sowas:
1 | |
Bitbanding auf dem M3 ist aber lt. J.Yiu nur für das erste MB des SRAM und das erste MB der "peripheral region" gültig. Für den NVIC klappts somit leider nicht
Reinhard Kern schrieb: > Das ist nur ein Problem, ein anderes ist die Frage, mit welchem Register > RMW ausgeführt wird. Handelt es sich um ein Ausgaberegister des > entsprechenden Ports, ist das ok, wird dagegen RMW direkt am Port > ausgeführt, so werden Eingänge eingelesen und dann mit dem gleichen Wert > beschrieben, was Nebenwirkungen auf die nicht betroffenen Bits hat. Ja, aber das ist bei dem programmierten nicht-atomaren Äquivalent reg |= 1<<bit; auch nicht anders. Solange man die Bitbandings als atomares Pendant davon betrachtet liegt man im grünen Bereich. Man darf es nur nicht als exaktes Äquivalent zu den verbreiteten BitSet/Clr I/O-Registern sehen. Wenn man im NXP Produktspektrum wildert, dann muss man natürlich auch im Auge behalten, dass nicht alle LPC1000er einen CM3 Core enthalten und der CM0 kein Bitbanding kann.
PS: Ich habe grad mal bei den FM3 reingesehen. Die verwenden sinnvollerweise getrennte Register für rein und raus, vgl. AVR. Daher kann Bitbanding gefahrlos auf das Output Register angewandt werden. Das gehört sowieso zu einer meiner ersten Fragen beim Blick ins Manual eines unbekannten Controllers. Wenn da sowas konfuses wie die ARM Macrocell drinsteckt (STR9, LM3), dann sieht es schlecht aus. Auch bei den STR7 ist dieser Aspekt ziemlich dubios.
Dank euch!
Siehe ARM Bitbanding
A. K. schrieb: > Siehe ARM Bitbanding Gute Arbeit! Danke!
Super Artikel! Ich habe in der Zwischenzeit gesehen, das beim CM3 von Fujitsu in den Includes des Herstellers sogar alle Bits aller Register als #defines vorliegen. Gruß Thomas
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.