Estoy leyendo un código C y encontré esta declaración en el programa:
unsigned char serv_ctr @0x0002;
¿Puede alguien indicarme la documentación o explicar para qué sirve "@ 0x0002" en el compilador Mplab XC8 v1.35 C?
Estoy leyendo un código C y encontré esta declaración en el programa:
unsigned char serv_ctr @0x0002;
¿Puede alguien indicarme la documentación o explicar para qué sirve "@ 0x0002" en el compilador Mplab XC8 v1.35 C?
Respuestas:
Esto es para especificar una dirección absoluta en la que colocar la variable.
Del manual del compilador XC8 página 27, sección 2.5.2 Direccionamiento absoluto :
Las variables y funciones se pueden colocar en una dirección absoluta utilizando la
__at()
construcción
......
2.5.2.2 DIFERENCIAS
Los compiladores de 8 bits han utilizado un símbolo @ para especificar una dirección absoluta
@
es una extensión común no estándar del lenguaje C que le permite declarar una variable en una dirección específica. Se puede usar para registros de hardware mapeados en memoria, etc. En cuyo caso la variable también debe declararse volatile
, por lo que su ejemplo es incorrecto.
Otros compiladores usan algo como __attribute__(section...
o #pragma ...
, todo ello no estándar C.
La única razón racional (si la hay) por la que las cadenas de herramientas hacen esto es habilitar la depuración de registros en depuradores deficientes. La sintaxis no estándar garantizará que el registro se convierta en parte de la información de depuración y salida del enlazador. Lo que a su vez le permite ver el registro en el depurador de basura al igual que puede ver cualquier otra variable.
Si tiene un buen depurador, tendrá soporte y conocimiento de su MCU específica. Entonces no necesita basura no estándar en el código C, pero en su lugar puede escribir C estándar puro y portátil:
#define serv_ctr ( *(volatile uint8_t*)0x0002u )
@
plataformas de destino de notación con múltiples espacios de memoria u otros problemas para que la mayoría de las cosas declaradas usando @
notación se comporten de manera diferente a cualquier cosa que se pueda hacer sin extensiones.
Una breve extensión:
Esto ya no funciona desde xc8 2.0 y versiones posteriores. Ahora tenías que escribir:
unsigned char serv_ctr __at(0x0002);
poner una variable ( serv_ctr
) en una dirección absoluta ( 0x0002
).
Con XC8 2.0 es posible compilar su código anterior utilizando la @
sintaxis si establece la configuración del compilador para usar el formato "C90". La configuración se ve así, está bajo "Opciones globales de XC8" y se llama "estándar C".
@
embargo, muchos otros compiladores de sistemas integrados también admiten la sintaxis, no solo Mplab.