const
signifie que la variable ne peut pas être modifiée par le code c, pas qu'elle ne peut pas changer. Cela signifie qu'aucune instruction ne peut écrire dans la variable, mais sa valeur peut encore changer.
volatile
signifie que la variable peut changer à tout moment et qu'aucune valeur mise en cache ne peut donc être utilisée; chaque accès à la variable doit être exécuté à son adresse mémoire.
Puisque la question est étiquetée "intégrée" et en supposant temp
s'agit d'une variable déclarée par l'utilisateur et non d'un registre lié au matériel (puisque ceux-ci sont généralement traités dans un fichier .h séparé), considérez:
Processeur intégré qui possède à la fois une mémoire de données volatile en lecture-écriture (RAM) et une mémoire de données non volatile en lecture seule, par exemple une mémoire FLASH dans l'architecture von-Neumann, où les données et l'espace de programme partagent un bus de données et d'adresses commun.
Si vous déclarez const temp
avoir une valeur (au moins si différente de 0), le compilateur affectera la variable à une adresse dans l'espace FLASH, car même si elle était affectée à une adresse RAM, il a encore besoin de mémoire FLASH pour stocker la valeur initiale de la variable, faisant de l'adresse RAM une perte d'espace puisque toutes les opérations sont en lecture seule.
En conséquence:
int temp;
est une variable stockée dans la RAM, initialisée à 0 au démarrage (cstart), les valeurs mises en cache peuvent être utilisées.
const int temp;
est une variable stockée dans (en lecture seule) FLASH, initialisée à 0 au moment du compilateur, les valeurs mises en cache peuvent être utilisées.
volatile int temp;
est une variable stockée dans la RAM, initialisée à 0 au démarrage (cstart), les valeurs mises en cache ne seront PAS utilisées.
const volatile int temp;
est une variable stockée dans (en lecture seule) FLASH, initialisée à 0 au moment du compilateur, les valeurs mises en cache ne seront PAS utilisées
Voici la partie utile:
De nos jours, la plupart des processeurs embarqués ont la possibilité d'apporter des modifications à leur mémoire non volatile en lecture seule au moyen d'un module de fonction spécial, auquel cas const int temp
peuvent être modifiés au moment de l'exécution, mais pas directement. Dit d'une autre manière, une fonction peut modifier la valeur à l'adresse oùtemp
est stockée.
Un exemple pratique serait d'utiliser temp
pour le numéro de série de l'appareil. La première fois que le processeur embarqué s'exécute, temp
sera égal à 0 (ou à la valeur déclarée) et une fonction peut utiliser ce fait pour exécuter un test pendant la production et en cas de succès, demander à se voir attribuer un numéro de série et modifier la valeur detemp
par des moyens d'une fonction spéciale. Certains processeurs ont une plage d'adresses spéciale avec une mémoire OTP (programmable une fois) juste pour cela.
Mais voici la différence:
S'il const int temp
s'agit d'un identifiant modifiable au lieu d'un numéro de série programmable à volatile
usage unique et n'est PAS déclaré , une valeur mise en cache peut être utilisée jusqu'au prochain démarrage, ce qui signifie que le nouvel identifiant peut ne pas être valide jusqu'au prochain redémarrage, ou pire encore, certaines fonctions peut utiliser la nouvelle valeur tandis que d'autres peuvent utiliser une ancienne valeur mise en cache jusqu'au redémarrage. Si const int temp
IS déclaré voltaile
, le changement d'identifiant prendra effet immédiatement.
const volatile int temp;
à la portée du bloc (c'est-à-dire à l'intérieur{ }
), cela n'a aucune utilité là-bas.