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?
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?
Réponses:
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
@
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 )
@
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.
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".
@
syntaxe, pas seulement Mplab.