Pergunta

Eu estou escrevendo um programa C para um chip 8051 arquitetura eo compilador SDCC.

Eu tenho uma estrutura chamada FilterStructure;

meu código se parece com isso ...

#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;
}

Por alguma razão eu recebo um erro link "? ASlink-Error-Não foi possível obter 29 bytes consecutivos na RAM interna para a área DSEG"

Se eu comente a linha que diz FilterStructure testStruct; o erro desaparece.

O que isso significa erro? Eu preciso descartar a estrutura quando estou a fazer com ele?

Foi útil?

Solução

Os meios de mensagem que o testStruct variável local não poderia ser alocados no RAM (ou DSEG que devem ser dados do segmento do seu binário), uma vez que o seu gerenciador de memória não poderia encontrar 29 bytes consecutivos para alocá-lo.

Esta é estranho, já que a sua estrutura deve ser de 8 bytes de comprimento .. mas btw Não tem nada a ver com descartando a estrutura, este parece ser um problema de gerenciamento de memória .. Não sei 8051 specs tão bem, mas deve ser bastante limitado certo?

EDIT: olhando para 8051 specs parece que só tem 128 bytes de RAM. Isto pode causar o problema porque a variável, declarado como um local, é alocado na memória RAM interna, enquanto você deve tentar alocá-lo em um chip de memória RAM externa se é possível (usando o barramento de endereços / dados do chip), mas estou não tenho certeza uma vez que este tipo de microcontrolador não deve ser usado para fazer essas coisas.

Outras dicas

você correr para fora da memória .... por que parece.

tente movê-lo fora como uma variável global, ver se isso faz com que seja melhor.

Apenas um palpite: 8051 tem apenas 128 ou 256 bytes de "RAM interna". Não tanto ... Ele pode usar parte dele como pilha e parte dos ficheiros. Talvez seus "grandes" (8 bytes !!!) estrutura sobre as forças de pilha do compilador para reservar muito espaço de pilha dentro da memória interna. Eu sugiro dar uma olhada no arquivo de mapa de vinculador, talvez você possa "reorganizar" a partição de memória. A massagem diz "bytes consecutivos", por isso, talvez ainda há o suficiente availabe espaço, mas está fragmentada.

Bye

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top