significado - tipos de datos en c++
@ Iniciar sesiĆ³n en declaraciĆ³n de variable C (4)
Encontré este archivo de encabezado para los microcontroladores PIC con el nombre de pic1250.hy no puedo entender la sintaxis que se usa en él.
La fuente para el archivo es:
/*
* 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
No puedo entender todo el modificador-tipo de datos @ declaración-algo. ¿Puede alguien ayudarme? Solo soy un novato en esto.
Además de lo que ya se ha dicho, tenga en cuenta que el operador @
no estándar es una característica superflua. Puedes lograr exactamente el mismo comportamiento con el estándar C:
#define RTCC (*(volatile uint8_t*)0x0001u)
Dado que las variables en este caso son registros de hardware, no necesita preocuparse por la asignación, ya están presentes en el hardware. Si desea asignar una variable a una dirección personalizada, debe haber un archivo de enlace de algún tipo para solucionarlo (ya que el operador @ solo resuelve la asignación específica para las variables, no para el código).
La razón principal por la que muchos compiladores integrados crean un operador no estándar como @
es que no pueden pensar fuera de la caja cuando diseñan el depurador. Esperan que algún tipo de variable esté presente en el archivo de objeto que se alimenta al depurador, pero si usa #define, no se asigna ningún "objeto de información de depuración".
Si el depurador mirara el código fuente en su lugar, o mejor aún, tuviera el reconocimiento MCU incorporado, entonces no sería necesario un código no estándar como este. Las herramientas de alta calidad de las empresas que se centran únicamente en los depuradores siempre vienen con soporte incorporado para ver mapas de registro.
Es una extensión de compilador.
De la documentación del compilador PIC MPLAB XC8 (énfasis mío):
5.5.4 Variables absolutas
La mayoría de las variables se pueden ubicar en una dirección absoluta siguiendo su declaración con la dirección construct @ , donde dirección es la ubicación en la memoria donde se ubicará la variable. Tales variables se conocen como variables absolutas.
5.5.4.1 VARIABLES ABSOLUTAS EN LA MEMORIA DE DATOS
Las variables absolutas están destinadas principalmente a equiparar la dirección de un identificador C con un registro de función especial, pero se pueden usar para colocar variables ordinarias en una dirección absoluta en la memoria de datos.
Por ejemplo:
volatile unsigned char Portvar @ 0x06;
Declarará una variable llamada Portvar ubicada a las 06h en la memoria de datos. El compilador reservará el almacenamiento para este objeto (si la dirección cae en la RAM de propósito general) y comparará el identificador de la variable con esa dirección.
Tenga en cuenta que MPLAB XC8 no es el único compilador que tiene la misma construcción @
para colocar un objeto en la ubicación de memoria específica.
Otro compilador conocido es Freescale CodeWarrior (al menos para HCS08).
Otro es el compilador IAR C (al menos para MSP430 y AVR).
Es una extensión de lenguaje C compatible con el compilador PIC que permite asignar variables a direcciones RAM específicas.
ejemplos
char a @ 0x25; /* place A at address 0x25 */
bit b @ 0x25.3; /* place B at the third bit of address 0x25 */
Hay tres usos para esto:
- En el sistema integrado, a menudo tiene muy poca memoria y necesita empaquetar varias variables en el mismo byte. Esta sintaxis lo hace más fácil, aunque un campo de bits estándar también funcionaría.
- Otra razón es que los registros PIC se asignan a la RAM, de modo que puede acceder a ellos como cualquier otra ubicación de memoria. Con esta sintaxis puede definir sinónimos para los bits que le interesan y usarlos como variables normales.
- Ponga su propia variable (sin importar el tamaño) en una ubicación específica. Esto es ocasionalmente útil.
Recuerde que la programación incorporada tiene que ver con el control total del hardware.
Es una extensión en el compilador PIC, para colocar una variable en una posición de memoria específica. Ningún otro compilador que yo sepa tenga esa extensión.