const
signifie que la variable ne peut pas être modifiée par le code c, pas qu'il ne peut pas changer. Cela signifie qu'aucune instruction ne peut écrire dans la variable, mais sa valeur peut encore changer. Signifie que la variable peut changer à tout moment et que, par conséquent, aucune valeur mise en cache ne peut être utilisée; chaque accès à la variable doit être exécuté à son adresse mémoire.
Puisque la question est étiquetée « embedded » et en supposant temp
est une variable déclarée utilisateur, et non un registre concernant le matériel (puisque ceux-ci sont généralement traitées dans un fichier .h séparé), pensez à:
Un processeur embarqué qui possède à la fois une mémoire de données en lecture/écriture volatile (RAM) et une mémoire de données en lecture seule non volatile, par exemple FLASH dans l'architecture von-Neumann, où les données et l'espace programme partagent un bus de données et d'adresses commun. Si vous déclarez const temp
pour avoir une valeur (au moins si elle est 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, elle a toujours besoin d'une mémoire FLASH pour stocker la valeur initiale de la variable, en 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é à 0 au démarrage (cstart), les valeurs mises en mémoire cache peuvent être utilisés.
const int temp;
est une variable stockée dans (en lecture seule) FLASH, initialisée à 0 au moment du compilateur, des valeurs en mémoire cache peuvent être utilisées.
volatile int temp;
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 (lecture ony) FLASH, initialisé à 0 au moment du compilateur, les valeurs mises en cache ne seront pas utilisées
VIENT Voici la partie utile:
De nos jours, les processeurs les plus intégré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
peut être modifié à 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 consisterait à utiliser temp
pour le numéro de série du périphérique. La première fois que le processeur embarqué fonctionne, temp
sera égal à 0 (ou la valeur déclarée) et une fonction peut utiliser ce fait pour effectuer un test pendant la production et si possible, demander à recevoir un numéro de série et modifier la valeur de temp
au moyen d'une fonction spéciale. Certains processeurs ont une plage d'adresses spéciale avec une mémoire OTP (programmable une seule fois) juste pour cela.
Mais voici la différence:
Si const int temp
est un ID modifiable au lieu d'un numéro de série programmable une seule fois et ne déclare pas volatile
, une valeur mise en cache peut être utilisé jusqu'à ce que le prochain démarrage, ce qui signifie la nouvelle ID peut ne pas être valide jusqu'au prochain redémarrage, ou pire encore, certaines fonctions peuvent utiliser la nouvelle valeur alors que d'autres peuvent utiliser une ancienne valeur mise en cache jusqu'à redémarrage. Si const int temp
est déclaré voltaile
, le changement d'ID prend effet immédiatement.
Vous ne voudriez pas utiliser 'const volatile int temp; 'à la portée du bloc (c'est-à-dire à l'intérieur de' {} '), il ne sert à rien ici. –