2017-01-18 3 views
2

J'ai utilisé peu de types de microcontrôleurs. Quand j'écris code comme ceci:Y a-t-il un cas où les données const devraient être chargées dans la RAM plutôt que dans l'accès direct au flash

const int var = 5; 

habituellement var est maintenue en flash. Je comprends que les variables const ne sont pas toujours conservées uniquement en flash. Parfois (en fonction du compilateur, processeur, options comme pic etc.) ils sont chargés de flash à RAM avant main. Y at-il un cas, quand il est préférable de charger var dans la RAM?

+0

Je ne peux pas penser à un cas où cela aurait de l'importance. Bien sûr, en supposant que vous n'écrivez pas en flash. Puis-je connaître le contexte de cette question? comment est-il apparu en premier lieu? – jwsc

+0

Les mémoires flash sont plus susceptibles d'avoir des "états d'attente", dans le cas où le processeur est plus rapide que la mémoire physique. Mais n'importe quelle forme de mémoire pourrait avoir cela, y compris RAM ou cache de données. – Lundin

+0

Je demande la curiosité personnelle. Je comprends que const variriables ne sont pas toujours garder en flash. Parfois (en fonction du compilateur, du processeur), il y a des charges de flash à ramer avant la main. –

Répondre

2

De nombreux microcontrôleurs ont un espace d'adressage unifié, mais pas certains (comme les AVR). Lorsqu'il existe plusieurs espaces adresse, vous devrez peut-être utiliser des instructions différentes pour accéder aux données dans ces espaces. (Pour AVR, le LPM (Programme Mémoire de chargement) instruction doit être utilisée pour accéder aux données dans Flash, au lieu d'un des LD ordinaires (instructions de chargement).)

Si vous imaginez un pointeur à votre variable const, fonction la réception du pointeur ne serait pas en mesure d'accéder aux données à moins de savoir dans quel espace d'adresse le pointeur pointe. Dans un cas comme celui-ci, vous devez soit copier les données dans la RAM, même si c'est const, ou l'utilisateur du pointeur doit savoir quelle instruction utiliser pour accéder aux données.

1

En supposant une architecture de microcontrôleur comme ARM Cortex ou Microchip MIPS (et beaucoup d'autres), RAM et Flash sont mappés à différentes parties de l'espace d'adressage interne, comme un immense tableau. Ainsi, les commandes d'assemblage de la RAM sont les mêmes que celles de Flash. Aucune différence ici.

Les temps d'accès à la RAM et à la mémoire flash ne doivent pas être trop différents, donc aucune attente n'est requise sur les contrôleurs avec lesquels j'ai travaillé. Le seul cas que je puisse imaginer où stocker des const vars dans Flash pourrait causer des problèmes est dans une sorte d'application bootloader, quand le flash est écrit. Bien sûr, écrire sur une plage de flash à partir de laquelle vous exécutez est une mauvaise idée et causera beaucoup plus de problèmes que des valeurs const écrasées.