Pourquoi l'utilisation d'une structure dans le programme C cause de l'erreur de lien

StackOverflow https://stackoverflow.com/questions/2420358

  •  19-09-2019
  •  | 
  •  

Question

Je suis en train d'écrire un programme C pour une puce d'architecture 8051 et le compilateur SDCC.

J'ai une structure appelée FilterStructure;

mon code ressemble à ceci ...

#define NAME_SIZE 8

typedef struct {
char Name[NAME_SIZE];
} FilterStructure;

void ReadFilterName(U8 WheelID, U8 Filter, FilterStructure* NameStructure);

int main (void)
{
    FilterStructure testStruct;
    ReadFilterName('A', 3, &testFilter);     
    ...
    ...
    return 0;
}

void ReadFilterName(U8 WheelID, U8 Filter, FilterStructure* NameStructure)
{    
    int StartOfName = 0;
    int i = 0;
    ///... do some stuff...
    for(i = 0; i < 8; i++)
    {
        NameStructure->Name[i] = FLASH_ByteRead(StartOfName + i);
    }
    return;
}

Pour une raison quelconque, je reçois une erreur de lien « ? ASLINK-erreur-Impossible d'obtenir 29 octets consécutifs dans la RAM interne pour la zone DSEG »

Si je commente la ligne qui dit FilterStructure testStruct; l'erreur disparaît.

Qu'est-ce que cette erreur? Ai-je besoin de se défaire de la structure quand je suis fait avec elle?

Était-ce utile?

La solution

Le message signifie que votre testStruct variable locale ne peut être allouée dans la mémoire vive (ou DSEG qui devrait être SEGMENT DATA de votre binaire), depuis votre gestionnaire de mémoire n'a pas pu trouver 29 octets consécutifs de la renvoyer.

Ceci est étrange puisque votre struct doit être de 8 octets .. mais BTW il n'y a rien à voir avec le rejet de la structure, ce qui semble un problème de gestion de la mémoire .. Je ne sais pas 8051 spécifications si bien, mais il devrait être assez limitée droit?

EDIT: regarder 8051 spécifications, il semble qu'il a juste 128 octets de RAM. Cela peut provoquer le problème, car la variable, déclarée en tant que local, est attribué dans la RAM interne alors que vous devriez essayer de répartir sur une puce de RAM externe s'il est possible (en utilisant l'adresse / bus de données de la puce), mais je suis pas sûr puisque ce genre de micro-contrôleur ne doit pas être utilisé pour faire ces choses.

Autres conseils

vous avez exécuté de mémoire .... par les regards de celui-ci.

essayez de le déplacer comme une variable globale, voir si cela fait mieux.

Juste une supposition: 8051 ne dispose que de 128 ou 256 octets de « RAM interne ». Pas tellement ... Il peut utiliser une partie de celui-ci sous forme de pile et une partie des registres. Peut-être vos « grands » (8 octets !!!) la structure sur la pile oblige le compilateur à réserver trop d'espace de pile dans la mémoire interne. Je vous suggère de jeter un oeil dans le fichier de carte de liaison, vous pouvez peut-être « réorganiser » la partition de mémoire. Le massage dit « octets consécutifs », alors peut-être il y a encore assez availabe l'espace, mais il est fragmenté.

Bye

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top