Ich bin neu in der Programmierung von Embedded-Systemen. Ich arbeite an einem Gerät, das einen 8051-Chipsatz verwendet. Ich habe in den Beispielprogrammen festgestellt, dass bei der Definition von Variablen manchmal das Schlüsselwort xdata verwendet wird. so ...
static unsigned Zeichen xdata PatternSize;
während andere Male das Schlüsselwort xdata weggelassen wird.
Nach meinem Verständnis teilt das Schlüsselwort xdata dem Compiler mit, dass diese Variable in einem externen Flash-Speicher gespeichert werden soll.
In welchen Fällen sollte ich Variablen extern mit xdata speichern? Der Zugriff auf diese Variablen dauert länger, oder? Mit xdata gespeicherte Werte bleiben nach einem Hard-Reset des Geräts nicht erhalten?
Ich verstehe auch, dass das statische Schlüsselwort bedeutet, dass die Variable bei jedem Aufruf der Funktion, in der sie definiert ist, bestehen bleibt. Müssen statische und xDaten zusammen verwendet werden?
Die 8051-Architektur hat drei separate Adressräume, der Kern-RAM verwendet eine 8-Bit-Adresse, kann also bis zu 256 Bytes, XDATA ist ein 16-Bit-Adressraum (64 KByte) mit Lese- / Schreibfunktion und der Programmplatz ist a 16-Bit-Adressraum mit Ausführungs- und Nur-Lese-Daten. Aufgrund des kleinen Adressbereichs und der engen Kopplung mit dem Kern ist die Adressierung des Kern-RAM hinsichtlich Coderaum und Zugriffszyklen effizienter.
Der ursprüngliche 8051-Kern hatte einen winzigen Chip auf dem Chip (ein Adressraum von 256 Bytes, aber einige Varianten hatten die Hälfte des tatsächlichen Speichers), und XDATA bezog sich auf Datenspeicher außerhalb des Chips (im Gegensatz zum Programmspeicher). Die meisten modernen 8051-Architekturgeräte verfügen jedoch über integrierten XDATA- und Programmspeicher.
Sie können also den Hauptspeicher verwenden, wenn die Leistung wichtig ist, und XDATA für größere Speicherobjekte. Allerdings sollte der Compiler in den meisten Fällen diese Entscheidung für Sie treffen (sehen Sie im Handbuch Ihres Compilers nach, es wird detailliert beschrieben, wie der Speicher zugewiesen wird). Der Befehlssatz macht es effizient, den Stapel im Kernspeicher zu implementieren, wohingegen statische und dynamisch zugewiesene Daten normalerweise in XDATA vernünftiger zugeordnet werden. Wenn der Compiler über ein XDATA-Schlüsselwort verfügt, überschreibt er die Strategie des Compilers und sollte nur verwendet werden, wenn die Strategie des Compilers ausfällt, da dadurch die Portabilität des Codes beeinträchtigt wird.
[edit] Beachten Sie auch, dass der Kernspeicher eine 32-Bit-adressierbare Region enthält. Die Bitadressierungsanweisungen verwenden eine 8-Bit-Adresse in dieser Region, um direkt auf einzelne Bits zuzugreifen. Die Region existiert innerhalb des adressierbaren 256-Byte-Kernspeichers, so dass sowohl Bit als auch Byte adressierbar sind [/ edit]
xdata teilt dem Compiler mit, dass die Daten im externen RAM gespeichert sind, so dass er eine andere Anweisung verwenden muss, um diesen Speicher anstelle des internen RAM zu lesen und zu schreiben.
Der Zugriff auf externe Daten dauert länger. Normalerweise setze ich Interrupt-Variablen im internen RAM und die meisten großen Arrays im externen RAM.
Zum Zustand des externen RAM nach einem Hard-Reset (nicht Power-Cycle): Das hängt vom Hardware-Setup ab. Geht eine Reset-Leitung zum externen Chip? Auch einige Chips kommen mit XDATA innerhalb des CPU-Chips. Lies das noch einmal. Einige Chips haben eine 8051 CPU und eine gewisse Menge an XDATA im IC.
statisch und xdata überlappen sich nicht. Static teilt dem Compiler mit, wie eine Variable zugewiesen werden soll (auf einem Stack oder an einem Speicherort). Xdata teilt dem Compiler mit, wie man zu dieser Variablen gelangt. Statisch kann den Namensraum dieser Variablen auch auf diese Datei beschränken. Sie können eine statische XDATA-Variable haben, die nur für eine Funktion lokal ist und eine statische Variable hat, die für eine Funktion lokal ist, aber internen RAM verwendet.
Ein wichtiger Punkt, der noch nicht erwähnt wurde, ist, dass die Hardware kein einheitliches Konzept eines "Zeigers" hat, weil verschiedene Anweisungen verwendet werden, um auf verschiedene Speicherbereiche zuzugreifen. Jede Adresse, von der bekannt ist, dass sie im DATA / IDATA-Raum ist, kann eindeutig mit einem Ein-Byte-Zeiger identifiziert werden; ebenso jede Adresse, von der bekannt ist, dass sie sich im PDATA-Raum befindet. Jede Adresse, von der bekannt ist, dass sie im CODE-Raum ist, kann mit einem Zwei-Byte-Zeiger identifiziert werden; ebenso jede Adresse, von der bekannt ist, dass sie sich im XDATA-Raum befindet. In vielen Fällen wird jedoch eine Routine wie memcpy
nicht im Voraus wissen, welcher Speicherplatz mit den übergebenen Zeigern verwendet werden soll. Um dies zu berücksichtigen, verwenden 8x51-Compiler im Allgemeinen einen Drei-Byte-Zeigertyp, der verwendet werden kann, um auf Dinge in einem beliebigen Speicherbereich zuzugreifen (ein Byte wählt aus, welcher Anweisungstyp mit dem Zeiger verwendet werden soll und die anderen Bytes den Wert enthalten). Eine Zeigerdeklaration wie:
definiert einen Drei-Byte-Zeiger, der auf irgendeinen Speicherplatz zeigen kann. Ändern der Deklaration in
%Vor%definiert einen Zwei-Byte-Zeiger, der im DATA-Raum gespeichert wird, aber nur auf Dinge im XDATA-Raum zeigen kann. Ebenso
%Vor%definiert einen Zwei-Byte-Zeiger, der im DATA-Raum gespeichert wird, aber nur auf Dinge in den Bereichen DATA und IDATA zeigen kann. Code, der Zeiger verwendet, die auf einen bekannten Datenraum zeigen, wird viel schneller sein (möglicherweise um einen Faktor von zehn) als Code, der die "universellen" Drei-Byte-Zeiger verwendet.
Wie und wann der xData-Speicherbereich verwendet wird, hängt von der Systemarchitektur ab. Einige Systeme verfügen möglicherweise über RAM unter dieser Adresse, während andere über ROM oder Flash verfügen können. In jedem Fall ist der Zugriff langsamer als der Zugriff auf internen RAM, ROM oder Flash.
Im Allgemeinen sollten große Elemente, konstante Elemente und weniger verwendete Elemente in xData aufgenommen werden. Es gibt keine Standardregeln, was in xData abläuft, da es von der Architektur abhängt.
Der 8051 hat einen 128-Byte-Bereich von Zwischenspeicher-Pseudoregistern, die (die meisten) Compiler als Standard für deklarierte Variablen verwenden. Aber offensichtlich ist dieser Bereich sehr klein und Sie möchten auch Variablen in den 16-Bit-Speicheradressraum einfügen können. Das ist, was der xdata (d. H. "Externe Daten") Spezifizierer ist. Was zu setzen ist, hängt natürlich davon ab, was die Daten sind und wie Sie sie verwenden wollen.
Grundsätzlich denke ich, das ist die falsche Frage. Sie müssen zuerst Ihre CPU-Architektur verstehen, bevor Sie lernen, wie Sie die 8051-spezifischen Funktionen des C-Compilers verwenden.
Tags und Links c embedded memory-management 8051 flash-memory