7
votes

Alignement de la structure C dans la mémoire flash interne

J'ai une structure de configuration que je voudrais enregistrer sur le flash interne du bras Cortex M3. Selon les spécifications, les données enregistrées dans le flash interne doivent être alignées sur 32 bits. Parce que j'ai beaucoup de booléen et des caractères dans ma structure, je ne veux pas utiliser 32bits pour stocker 8 bits ... j'ai décidé d'emballer la structure à l'aide du __ Emballé PRÉPROCESSOR PRAGMA, puis quand je Sauvegardez-le comme une structure entière, il suffit de vous assurer que la taille de la structure est divisible par 4 (4 octets = 32bits), je le fais en ajoutant des octets de rembourrage si nécessaire. Actuellement, au cours du développement, je modifie beaucoup la structure et pour le rendre aligné sur les 32 bits, j'ai besoin de changer les octets de rembourrage tout le temps. Actuellement, la structure ressemble à la résolution de ce xxx

est une meilleure façon de réaliser ce que je fais? Je suis assez nouveau dans la programmation intégrée, et je veux m'assurer que je ne fais pas d'erreurs.

Edit: Veuillez noter. Les données sont persistées à la fin du flash interne, alors omettre le remplissage ne fonctionnera pas ...


1 commentaires

Je croyais que votre compréhension n'est pas correcte. Les instructions de la mémoire flash peuvent devoir être alignées et garanties par compilateur. Mais les données stockées en flash même non alignées peuvent être gérées par ARM CORTEX M3 COREES. À quel MCU de la société utilisez-vous?


4 Réponses :


4
votes

Peut-être c'est une idée: xxx


1 commentaires

En fait, quand j'y pense. Si c'est déjà aligné, nous ajoutons 4 octets pour rien



4
votes

Solution 1: Vous pouvez le mettre à l'intérieur d'une union contenant votre structure et une gamme de caractères: xxx


2 commentaires

C'est intéressant, disons que la taille de (config) est inférieure à la taille du total_size. et j'ai défini la configuration dans l'Union. Quel sera la taille de (my_union)?


Si config est plus petit que total_size thin Tailleof (My_Union) sera la taille de total_size concrètement 32.



1
votes

Solution 2: Vous pouvez utiliser la fonction IAR-SPÉCIFIQUE #pragma Emplacement CODE> Pour placer les données de configuration à un emplacement spécifique, comme 32 à partir de la fin du flash. De cette façon, vous n'avez pas besoin de céder la structure de quelque manière que ce soit:

/* Fictitious end of flash location. */ 
#pragma location=0x1234FFE0
struct [... your struct goes here ...]


0 commentaires

4
votes

Premièrement, l'alignement emballé doit généralement être évité, si vous vous retrouvez avec des données non alignées sur leurs limites naturelles, certains processeurs émettront simplement un piège lorsque vous essayez d'y accéder.

Premièrement, stockez les membres dans une commande afin que le compilateur n'ajoute pas de lacunes pour l'alignement (ou si cela le fait, il l'ajoute à la fin). Si vous le pouvez, demandez au 1. membre de l'alignement que vous désirez - comme cela oblige le compilateur à donner au moins à la structure que beaucoup d'alignement. P>

Cela nécessite des connaissances sur la manière dont les exigences d'alignement de votre plateforme et compilateur, par exemple Débarrassez-vous de la matrice de rembourrage et modifiez P>

typedef struct
{
uint32_t blabla;
uint16_t delay;
uint8_t status;
uint8_t foo[5];
} CONFIG;


1 commentaires

Excellente réponse et bien indiqué. Le programme de test d'échantillon est essentiel à votre réussite ou à votre échec, vous ne pouvez pas ignorer cette étape si vous souhaitez faire ce que vous essayez de faire avec les structures entre les domaines de la compilation (envisager du matériel pour être un domaine de compilation).