Pregunta

Estoy escribiendo un programa en C para un chip 8051 arquitectura y el compilador SDCC.

Tengo una estructura llamada FilterStructure;

mi código es el siguiente ...

#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 alguna razón, me sale un error de enlace "? Aslink-Error-No se pudo obtener 29 bytes consecutivos en la memoria RAM interna para el área DSEG"

Si comento hacia fuera la línea que dice FilterStructure testStruct; el error desaparece.

¿Qué significa este error? ¿Es necesario descartar la estructura cuando he terminado con ella?

¿Fue útil?

Solución

El mensaje significa que su testStruct variable local no pudo ser asignado en la memoria RAM (o DSEG que debe estar segmento de datos de su binario), ya que su administrador de memoria no se pudo encontrar 29 bytes consecutivos para asignar a él.

Esto es extraño, ya que su estructura debe ser de 8 bytes de largo .. pero por cierto no tiene nada que ver con descartando la estructura, esto parece un problema de gestión de memoria .. No sé 8051 especificaciones tan bien, pero debe ser bastante limitada ¿verdad?

EDIT: 8051 mirando las especificaciones parece que sólo tiene 128 bytes de RAM. Esto puede causar el problema porque la variable, declarado como un local, se asigna en la memoria RAM interna, mientras que usted debe tratar de asignarlo en un chip de memoria RAM externa si es posible (mediante el bus de direcciones / datos del chip), pero estoy no estoy seguro ya que este tipo de microcontrolador no debe ser utilizado para hacer estas cosas.

Otros consejos

se le han acabado de la memoria .... por el aspecto de la misma.

trate de mover hacia fuera como una variable global, ver si eso lo hace mejor.

Sólo una conjetura: 8051 tiene sólo 128 o 256 bytes de "RAM interna". No tanto ... Se puede utilizar una parte de ella como parte pila y para los registros. Tal vez sus "grandes" (8 bytes !!!) de estructura en la pila obliga al compilador que reservar mucho espacio en la pila dentro de la memoria interna. Yo sugeriría a echar un vistazo en el archivo de mapa enlazador, tal vez se puede "reorganizar" la partición de memoria. El masaje dice "bytes consecutivos", por lo que quizás todavía hay suficiente espacio availabe, pero es fragmentado.

adiós

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top