Déclaration de variable avec @ en C

11

Je lis du code C et suis tombé sur cette déclaration dans le programme:

unsigned char serv_ctr @0x0002;

Quelqu'un peut-il m'indiquer la documentation ou expliquer à quoi sert le "@ 0x0002" dans le compilateur Mplab XC8 v1.35 C?

être-ee
la source
14
Je suppose que c'est une extension du compilateur pour placer la variable à une adresse spécifique.
Eugene Sh.
2
la question pourrait alors bénéficier de la balise #mplab, car il s'avère que c'est spécifique à Mplab.
sylvainulg
Juste pour l'obtenir: est-ce sur le sujet sur ce site? Je pense que cela appartient à SO. Ou est-ce correct de demander la programmation du micro contrôleur ici. Cela rendrait un peu difficile où ces questions devraient être.
Au revoir SE
6
@KamiKaze Quels sujets puis-je poser ici? répertorie "l'écriture de firmware pour les applications bare-metal ou RTOS" comme sujet et "Logiciel de programmation pour PC" comme hors sujet. Comme cela semble concerner la programmation de systèmes embarqués, il semblerait en un coup d'œil être sur le sujet. Le fait qu'il puisse également être sur le sujet sur Stack Overflow ne le fait pas en soi ici.
un CVn
@KamiKaze merci d'avoir posé la question, j'avais des questions similaires (je ne suis pas un utilisateur régulier de cette SE)
GPPK

Réponses:

20

Il s'agit de spécifier une adresse absolue à laquelle placer la variable.
Dans le manuel du compilateur XC8 page 27, section 2.5.2 Adressage absolu :

Les variables et les fonctions peuvent être placées à une adresse absolue en utilisant la __at()construction
......
2.5.2.2 DIFFÉRENCES
Les compilateurs 8 bits ont utilisé un symbole @ pour spécifier une adresse absolue

Eugene Sh.
la source
6

@est une extension courante non standard du langage C qui vous permet de déclarer une variable à une adresse spécifique. Il peut être utilisé pour les registres matériels mappés en mémoire, etc. Dans ce cas, la variable doit également être déclarée volatile, donc votre exemple est incorrect.

D'autres compilateurs utilisent quelque chose comme __attribute__(section...ou #pragma ..., tout cela non standard C.

La seule raison rationnelle (le cas échéant) pour laquelle les chaînes d'outils font cela, est d'activer le débogage des registres sur les débogueurs de merde. La syntaxe non standard garantira que le registre fera partie de la sortie de l'éditeur de liens et des informations de débogage. Ce qui à son tour vous permet de regarder le registre dans le débogueur merdique comme vous pouvez regarder n'importe quelle autre variable.

Si vous avez un bon débogueur, il aura le support et la connaissance de votre MCU spécifique. Ensuite, vous n'avez pas besoin de merde non standard dans le code C, mais vous pouvez écrire du C standard pur et portable à la place:

#define serv_ctr ( *(volatile uint8_t*)0x0002u )
Lundin
la source
1
Bien que les compilateurs soient tenus d'accepter ce dernier formulaire, les implémentations sont autorisées à mapper les numéros aux adresses comme bon leur semble. De plus, la plupart des compilateurs que j'ai vus utilisent @des plates-formes cibles de notation avec plusieurs espaces mémoire ou d'autres problèmes afin que la plupart des choses déclarées en utilisant la @notation se comportent différemment de tout ce qui pourrait être fait sans extensions.
supercat
1

Une courte extension:

Cela ne fonctionne plus depuis xc8 2.0 et supérieur. Il fallait maintenant écrire:

unsigned char serv_ctr __at(0x0002);

pour mettre une variable ( serv_ctr) à une adresse absolue ( 0x0002).

Avec XC8 2.0, il est possible de compiler votre ancien code en utilisant la @syntaxe si vous définissez les paramètres du compilateur pour utiliser le format "C90". Le paramètre ressemble à ceci, il est sous "Options globales XC8" et est appelé "Standard C".

Mike
la source
De nombreux autres compilateurs de systèmes embarqués prennent également en charge la @syntaxe, pas seulement Mplab.
Lundin