Frage

Ich bin ein C-Programm für einen 8051-Architektur-Chip zu schreiben und die SDCC-Compiler.

Ich habe eine Struktur namens Filterstruktur;

mein Code sieht wie folgt aus ...

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

Aus irgendeinem Grund habe ich einen Link Fehler „? Aslink-Fehler-konnte nicht 29 aufeinanderfolgenden Bytes für Bereich DSEG im internen RAM bekommen“

Wenn ich die Zeile aus kommentieren, die sagt FilterStructure testStruct; der Fehler geht weg.

Was bedeuten diese Fehler? Muss ich die Struktur verwerfen, wenn ich damit fertig bin?

War es hilfreich?

Lösung

Die Nachricht bedeutet, dass Ihre lokale Variable testStruct nicht in RAM (oder DSEG die DATA SEGMENT Ihrer binären sein sollte) zugeordnet werden konnte, da der Speichermanager es zuzuteilen nicht 29 aufeinanderfolgenden Bytes finden konnte.

Das ist seltsam, da Ihre Struktur 8 Bytes lang .. sein sollte, aber btw ist es nichts mit Verwerfen die Struktur zu tun, scheint dies ein Speicher-Management-Problem .. Ich weiß nicht, 8051 specs so gut, aber es sollte ziemlich begrenzt sein nicht wahr?

EDIT: bei 8051 Spezifikationen schauen, um es so scheint es, 128 Byte RAM gerade hat. Dies kann das Problem verursachen, da die Variable, als lokale deklariert, in internen RAM zugewiesen wird, während Sie versuchen, sollte es auf einem externen RAM-Chip zuzuweisen, wenn es möglich ist (die Adress- / Datenbus des Chips verwendet wird), aber ich bin nicht sicher, da diese Art von Mikrocontroller nicht, diese Dinge zu tun, verwendet werden soll.

Andere Tipps

Sie haben nicht genügend Arbeitsspeicher laufen .... von den Blicken von ihm.

probieren Sie es aus, als globale Variable zu bewegen, sehen, ob es besser macht.

Nur eine Vermutung: 8051 hat nur 128 oder 256 Bytes von "internem RAM". Nicht so viel ... Es kann einen Teil davon als Stapel und einen Teil für die Register verwenden. Vielleicht zwingt den „großen“ (8 Byte !!!) Struktur auf dem Stapel, den Compiler zu viel Stack-Speicher im internen Speicher zu reservieren. Ich schlage vor, einen Blick in die Linker-Map-Datei haben, können Sie vielleicht „neu ordnen“, um die Speicherpartition. Die Massage sagt „aufeinanderfolgende Bytes“, so vielleicht noch genügend Raum gibt es sicher, aber es ist zersplittert.

Bye

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top