Speicheradresse einer Variablen festlegen (reines C++, kein OS)
-
Hallo,
ich programmiere grade einen ARM7-Prozessor mit C++ und gcc. Mir ist klar, dass mit Betriebssystem das folgende zu segfaults führt, mir geht es nur um die Möglichkeiten die C++ bietet, deshalb auch in diesem Forum.
Nun zu meinem Problem: Ich möchte selbst bestimmen können an welcher Speicherstelle eine variable gespeichert ist, um bequem auf die register des Prozessors zuzugreifen. Bis jetzt mache ich es so, was auch funktioniert:
#define LOCATION (*((int*) 123456)) LOCATION = 100;
Hier wird die 100 an Speicheradresse 123456 geschrieben. Was mir daran nicht gefällt ist, dass die Adresse Hartcodiert im define steht.
Mit Zeigern geht das natürlich
int* LOCATION = 123456; *LOCATION = 100;
Mir gefällt jedoch, dass man ohne * einfach schöne Ausdrücke haben kann wie PORTA = 200 ohne sich gedanken zu machen.
Ich brauche das ganze aber etwas flexibler als mit define, weil ich die adresse meiner klasseninstanz gerne im konstruktor geben würde.Bin für jede Idee dankbar,
MfG
-
Bau dir doch ne Pointerklasse, die den =Operator überschreibt, und die Sache ist erledigt. Sind ein paar wenige Zeilen Code.
Muß allerdings sagen, das ich es schon komisch finde, das dich die Pointer-Syntax stört.
-
Eventuell kannst du auch Referenzen verwenden:
//Achtung - ungetestet int& LOCATION = *((int*)123456); LOCATION = 0x0815;
-
Hallo,
das mit den Referenzen geht genau in die richtige Richtung. Nur leider kann ich die nicht nachträglich umbiegen, so dass ich mal mit dem einen Port, mal mit dem anderen arbeite.
Zeiger stören mich grundsätzlich überhauptnicht, im Gegenteil, hier sind sie die beste Lösung wie sich herausstellt. Was mich stört ist, dass die mit dem Prozessor gelieferten Headerdateien besagte #defines haben, so dass ich direkt zugreifen kann, und wenn ich das jetzt mit meinen zeigern mische, muss ich/man immer nachdenken ob das zeiger oder nicht ist.
Ich denke die einfachste Lösung wird sein, ich schreibe die Headerdateien auch um, so dass sie Zeiger verwenden, dann ist es wieder einheitlich und man kann so schöne sachen machen wie PORT = PORTA; .Vielen Dank für eure Hilfe
-
CGI-BIN schrieb:
das mit den Referenzen geht genau in die richtige Richtung. Nur leider kann ich die nicht nachträglich umbiegen, so dass ich mal mit dem einen Port, mal mit dem anderen arbeite.
Das kannst du mit der #define-Version auch nicht
Ich denke die einfachste Lösung wird sein, ich schreibe die Headerdateien auch um, so dass sie Zeiger verwenden, dann ist es wieder einheitlich und man kann so schöne sachen machen wie PORT = PORTA; .
Wenn diese Header zum Lieferumfang deines Compilers gehören, solltest du sie besser nicht anfassen (das kann übel werden, wenn irgendwo in den Tiefen des Systems mit den #defines in der obengenannten Version gearbeitet wird). Aber niemand zwingt dich dazu, die gegebenen #defines überhaupt direkt zu nutzen - nimm nur deine Zeiger-Version und leg dir notfalls einen Zeiger auf diese Makros an (
int* Location = &LOCATION;
).
-
CStoll schrieb:
Das kannst du mit der #define-Version auch nicht
Richtig, das mit den #defines wär ja auch schon fertig gewesen. Deshalb hab ich ja überhaupt erst nach alternativen gesucht!
CStoll schrieb:
Wenn diese Header zum Lieferumfang deines Compilers gehören, solltest du sie besser nicht anfassen (das kann übel werden, wenn irgendwo in den Tiefen des Systems mit den #defines in der obengenannten Version gearbeitet wird). Aber niemand zwingt dich dazu, die gegebenen #defines überhaupt direkt zu nutzen - nimm nur deine Zeiger-Version und leg dir notfalls einen Zeiger auf diese Makros an (
int* Location = &LOCATION;
).Die gehören nicht zum Compiler, das würde ich nie wagen
Ist eine kleine (naja su klein auch wieder nicht) h-datei mit genannten defines wo eben sämtliche Register für alle Peripheriemodule die dieser eine Controller hat namentlich erwähnt sind.
Da ich die Datei selbst in mein Projekt reinkopiert habe, bin ich sicher, dass auch nur mein Code diese verwendet.