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
@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:
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:
unsignedchar 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".
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 :
fuente
@
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 declararsevolatile
, 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:
fuente
@
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:
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".fuente
@
embargo, muchos otros compiladores de sistemas integrados también admiten la sintaxis, no solo Mplab.