Frage:
Was ist Access RAM in der PIC18-Serie und wie wird es genau verwendet?
AndrejaKo
2012-04-26 23:23:19 UTC
view on stackexchange narkive permalink

Ich lese Ressourcen zu PIC-Optimierungen und habe ein Dokument mit dem Namen MPLAB® C18 OPTIMIZATION TIPS gefunden. Eines der Dinge, die darin erwähnt werden, ist Access RAM . Ich weiß, dass es der Teil des RAM ist, der verwendet werden kann, ohne dass das Bankzugriffsregister verwendet werden muss, und dass es einen schnelleren Zugriff auf darin gespeicherte Variablen ermöglicht, aber mir ist immer noch nicht klar, wie genau ich es manuell verwenden soll und wann ich erwarten sollte, dass der Compiler es mit Variablen füllt.

Zuerst habe ich nicht verstanden, warum dies schwer zu verstehen war, aber nachdem ich mir diesen Leitfaden angesehen habe, stimme ich zu - ich habe keine Ahnung, was sie zeigen wollen, welche Variable sich im Zugriffs-RAM befindet oder wie sich der C-Code darauf bezieht die ASM.
Zwei antworten:
Olin Lathrop
2012-04-27 01:04:51 UTC
view on stackexchange narkive permalink

RAM-Adressen auf einem PIC 18 sind 12 Bit breit. Das ist zu viel, um es in Einzelwortbefehlen aufzunehmen, die nur 16 Bit breit sind. Um weniger Adressbits in Anweisungen zu verwenden, als der Speicher tatsächlich hat, verwendet der PIC 18 eine segmentierte Architektur. Dies bedeutet, dass RAM in Segmente unterteilt ist, die in der PIC-Dokumentation Banken i> genannt werden. Jede Bank enthält 256 Bytes. Ein voller Speicher fasst 4096 Bytes, es gibt also 16 Bänke. Der 8-Bit-Adressoffset innerhalb einer Bank wird in Anweisungen angegeben, und die 4-Bit-Banknummer wird mit einem Status angegeben, der zur Laufzeit festgelegt werden kann und als BSR-Register bezeichnet wird.

Um einen effizienteren Zugriff zu ermöglichen Für einen ausgewählten Teil dieses 4096-Byte- oder 16-Bank-Speichers enthalten Befehle tatsächlich ein weiteres Adressbit. Diese Bank wählt zwischen einer von zwei Banken, der durch BSR identifizierten Bank und der Zugangsbank i>, die ein fester Satz von 256 Bytes ist, die für diesen PIC definiert sind. Die 256 Bytes der Zugriffsbank werden zwischen einigen der Sonderfunktionsregister am Ende von Bank 15 und einigen allgemeinen RAMs am Anfang von Bank 0 aufgeteilt. Wenn diese Aufteilung erfolgt, bedeutet dies, wie viele Bytes der Zugriffsbank sich in Bank 0 befinden und wie viele in Bank 15 variieren zwischen den Modellen in der PIC 18-Familie.

Der Zweck der Zugriffsbank besteht im Allgemeinen darin, unabhängig von der aktuellen BSR-Einstellung schnell auf einen der ausgewählten 256 Standorte zuzugreifen. Bestimmte Kernregister wie STATUS, PRODH, PRODL usw. befinden sich immer im Zugriffsbankteil in Bank 15. Die Vorteile sollten offensichtlich sein, da zum Festlegen des BSR kein Code erforderlich ist und durch den Zugriff auf diese Register BSR erhalten werden kann.

Der Vorteil im allgemeinen RAM ist ähnlich. Der Anwendungscode kann auf Variablen in diesem Teil der Zugriffsbank zugreifen, ohne dass der Aufwand für das Festlegen der aktuellen Bank anfällt, wodurch auch hier die aktuelle Bankeinstellung nicht beschädigt wird. Da der für Register verfügbare Zugriffsspeicher begrenzt ist, müssen Sie sorgfältig überlegen, was Sie dort ablegen möchten und was besser im Bankspeicher abgelegt ist, damit etwas anderes vom schnellen Zugriff auf die Zugriffsbank profitieren kann. Beispielsweise ist die Zugangsbank im Allgemeinen für große Puffer ungeeignet. Ein einzelner Puffer könnte leicht größer sein als der allgemeine RAM-Teil der Zugriffsbank, und er wird wahrscheinlich ohnehin indirekt über die FSR-Register adressiert. Diese enthalten die vollständige 12-Bit-Adresse, sodass das Banking nicht für indirekte Referenzen gilt.

Behalten Sie im Allgemeinen die häufig verwendeten individuellen und allgemein globalen Variablen in der Zugriffsbank bei. Es gibt viel Platz, wenn Sie jeweils nur ein Byte verwenden. In meinem System verwende ich standardmäßig die ersten 16 Bytes als allgemeine Register, die häufig als lokaler Arbeitsbereich und zum Übergeben von Parametern in und aus dem Unterprogramm verwendet werden. Diese werden viel herumgeschleudert, so dass sie vom einfachen Zugang profitieren. Danach lege ich normalerweise einzelne globale Variablen in die Zugriffsbank und den privaten lokalen Status jedes Moduls vollständig in eine Bank, wenn dies möglich und sinnvoll ist. Das bedeutet, dass Code in einem Modul nur auf Daten in einer Bank und auf die wenigen globalen Variablen in der Zugriffsbank zugreifen muss.

