Ich habe diese Header-Datei für PIC-Mikrocontroller mit dem Namen pic1250.h gefunden und kann einige der darin verwendeten Syntaxen nicht verstehen.
Die Quelle für die Datei ist:
/*
* Header file for the Microchip
* PIC 12c508 chip
* PIC 12c509 chip
* Baseline Microcontrollers
*/
static volatile unsigned char RTCC @ 0x01;
static volatile unsigned char TMR0 @ 0x01;
static volatile unsigned char PCL @ 0x02;
static volatile unsigned char STATUS @ 0x03;
static unsigned char FSR @ 0x04;
static volatile unsigned char OSCCAL @ 0x05;
static volatile unsigned char GPIO @ 0x06;
static unsigned char control OPTION @ 0x00;
static volatile unsigned char control TRIS @ 0x06;
/* STATUS bits */
static bit GPWUF @ (unsigned)&STATUS*8+7;
static bit PA0 @ (unsigned)&STATUS*8+5;
static bit TO @ (unsigned)&STATUS*8+4;
static bit PD @ (unsigned)&STATUS*8+3;
static bit ZERO @ (unsigned)&STATUS*8+2;
static bit DC @ (unsigned)&STATUS*8+1;
static bit CARRY @ (unsigned)&STATUS*8+0;
/* OPTION bits */
#define GPWU (1<<7)
#define GPPU (1<<6)
#define T0CS (1<<5)
#define T0SE (1<<4)
#define PSA (1<<3)
#define PS2 (1<<2)
#define PS1 (1<<1)
#define PS0 (1<<0)
/* OSCCAL bits */
static bit CAL7 @ (unsigned)&OSCCAL*8+7;
static bit CAL6 @ (unsigned)&OSCCAL*8+6;
static bit CAL5 @ (unsigned)&OSCCAL*8+5;
static bit CAL4 @ (unsigned)&OSCCAL*8+4;
/* GPIO bits */
static bit GP5 @ (unsigned)&GPIO*8+5;
static bit GP4 @ (unsigned)&GPIO*8+4;
static bit GP3 @ (unsigned)&GPIO*8+3;
static bit GP2 @ (unsigned)&GPIO*8+2;
static bit GP1 @ (unsigned)&GPIO*8+1;
static bit GP0 @ (unsigned)&GPIO*8+0;
#define CONFIG_ADDR 0xFFF
#define FOSC0 0x01
#define FOSC1 0x02
#define WDTE 0x04
#define CP 0x08
#define MCLRE 0x0F
Ich bin nicht in der Lage, den gesamten Modifer-Datentyp @ Deklaration-etwas zu verstehen. Kann mir bitte jemand weiterhelfen? Ich bin nur ein Neuling darin.
Welchen Compiler verwendest du?
– Fataler Fehler
11. April 2013 um 18:11 Uhr
Es ist kein Standard-C. @ ist nicht Teil des Ausführungszeichensatzes (er wurde ASCII noch nicht hinzugefügt, als C erstellt wurde).
– Luser Drog
11. April 2013 um 18:12 Uhr
Das ist so etwas wie das Zuweisen von Aliasen zu Speicheradressen.
– Eddy_Em
11. April 2013 um 18:13 Uhr
Bilder haben ein paar spezielle Compiler. Obwohl sie in C geschrieben sind, haben sie aufgrund der Tatsache, dass sie so Low-Level-Geräte sind, viele spezielle Funktionen. Dies sieht aus wie eine Header-Datei, die von Mikrochip erstellt wurde, um die Entwicklung zu unterstützen. Mit dieser Syntax können Sie die . Operator, um auf einzelne Bits in einem Adressbyte zuzugreifen. Zum Beispiel kann dies gesehen werden, wenn Sie dies tun PORTAbits.RA4 = 0; Das @-Zeichen bildet das Bit auf die richtigen Bytes (Register) ab.
– Reid
11. April 2013 um 18:30 Uhr
Sie müssen diese Syntax wahrscheinlich nicht verwenden, indem Sie die PIC-Register verwenden, da sie alle erdenklichen vordefiniert haben. Es ist verdammt selbsterklärend. static volatile unsigned char RTCC @ 0x01. “Das RTCC-Register ist AT-Adresse 1”. Dies ist ein Kinderspiel, das Sie aus der Header-Datei ohne Referenzhandbuch verstehen können.
– Kas
12. April 2013 um 3:03 Uhr
ouah
Es ist eine Compiler-Erweiterung.
Von PIC MPLAB XC8 Compiler-Dokumentation (Hervorhebung von mir):
5.5.4 Absolute Variablen
Die meisten Variablen können an einer absoluten Adresse lokalisiert werden, indem man ihrer Deklaration folgt mit dem Konstrukt @ Adresse, wobei Adresse der Speicherort ist, an dem die Variable positioniert werden soll. Eine solche Variable wird als absolute Variable bezeichnet.
5.5.4.1 ABSOLUTE VARIABLEN IM DATENSPEICHER
Absolute Variablen sind in erster Linie dazu gedacht, die Adresse eines C-Bezeichners mit einem speziellen Funktionsregister gleichzusetzen, können aber verwendet werden, um gewöhnliche Variablen an einer absoluten Adresse im Datenspeicher zu platzieren.
Zum Beispiel:
volatile unsigned char Portvar @ 0x06;
deklariert eine Variable namens Portvar, die sich bei 06h im Datenspeicher befindet. Der Compiler reserviert Speicherplatz für dieses Objekt (wenn die Adresse in den Allzweck-RAM fällt) und setzt den Bezeichner der Variablen mit dieser Adresse gleich.
Beachten Sie, dass MPLAB XC8 nicht der einzige Compiler ist, der dasselbe hat @ Konstrukt, um ein Objekt an einem bestimmten Speicherort zu platzieren.
Ein weiterer bekannter Compiler ist Freescale CodeWarrior (zumindest für HCS08).
Ein anderer ist IAR C Compiler (zumindest für MSP430 und AVR).
+ für Ihre Bemühungen, diese nette Antwort zu bringen
– Grijesh Chauhan
11. April 2013 um 18:39 Uhr
Okay, danke für den Dokumentationsverweis und deine Antwort!
– Avi Gabhawala
12. April 2013 um 6:32 Uhr
Es ist eine Erweiterung im PIC-Compiler, um eine Variable an einer bestimmten Speicherposition zu platzieren. Kein anderer Compiler, den ich kenne, hat diese Erweiterung.
wie es nützlich ist, eine Variable in einen bestimmten Speicher zu legen, können Sie etwas mehr erklären. Ist es nicht wie Low-Level-Sprache?
– Grijesh Chauhan
11. April 2013 um 18:25 Uhr
Wenn Sie direkt mit Hardware arbeiten, insbesondere mit Mikrocontrollern oder eingebetteten Dingen, kann es sein, dass Dinge an eine bestimmte Adresse gestellt werden sehr nützlich. Das System kann eine bestimmte Adresse lesen oder schreiben (in diesem Fall stammen diese Statusbits wahrscheinlich von einem Hardwareeingang).
– ssube
11. April 2013 um 18:28 Uhr
@GrijeshChauhan Schauen Sie sich genau an, wie CPUs organisiert sind. Einige von ihnen haben spezielle Register an vordefinierten Speicherstellen. Ja, Register im Speicheradressraum. Was Sie in der Frage sehen, spiegelt dies wider.
– Alexey Frunze
11. April 2013 um 18:28 Uhr
@GrijeshChauhan Es wird einfacher, Variablen für spezielle Hardwareregister und ihre Flags zu erstellen.
Zusätzlich zu dem, was bereits gesagt wurde, beachten Sie bitte, dass die Nicht-Standard @ Operator ist ein überflüssiges Feature. Sie können genau das gleiche Verhalten mit Standard-C erreichen:
#define RTCC (*(volatile uint8_t*)0x0001u)
Da es sich bei den Variablen in diesem Fall um Hardware-Register handelt, brauchen Sie sich um die Zuordnung keine Gedanken zu machen, sie sind bereits in der Hardware vorhanden. Wenn Sie eine Variable einer benutzerdefinierten Adresse zuweisen möchten, sollte es eine Art Linker-Datei geben, um dies zu beheben (da der @-Operator nur die spezifische Zuweisung für Variablen löst, nicht für Code).
Der Hauptgrund, warum viele eingebettete Compiler mit einigen nicht standardmäßigen Operatoren wie @ liegt daran, dass sie beim Entwerfen des Debuggers nicht über den Tellerrand hinaus denken können. Sie erwarten, dass eine Art Variable in der Objektdatei vorhanden ist, die dem Debugger zugeführt wird, aber wenn Sie #define verwenden, wird kein solches “Debug-Informationsobjekt” zugewiesen.
Wenn der Debugger stattdessen den Quellcode betrachten würde, oder besser noch, MCU-Bewusstsein integriert hätte, wäre ein nicht standardmäßiger Code wie dieser nicht erforderlich. Hochwertige Tools von Unternehmen, die sich ausschließlich auf Debugger konzentrieren, verfügen immer über eine integrierte Unterstützung zum Anzeigen von Registerkarten.
Eine kurze Erweiterung:
Dies funktioniert seit xc8 2.0 und höher nicht mehr. Sie mussten jetzt schreiben:
unsigned char a __at(0x025);
eine Variable setzen (a) an einer absoluten Adresse (0x025).
Mit XC8 2.0 ist es möglich, Ihren alten Code mit der @-Syntax zu kompilieren, wenn Sie die Compilereinstellungen auf die Verwendung des “C90”-Formats einstellen. Die Einstellung sieht so aus, sie befindet sich unter „XC8 Global Options“ und heißt „C-Standard“.
13657100cookie-check@-Zeichen in der Deklaration von C-Variablenyes
Welchen Compiler verwendest du?
– Fataler Fehler
11. April 2013 um 18:11 Uhr
Es ist kein Standard-C.
@
ist nicht Teil des Ausführungszeichensatzes (er wurde ASCII noch nicht hinzugefügt, als C erstellt wurde).– Luser Drog
11. April 2013 um 18:12 Uhr
Das ist so etwas wie das Zuweisen von Aliasen zu Speicheradressen.
– Eddy_Em
11. April 2013 um 18:13 Uhr
Bilder haben ein paar spezielle Compiler. Obwohl sie in C geschrieben sind, haben sie aufgrund der Tatsache, dass sie so Low-Level-Geräte sind, viele spezielle Funktionen. Dies sieht aus wie eine Header-Datei, die von Mikrochip erstellt wurde, um die Entwicklung zu unterstützen. Mit dieser Syntax können Sie die . Operator, um auf einzelne Bits in einem Adressbyte zuzugreifen. Zum Beispiel kann dies gesehen werden, wenn Sie dies tun
PORTAbits.RA4 = 0;
Das @-Zeichen bildet das Bit auf die richtigen Bytes (Register) ab.– Reid
11. April 2013 um 18:30 Uhr
Sie müssen diese Syntax wahrscheinlich nicht verwenden, indem Sie die PIC-Register verwenden, da sie alle erdenklichen vordefiniert haben. Es ist verdammt selbsterklärend.
static volatile unsigned char RTCC @ 0x01
. “Das RTCC-Register ist AT-Adresse 1”. Dies ist ein Kinderspiel, das Sie aus der Header-Datei ohne Referenzhandbuch verstehen können.– Kas
12. April 2013 um 3:03 Uhr