@-Zeichen in der Deklaration von C-Variablen

Lesezeit: 6 Minuten

Benutzer-Avatar
Avi Gabhawala

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

Benutzer-Avatar
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.

    – Irgendein Programmierer-Typ

    11. April 2013 um 18:28 Uhr

  • @GrijeshChauhan Herunterladen TMS320C54x DSP Reference Set Volume 1: CPU and Peripherals – SPRU131G.pdf und schaue darin nach “memory-mapped” und siehe Tabelle “Table 3–3. CPU Memory-mapped Registers”. Es ist nur ein CPU-Beispiel. Es gibt andere mit speicherabgebildeten Registern.

    – Alexey Frunze

    11. April 2013 um 19:05 Uhr


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

1365710cookie-check@-Zeichen in der Deklaration von C-Variablen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy