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.