Wie speichert man eine Variable an einem bestimmten Speicherort?

7

Da ich relativ neu in C bin, muss ich für eines meiner Projekte folgendes verwenden: Ich muss einige globale Variablen deklarieren, die jedes Mal gespeichert werden müssen, wenn das Programm an der gleichen Speicheradresse läuft. Ich habe etwas gelesen und ich fand, dass ich es "statisch" erkläre, es wird am selben Speicherort gespeichert werden.

Aber meine Frage ist: Kann ich das Programm angeben, wo diese Variable gespeichert werden soll oder nicht? Zum Beispiel: int a soll bei 0xff520000 gespeichert werden. Kann diese Sache gemacht werden oder nicht? Ich habe hier gesucht, aber kein relevantes Beispiel gefunden. Wenn es sich um einen alten Beitrag handelt, bitte seien Sie so freundlich, den Link zu teilen.

Vielen Dank im Voraus. Laurentiu

Update: Ich verwende ein 32uC

    
Laurentiu 07.03.2013, 09:07
quelle

7 Antworten

10

In Ihrer IDE wird eine Speicherzuordnung durch eine Linker-Datei verfügbar sein. Es enthält alle Adressen im Programm. Lesen Sie das MCU-Handbuch, um zu erfahren, an welchen Adressen ein gültiger Speicher für Ihren Zweck vorhanden ist, und reservieren Sie dann einen Teil dieses Speichers für Ihre Variable. Sie müssen die Dokumentation Ihrer spezifischen Entwicklungsplattform lesen.

Beachten Sie bitte, dass es nicht sinnvoll ist, Variablen an bestimmten Adressen zuzuordnen, es sei denn, sie sind entweder Hardwareregister oder nicht flüchtige Variablen im Flash- oder EEPROM-Speicher.

Wenn sich der Inhalt eines solchen Speicherplatzes während der Ausführung ändert, weil es ein Register ist oder weil Ihr Programm einen Bootloader / NVM-Programmieralgorithmus enthält, der NVM-Speicherzellen ändert, dann müssen die Variablen sein deklariert als volatil. Andernfalls bricht der Compiler Ihren Code bei der Optimierung komplett ab.

Der bestimmte Compiler hat höchstwahrscheinlich eine nicht standardmäßige Möglichkeit, Variablen an bestimmten Adressen zuzuweisen, wie z. B. einem #pragma oder manchmal dem seltsamen, nicht standardmäßigen Operator @ . Die einzige sinnvolle Möglichkeit, eine Variable an einem festen Ort in Standard C zuzuweisen, ist dies:

%Vor%

Dabei ist 0x12345678 die Adresse, an der sich 1 Byte befindet. Sobald Sie eine solche Makro-Deklaration haben, können Sie sie wie eine Variable verwenden:

%Vor%

Meistens möchten Sie, dass diese Variablen im globalen Namespace liegen, daher auch das Makro. Wenn Sie jedoch aus irgendeinem Grund den Gültigkeitsbereich der Variablen reduzieren möchten, überspringen Sie das Makro und greifen Sie manuell auf die Adresse im Code zu:

%Vor%     
Lundin 07.03.2013, 10:32
quelle
8

Sie können so etwas mit Linker-Skripten machen, was bei Embedded-Programmierung recht häufig vorkommt.

Auf einem Linux-System erhalten Sie möglicherweise niemals die gleiche virtuelle Adresse aufgrund der Adressraum-Randomisierung (eine Sicherheitsfunktion, um Exploits zu vermeiden, die darauf angewiesen wären, die genaue Position einer Variablen zu kennen, wie Sie sie beschreiben).

Wenn es sich nur um einen wiederholbaren Zeiger handelt, den Sie möchten, können Sie möglicherweise eine bestimmte Adresse mit mmap abbilden, aber das ist nicht garantiert.

    
Ben Jackson 07.03.2013 09:11
quelle
1

Nein, Sie können nicht explizit angeben, wo eine Variable im Speicher gespeichert werden soll. Vor allem, weil Sie auf modernen Systemen viele Dinge getan haben, die das System in Bezug auf das Gedächtnis betrifft, die Sie nicht kontrollieren können. Adress Layout Randomization ist eine Sache, die in den Sinn kommt, würde dies sehr schwer machen.

    
Tony The Lion 07.03.2013 09:10
quelle
1

Wie in anderen Antworten erwähnt wurde - Sie können nicht. Aber Sie können eine Abhilfe schaffen. Wenn es in Ordnung ist, dass die Globals in main() initialisiert werden, können Sie etwas in dieser Art tun:

%Vor%

Beachten Sie jedoch, dass dies sehr stark von Ihrem System abhängt. Wenn Sie in einer geschützten Umgebung arbeiten, erhalten Sie höchstwahrscheinlich einen Laufzeitabsturz. Wenn Sie sich in einer eingebetteten / nicht geschützten Umgebung befinden, kann dies funktionieren.

    
SomeWittyUsername 07.03.2013 09:16
quelle
0

Nicht auf der C-Ebene. Wenn Sie mit der Assemblersprache arbeiten, können Sie das Speicherlayout direkt steuern. Aber der C-Compiler macht das für Sie. Du kannst dich nicht damit anlegen.

Auch bei der Montage steuert dies nur das relative Layout. Virtueller Speicher kann dies an irgendeinem (un) geeigneten physischen Ort platzieren.

    
luser droog 07.03.2013 09:10
quelle
0

Sie können dies mit einigen Compiler-Erweiterungen machen, aber es ist wahrscheinlich nicht das, was Sie tun möchten. Das Betriebssystem verarbeitet Ihr Gedächtnis und bringt Dinge dorthin, wo es will. Woher weißt du überhaupt, dass die von dir gewünschte Speicheradresse in deinem Programm abgebildet wird? Ignorieren Sie alles in diesem Abschnitt, wenn Sie sich auf einer eingebetteten Plattform befinden, dann sollten Sie das Handbuch für diese Plattform / den Compiler lesen oder es zumindest hier erwähnen, damit die Leute eine spezifischere Antwort geben können.

Außerdem haben statische Variablen nicht unbedingt dieselbe Adresse, wenn das Programm ausgeführt wird. Viele Betriebssysteme verwenden positionsunabhängige ausführbare Dateien und randomisieren den Adressraum bei jeder Ausführung.

    
Art 07.03.2013 09:14
quelle
0

Sie können einen Zeiger auf eine bestimmte Speicheradresse deklarieren und den Inhalt dieses Zeigers als eine Variable verwenden, wie ich annehme:

%Vor%     
SteveP 07.03.2013 09:16
quelle

Tags und Links