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
@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:
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:
unsignedchar 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".
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 :
quelle
@
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 werdenvolatile
, 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:
quelle
@
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:
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".quelle
@
Syntax, nicht nur Mplab.