Hallo, warum benötigt man für jede Operation stets drei Register? ein Register z.B. wo man für einen Pin einstellen kann das der Pullup (intern) aktiviert ist, ein Register, dass dieser Pullup deaktiviert ist und noch ein weiteres Register, bei dem man rauslesen kann, ob der Pullup aktiviert ist? Welche Gründe erlauben nicht das verwenden von einem Register, welches den Pullup setzt? z.B. 0 für setzen und 1 für nicht setzen und das kann man dann auch noch auslesen? Wer kann mich da mal aufklären, warum das so gemacht wird. Bernd
Du kannst in Deinem FPGA alles so machen, wie Du lustig bist. Wenn ein Register reicht, nimmste eben nur eins. Peter
Ich weiß jetzt nicht genau, von welchem µC du sprichst, wenn überhaupt. Aber bei einigen (z.B. den SAMs von Atmel) gibt es getrennte Setz-, Lösch- und Leseregister, damit das Ändern einzelner Bits ohne Beeinflussung der übrigen mit einem einzelnen I/O-Zugriff geschehen kann. Normalerweise sind dazu immer zwei Zugriffe erforderlich: Lesen, logische Verknüpfung, Schreiben.
Meinst du mit "jeder Operation" jede Operation oder nur die port- (und afaik atmel) spezifischen Dinge, die du näher beschrieben hast? Erstes (schnelle Register-Register Operationen) ist Teil der RISC Architektur. Zweites wahrscheinlich eher persönlicher Geschmack der Atmel Menschen.
sorry, ich schreibe von den ARM7 µController von Atmel...
>getrennte Setz-, Lösch- und Leseregister
ja genau so ist es bei diesem Atmel µC auch. ok, das heißt es bringt
weniger arbeitsschritte mit sich, auch wenn man das im ersten moment
nicht gleich erkennt.
Bernd
Diese Register-Technik findet man vorrangig bei Prozessoren, die nicht in der Lage sind, in einem einzelnen Befehl selektiv einzelne Bits eines I/O-Ports zu ändern. Siehe Interrupt
vielen dank für die antworten; d.h. bei einer RISC Architektur ist es auch so, dass wenn der PIO Controller aktiviert ist und als Ausgang konfiguriert ist, man über die Register PIO_SODR (Set Output Data Register) und PIO_CODR (Clear Output Data Register) eine 1 oder eine 0 versenden kann bzw. versendet wird? soll eine 1 am Ausgang sein, muss das PIO_SODR Register gesetzt werden; wenn eine 0 am Ausgang sein soll, dann das PIO_CODR mit einer 1 ansprechen? Bernd
> sorry, ich schreibe von den ARM7 µController von Atmel... Ja, die habe ich mit den "SAMs" auch gemeint (AT91SAMxxx, natürlich gibt es auch andere ARMs von Atmel, aber die sind in ihrer On-Chip- Peripherie alle ähnlich). > ok, das heißt es bringt weniger arbeitsschritte mit sich, auch wenn > man das im ersten moment nicht gleich erkennt. In den meisten Fällen ist das so. Zusätzlich ist dadurch das Verändern einzelner Bits ein atomarer Vorgang, der nicht durch Interrupts unterbrochen werden kann (s. Kommentar von Andreas Kaiser). Beispiel: Du möchtest die Bits 8 bis 11 setzen, ohne die restlichen 28 Bits zu verändern. Die klassischen Methode besteht aus drei Schritten: 1. Auslesen des aktuellen Registerinhalts 2. Verodern des gelesenen Inhalts mit 0x00000f00 3. Zurückschreiben des Ergebnisses in das Register Manche Prozessoren (z.B. die Atmel AVRs) fassen diese drei Aktionen zu einem Befehl zusammen. Dadurch wird die Ausführung etwas schneller und atomar, trotzdem sind noch zwei I/O-Zyklen für die Registerzugriffe in (1) und (3) erforderlich. Bei den Atmel ARMs wird einfach die Maske 0x00000f00 in das Setzregister geschrieben. Die I/O-Hardware sorgt dafür, dass alle Registerbits, deren zugehörige Maskenbits 0 sind, nicht geändert werden. Dadurch entfällt der anfängliche Lesezugriff. Sollen allerdings auf einen Schlag alle 32 Bits geschrieben (einige davon gesetzt, die restlichen gelöscht) werden, kommt das klassische Verfahren mit einem Schreibzugriff aus, während man bei den Atmels ARMs erst über das Setzregister die 1-Bits, danach über das Löschregister die 0-Bits schreiben muss. Deswegen kann das Output-Datenregister über PIO_ODSR auch direkt beschrieben werden. > soll eine 1 am Ausgang sein, muss das PIO_SODR Register gesetzt > werden; wenn eine 0 am Ausgang sein soll, dann das PIO_CODR mit > einer 1 ansprechen? Richtig. Und wie oben geschrieben, können speziell beim Output-Datenregiester auch alle 32-Bits auf einmal über PIO_ODSR auf beliebige 0/1-Werte gesetzt werden.
Bernd Schuster wrote: > sorry, ich schreibe von den ARM7 µController von Atmel... Die ARM sind keine gute MC-Architektur für Steuerungen, da sie keine Bitbefehle haben. Auch haben sie keine Befehle, um schnell mal Interrupts zu sperren. Durch die 32Bit Breite ist es aber sehr warscheinlich, daß verschiedene Pins verschieden verwendet werden, z.b. auch in Interrupts. Ohne Bitbefehle muß man aber ein Register lesen, ändern, zurückschreiben und das geht nicht atomar, d.h. ein Interrupt kann dazwischen hauen und das Chaos ist perfekt. Man bräuchte dann für jeden einzelnen Bitbefehl riesige Codemonster. Daher der Ausweg, daß man Bits setzen oder löschen kann ohne vorheriges Lesen. Man muß dann keine Interrupts disablen. Peter
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.