2017-04-13 3 views
0

Je développe sur STM32 mC en utilisant IAR 7.80. Je dois représenter un bloc de mémoire spécifique dans Flash comme des variables de tailles différentes. par exemple à partir de l'emplacement 0x0800B00 J'ai les données suivantes: 4 octets qui sont un flottant, un tableau de caractères de taille 4, puis 4 octets qui sont un uint32_t. actuellement je précise l'emplacement spécifique de chaque variable de sorte que pour l'exemple ci-dessus j'écrire:définition d'un bloc de mémoire en flash comme variables dans IAR

_Pragma("location=0x0800B000") const float first_var = 5.0; 
_Pragma("location=0x0800B004") const char[4] second_var = {1,2,3,4}; 
_Pragma("location=0x0800B008") const uint32_t third_var = 1000; 

en réalité j'ai plus de 100 variables telles et l'ajout/suppression des variables est fréquente dans ce stade de développement, ainsi, chaque fois que je supprime une variable, je dois soit réorganiser les emplacements de toutes les variables de trous de congé! Existe-t-il une meilleure façon de représenter ces variables? note: Je dois pouvoir prendre le bloc de mémoire et l'analyser dans une application PC, par conséquent, j'ai besoin que chaque variable occupe sa taille exactement et pas plus!

Répondre

1

Le moyen le plus pratique de résoudre ce problème consiste à utiliser une structure avec un certain nombre de champs séparés, un pour chaque variable, au lieu d'un ensemble de variables individuelles. Avec cette solution, vous n'avez qu'à spécifier l'emplacement une fois, vous êtes assuré que les champs sont placés dans l'ordre que vous voulez et, si vous utilisez une structure condensée, vous pouvez mélanger des champs de différentes tailles tout en veillant à leur. Le seul prix que vous payez pour cela est le préfixe nécessaire pour transformer les accès variables aux accès structure.

0

L'approche alternative consiste à spécifier vos variables dans un format de fichier très facile à analyser. Vous pouvez utiliser CSV par exemple, et définir le type, le nom et la valeur par défaut dans différentes colonnes.

Ensuite, utilisez scripting langugage pour lire le fichier CSV et générer le fichier source C et calculer automatiquement les offsets. C'est très facile à faire avec quelque chose comme Python, qui a des routines de fichiers CSV dans la bibliothèque standard. En guise de bonus supplémentaire, vous pouvez également générer un nouveau fichier CSV avec des décalages calculés que le logiciel PC peut utiliser. Il sera plus facile pour l'application PC d'analyser, et vous n'avez pas besoin de modifier l'analyseur si vous devez changer le compilateur incorporé qui utilise une syntaxe pragma différente.

Vous pouvez utiliser un autre format de fichier ou un langage de script, mais l'idée de base reste la même. Vous obtenez une nouvelle exigence d'outil, mais gagnez beaucoup de flexibilité.

0

Le soutien récent est de définir les variables d'une région de la mémoire dans la zone flash avec la directive pragma suivante:

#pragma default_variable_attributes

Vous pouvez faire la même chose pour vos fonctions ainsi:

#pragma default_function_attributes

"how to do placement of a group of functions and variables"