Dies sind natürlich nur allgemeine Richtlinien. Jedes Projekt ist anders und Sie müssen darüber nachdenken, was Sinn macht.

Um Speicher in der Zugriffsbank in Assembler zuzuweisen, verwenden Sie die Direktive UDATA_ACS anstelle von UDATA für Bankspeicher. Ich denke, der Compiler hat einen ähnlichen Klangmechanismus. Weitere Informationen finden Sie im Compiler-Handbuch.

Hallo, wird die Verwendung von Zugangsbankadressen die Werte von SFR-Registern beeinträchtigen?In PIC18 werden Adressen von 0xFD8 bis 0xFFF als SFR verwendet.
supercat
2012-04-27 00:54:34 UTC
view on stackexchange narkive permalink

Je nachdem, welchen PIC und Befehlssatz Sie verwenden, kann es zwischen 0 und 128 Byte "Zugriffsspeicher" geben. Auf Variablen im Zugriffs-RAM kann schneller und mit weniger Code zugegriffen werden als auf andere Variablen. Wenn ein Programm jedoch nicht recht einfach ist, können nicht alle Variablen im Zugriffs-RAM abgelegt werden. Compiler können theoretisch beurteilen, wie viel Code gespeichert werden würde, indem bestimmte Variablen oder Kombinationen davon in den Zugriffsspeicher gestellt werden, aber ich habe noch nie gesehen, dass einer gute Arbeit geleistet hat. Außerdem können Compiler im Allgemeinen nicht sagen, welche Beschleunigungen wichtig oder unwichtig sind. Infolgedessen ist es für Programmierer manchmal hilfreich, bestimmte Variablen für die Platzierung im Access RAM festzulegen. Das Platzieren so vieler Variablen wie möglich im Access RAM schadet im Allgemeinen nicht, vorausgesetzt, im Access RAM ist Platz für alle so bezeichneten Variablen. Der Versuch, mehr Variablen im Access RAM zu platzieren, als passen, führt im Allgemeinen zu einem Linkerfehler.

1: Ich glaube nicht, dass es einen PIC 18 mit 0 Bytes im allgemeinen RAM-Teil der Zugriffsbank gibt oder jemals geben wird. 2: Das Überlaufen der Zugriffsbank verursacht einen * Linker * -Fehler, keinen Compilerfehler.
@OlinLathrop: Das Datenblatt für den PIC18F8722 gibt an, dass die Zugriffsbankadressen 0x60-0xFF SFRs darstellen, und gibt an, dass die Zugriffsbankadressen 0x00-0x5F bei aktivierter XINST indirekte Zugriffe von FSR2 darstellen. Welcher Bereich von Zugriffsbankadressen würde dem RAM zugeordnet?
@OlinLathrop: Ich würde es für dumm halten, wenn ein PIC im XINST-Modus den gesamten Access-RAM in indirekten Adressraum außerhalb von FSR2 umwandelt (eigentlich halte ich es für einfach verschwenderisch, mehr als 32 Bytes für FSR2 zu verschlingen; eine optimale Nutzung wäre wahrscheinlich die Verwendung von 15 Bytes zum Adressieren von FSR2 und 7 für FSR0 und FSR1). Durch das Lesen des Datenblattes macht der oben genannte PIC genau das.
Ich habe nicht an den erweiterten Befehlssatz gedacht. Ich weiß nicht, wie sich das auf die Zugangsbank auswirkt. Ich erinnere mich, dass ich mir den erweiterten Befehlssatz angesehen habe, als er herauskam, und festgestellt habe, dass er mehr Nachteile als Vorteile für mich hat, insbesondere angesichts der Tatsache, dass meine PIC-Entwicklungsumgebung den PIC 18 bereits verwendet.
@OlinLathrop: Daher mein Kommentar, "abhängig davon, welcher PIC * und Befehlssatz *". Der einzige Nachteil des erweiterten Befehlssatzes besteht darin, dass er den Zugriffsspeicher verschlingt. Wenn man 15 Bytes Zugriffs-RAM für die indirekte Adressierung von FSR2 (mit Offsets von 1-15 Bytes) und jeweils 3 oder 7 Bytes von FSR0 und FSR1 aufgeben könnte, wäre dies wahrscheinlich die Menge dieses Zugriffs-RAM in vielen Anwendungen wert . Leider benötigt Microchip aus irgendeinem Grund Anwendungen, die überhaupt einen erweiterten Befehlssatz verwenden, um 96 Byte Zugriffsspeicher für die FSR2-Adressierung freizugeben.


Diese Fragen und Antworten wurden automatisch aus der englischen Sprache übersetzt.Der ursprüngliche Inhalt ist auf stackexchange verfügbar. Wir danken ihm für die cc by-sa 3.0-Lizenz, unter der er vertrieben wird.
Loading...