Perché utilizzare una struttura in C errore di collegamento al programma, causa

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

  •  19-09-2019
  •  | 
  •  

Domanda

Sto scrivendo un programma C per un chip 8051 architettura e il compilatore SDCC.

Ho una struttura chiamata FilterStructure;

il mio codice simile a questo ...

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

Per qualche motivo ottengo un errore di collegamento "? ASlink-Error-Non potrebbe ottenere 29 byte consecutivi nella RAM interna per l'area DSEG"

Se io commento la riga che dice FilterStructure testStruct; l'errore va via.

Che cosa significa questo errore? Ho bisogno di scartare la struttura quando mi sono fatto con esso?

È stato utile?

Soluzione

Il messaggio significa che il vostro testStruct variabile locale non poteva essere allocato in RAM (o DSEG che dovrebbe essere DATI segmento del binario), dal momento che il gestore della memoria non riusciva a trovare 29 byte consecutivi di allocare esso.

Questo è strano dal momento che la tua struct deve essere di 8 byte lunghi .. ma btw non è niente a che fare con scartando la struttura, questo sembra un problema di gestione della memoria .. non so 8051 spec così bene, ma dovrebbe essere abbastanza limitata giusto?

EDIT: guardando 8051 spec sembra che ha appena 128 byte di RAM. Ciò può causare il problema perché la variabile, dichiarata come un locale, è allocato nella RAM interna, mentre si dovrebbe cercare di allocare su un chip RAM esterna se è possibile (tramite bus indirizzi / dati del chip), ma sono non è sicuro dal momento che questo tipo di microcontrollori non deve essere usato per fare queste cose.

Altri suggerimenti

si è a corto di memoria .... dagli sguardi di esso.

provare a spostare fuori come una variabile globale, vedere se questo fa meglio.

Solo una supposizione: 8051 ha solo 128 o 256 byte di "RAM interna". Non tanto ... E 'possibile utilizzare una parte di esso come parte dello stack e per i registri. Forse i vostri "grandi" (8 byte !!!) la struttura sulla pila costringe il compilatore di riservare troppo spazio di stack all'interno della memoria interna. Vi suggerisco di dare un'occhiata nel file linker carta, forse si può "riorganizzare" la partizione di memoria. Il massaggio dice "byte consecutivi", quindi forse c'è ancora abbastanza spazio availabe, ma è frammentata.

Ciao

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top