Allocation de mémoire par microcontrôleur

Je réfléchis depuis un jour à la question suivante:

Dans un ordinateur commun, lorsque vous allouez de la mémoire, vous le demandez à l’OS qui garde une trace des segments de mémoire occupés et de ceux qui ne le sont pas, et ne vous laisse pas déranger avec la mémoire des autres programmes microcontrôleur, je veux dire un microcontrôleur n’a pas de système d’exploitation en cours d’exécution, donc quand vous demandez beaucoup de mémoire, que se passe-t-il? vous ne pouvez pas simplement accéder à la puce de mémoire et accéder à un endroit aléatoire car elle peut être occupée … qui garde la trace des parties de la mémoire déjà occupées et vous laisse un espace libre pour stocker quelque chose?

MODIFIER:

J’ai programmé des microcontrôleurs en C … et je pensais que la réponse pourrait être “indépendante du langage”. Mais laissez-moi être plus clair: supposons que ce programme fonctionne sur un microcontrôleur:

int i=0; int d=3; 

qu’est-ce qui fait que mes variables i et d ne sont pas stockées au même endroit en mémoire?

Je pense que les commentaires ont déjà couvert cette …

Demander de la mémoire signifie que vous avez un système de gestion de la mémoire à partir duquel vous effectuez un mallochage (en utilisant un sens vague du terme système d’exploitation). Tout d’abord, vous ne devriez pas faire de mallocage mémoire dans un microcontrôleur en règle générale (je risque de me trouver flambé pour cette déclaration). Cela peut être fait dans certains cas, mais vous contrôlez votre mémoire, vous possédez le système avec votre application, demander de la mémoire signifie le demander.

Sauf si vous avez des raisons pour lesquelles vous ne pouvez pas allouer statiquement vos structures ou vos tableaux, ni utiliser une union s’il existe des chemins de code mutuellement exclusifs qui pourraient tous deux utiliser une grande partie ou la totalité de la mémoire disponible, vous pouvez essayer d’allouer de manière dynamic et libre, mais le système est plus dur. problème d’ingénierie à résoudre.

Il y a une différence entre l’allocation de mémoire à l’exécution et le temps de compilation. votre exemple n’a rien à voir avec le rest de la question

int i = 0; int d = 3;

le compilateur au moment de la compilation alloue deux emplacements dans .data un pour chacun de ces éléments. L’éditeur de liens et / ou le script gèrent l’endroit où réside .data et ses limitations en taille. Si .data est plus volumineux que ce qui est disponible, vous devriez obtenir un avertissement d’éditeur de liens. Si ce n’est pas le cas, vous devez adapter vos commandes ou votre script à l’éditeur système.

L’allocation d’exécution est gérée au moment de l’exécution et la manière dont elle gère la mémoire est déterminée par cette bibliothèque, même si vous disposez de suffisamment de mémoire, une bibliothèque mal ou incorrectement écrite peut chevaucher .text, .data, .bss et / ou la stack et causer beaucoup de problèmes.

L’utilisation excessive de la stack est également un problème assez grave d’ingénierie système qui, de nos jours, est souvent négligé en raison de la quantité de mémoire disponible. C’est un problème très réel lorsqu’il s’agit de code incorporé sur un microcontrôleur. Vous devez connaître votre utilisation de la stack dans le pire des cas, laisser assez de place pour au moins autant de mémoire si vous avez un tas à allouer de manière dynamic, ou même si vous allouez de manière statique.