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
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:
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%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.
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.
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:
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.
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.
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.
Tags und Links c