Ich lese einen C-Code und bin auf diese Erklärung im Programm gestoßen:
unsigned char serv_ctr @0x0002;
Kann mich jemand auf die Dokumentation verweisen oder erklären, wofür "@ 0x0002" im Mplab XC8 v1.35 C-Compiler gedacht ist?
Ich lese einen C-Code und bin auf diese Erklärung im Programm gestoßen:
unsigned char serv_ctr @0x0002;
Kann mich jemand auf die Dokumentation verweisen oder erklären, wofür "@ 0x0002" im Mplab XC8 v1.35 C-Compiler gedacht ist?
Antworten:
Hiermit geben Sie eine absolute Adresse an, an der die Variable platziert werden soll.
Aus dem XC8-Compiler-Handbuch Seite 27, Abschnitt 2.5.2 Absolute Adressierung :
Variablen und Funktionen können unter Verwendung des bei einem absoluten Adresse platziert werden
__at()
Konstrukt
......
2.5.2.2 DIFFERENZEN
Die 8-Bit - Compiler haben eine verwendetes Symbol @ angeben eine absolute Adresse
@
ist eine übliche nicht standardmäßige Erweiterung der C-Sprache, mit der Sie eine Variable an einer bestimmten Adresse deklarieren können. Es kann für speicherabgebildete Hardwareregister usw. verwendet werden. In diesem Fall muss die Variable auch deklariert werden volatile
, sodass Ihr Beispiel falsch ist.
Andere Compiler verwenden so etwas wie __attribute__(section...
oder #pragma ...
, alles nicht Standard C.
Der einzige vernünftige Grund (falls vorhanden), warum Toolketten dies tun, besteht darin, das Register-Debugging für beschissene Debugger zu aktivieren. Die nicht standardmäßige Syntax stellt sicher, dass das Register Teil der Linker-Ausgabe- und Debug-Informationen wird. Damit können Sie das Register im beschissenen Debugger genauso sehen wie jede andere Variable.
Wenn Sie einen guten Debugger haben, wird dieser Ihre spezifische MCU unterstützen und kennen. Dann brauchen Sie keinen nicht standardmäßigen Mist im C-Code, sondern können stattdessen reines, tragbares Standard-C schreiben:
#define serv_ctr ( *(volatile uint8_t*)0x0002u )
@
Notationszielplattformen mit mehreren Speicherplätzen oder anderen Problemen, sodass sich die meisten Dinge, die mit @
Notation deklariert wurden, anders verhalten als alles, was ohne Erweiterungen möglich wäre.
Eine kurze Erweiterung:
Dies funktioniert seit xc8 2.0 und höher nicht mehr. Sie mussten jetzt schreiben:
unsigned char serv_ctr __at(0x0002);
eine Variable ( serv_ctr
) an eine absolute Adresse ( 0x0002
) setzen.
Mit XC8 2.0 ist es möglich, Ihren alten Code mithilfe der @
Syntax zu kompilieren, wenn Sie die Compilereinstellungen auf das Format "C90" einstellen. Die Einstellung sieht folgendermaßen aus: Sie befindet sich unter "XC8 Global Options" und heißt "C-Standard".
@
Syntax, nicht nur Mplab.