schreibe Daten zur Registrierung

8

Ich habe die Speicheradresse eines bestimmten Registers (die Adresse LCDCW1 ist C000).

c-Codes:

%Vor%

Ich möchte nur Daten in dieses Register schreiben. Die Codes haben Probleme, wie man es korrigiert?

thx!

    
martin 16.04.2010, 09:44
quelle

5 Antworten

18

Sie können, wie andere vorgeschlagen haben, einen geeigneten Zeiger deklarieren, zB

%Vor%

Beachten Sie, dass ich das Qualifikationsmerkmal volatile hinzugefügt habe. Dies ist immer dann eine gute Idee, wenn Sie Hardware-Register lesen oder schreiben, da dadurch sichergestellt wird, dass jeder Zugriff, den Sie in Ihrem C-Code ausführen, tatsächlich im generierten Code angezeigt wird.

Normalerweise bevorzuge ich es jedoch, Makros wie dieses zu schreiben

%Vor%

und fülle diese mit den entsprechenden gcc asms ein. Ich mag diese besser als direkte Verwendung von Zeigern, weil:

  • Ich denke, sie lesen besser im Code, identifizieren, was ich mache, lesen ein Register, anstatt mich darauf zu konzentrieren, wie ich es mache.
  • Einige Register erfordern einen mehrstufigen Prozess zum Lesen von der Hardware. Dies ist leicht in Makros dieses Stils versteckt, und der Großteil meines Codes bezieht sich immer noch auf die Register, an denen ich interessiert bin, nicht auf die komplizierte Art, wie die Hardware mich dazu bringt, sie zu berühren.
  • Schließlich, indem ich asm s benutze, weiß ich genau, wie ich auf das Register zugreife. Manchmal sind spezielle Anweisungen oder Adressräume erforderlich, um zu einem Register zu gelangen, das normalerweise nicht vom C-Compiler erzeugt werden kann.
  • Auch wenn Sie mit der Motivation für die Verwendung von asm-Anweisungen nicht einverstanden sind, würde ich dennoch vorschlagen, Ihre Registerzugriffe in Makros (oder Inline-Funktionen) wie diesen zu verpacken.

In Ihrem Fall sollten die einfachsten Definitionen lauten:

%Vor%     
Dale Hagglund 16.04.2010, 10:08
quelle
4

Ich glaube, ein Wort der Vorsicht über die Verwendung des Schlüsselwortes volatile ist in Ordnung.

Manchmal (oft), was der Compiler volatil meint, ist nicht das, was der Programmierer beabsichtigt hat (und umgekehrt). Es empfiehlt sich, den resultierenden Maschinencode immer zu überprüfen, wenn das flüchtige Schlüsselwort verwendet wird, um Überraschungen zu vermeiden.

Für weitere Referenzen siehe z. Ссылка

    
Schedler 17.04.2010 14:58
quelle
1

LCDCW1 ist nur ein ganzzahliger Wert. Sie können * nicht darauf anwenden. Sie müssen es in einen Integer-Zeiger (oder einen Typ, den Sie benötigen) umwandeln und dann verwenden. Beispielsweise: *(int*)LCDCW1=0x31;

    
Naveen 16.04.2010 10:20
quelle
1

Angenommen, das Register hat die gleiche Größe wie long :

%Vor%     
mouviciel 16.04.2010 09:48
quelle
0

Ich weiß nicht, was LCDCW1 bedeutet, sondern um in eine konstante Adresse zu schreiben:

%Vor%

Passen Sie es an (Ihr Register ist möglicherweise nicht int.).

    
Marcelo Cantos 16.04.2010 09:48
quelle

Tags und Links