Variablendeklaration mit @ in C.

11

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?

be-ee
quelle
14
Ich würde vermuten, dass es eine Compiler-Erweiterung ist, die Variable an einer bestimmten Adresse zu platzieren.
Eugene Sh.
2
Die Frage könnte dann dem # mplab-Tag zugute kommen, da sich herausstellt, dass dies Mplab-spezifisch ist.
Sylvainulg
Nur um es zu verstehen: Ist das ein Thema auf dieser Seite? Ich würde denken, dass dies zu SO gehört. Oder ist es in Ordnung, hier nach der Programmierung des Mikrocontrollers zu fragen? Dies würde es etwas unklar machen, wo diese Fragen sein sollten.
Auf Wiedersehen SE
6
@KamiKaze Zu welchen Themen kann ich hier fragen? listet "das Schreiben von Firmware für Bare-Metal- oder RTOS-Anwendungen" als Thema und "Programmiersoftware für einen PC" als Thema auf. Da es sich anscheinend um die Programmierung eingebetteter Systeme handelt, scheint es auf einen Blick ein Thema zu sein. Dass es könnte auch auf Stack - Überlauf beim Thema seiner nicht von selbst wieder Thema macht hier.
Ein Lebenslauf
@ KamiKaze danke für das Stellen, ich hatte ähnliche Fragen (ich bin kein regelmäßiger Benutzer dieser SE)
GPPK

Antworten:

20

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

Eugene Sh.
quelle
6

@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 )
Lundin
quelle
1
Während Compiler das letztere Formular akzeptieren müssen, können Implementierungen Adressen Adressen nach Belieben zuordnen. Außerdem verwenden die meisten Compiler, die ich gesehen habe, @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.
Supercat
1

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".

Mike
quelle
Viele andere Compiler für eingebettete Systeme unterstützen jedoch auch die @Syntax, nicht nur Mplab.
Lundin