Declaración variable con @ en C


11

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?


14
Supongo que es una extensión del compilador para colocar la variable en una dirección específica.
Eugene Sh.

2
entonces la pregunta podría beneficiar a la etiqueta #mplab, ya que resulta que es específica de Mplab.
sylvainulg

Solo para obtenerlo: ¿Esto es un tema en este sitio? Creo que esto pertenece a SO. ¿O está bien pedir programación de microcontroladores aquí? Esto dejaría un poco claro dónde deberían estar estas preguntas.
Adiós SE

66
@KamiKaze ¿Qué temas puedo preguntar aquí? enumera "la escritura de firmware para aplicaciones de metal o RTOS" como en el tema, y ​​"Software de programación para una PC" como fuera de tema. Dado que esto parece ser sobre la programación de sistemas embebidos, de un vistazo parecería estar en el tema. El hecho de que también pueda estar en el tema de Stack Overflow no lo hace por sí solo fuera del tema aquí.
un CVn

@KamiKaze gracias por preguntar, tuve preguntas similares (no soy un usuario habitual de este SE)
GPPK

Respuestas:


20

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


6

@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 )

1
Si bien los compiladores deben aceptar la última forma, las implementaciones pueden asignar números a direcciones de la forma que consideren conveniente. Además, la mayoría de los compiladores que he visto usan @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.
supercat

1

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


Sin @embargo, muchos otros compiladores de sistemas integrados también admiten la sintaxis, no solo Mplab.
Lundin
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.