Почему использование структуры в программе на C вызывает ошибку Link - PullRequest
0 голосов
/ 10 марта 2010

Я пишу программу на C для чипа архитектуры 8051 и компилятора SDCC.

У меня есть структура с именем FilterStructure;

мой код выглядит так ...

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

По какой-то причине я получаю ошибку ссылки "? ASlink-Error-Не удалось получить 29 последовательных байтов во внутренней памяти для области DSEG"

Если я закомментирую строку, которая говорит FilterStructure testStruct;, ошибка исчезнет.

Что означает эта ошибка? Нужно ли мне отказаться от структуры, когда я закончу с ней?

Ответы [ 3 ]

1 голос
/ 10 марта 2010

Это сообщение означает, что ваша локальная переменная testStruct не может быть выделена в ОЗУ (или DSEG, который должен быть СЕГМЕНТ ДАННЫХ вашего двоичного файла), так как ваш менеджер памяти не смог найти 29 последовательных байтов для ее выделения.

Это странно, поскольку ваша структура должна иметь длину 8 байт ... но, кстати, это не имеет никакого отношения к удалению структуры, это кажется проблемой управления памятью. Я не очень хорошо знаю спецификации 8051, но она должна быть довольно ограниченной право?

РЕДАКТИРОВАТЬ: глядя на спецификации 8051, кажется, что он просто имеет 128 байтов оперативной памяти. Это может вызвать проблему, потому что переменная, объявленная как локальная, выделяется во внутренней памяти, в то время как вы должны попытаться разместить ее на внешней микросхеме памяти, если это возможно (используя адрес / шину данных микросхемы), но я не уверен, так как этот тип микроконтроллера не должен использоваться для таких вещей.

1 голос
/ 10 марта 2010

Просто предположение: 8051 имеет только 128 или 256 байт «внутренней оперативной памяти». Не так много ... Он может использовать его часть как стек и часть для регистров. Возможно, ваша «большая» (8 байт !!!) структура в стеке заставляет компилятор резервировать слишком много стекового пространства во внутренней памяти. Предлагаю заглянуть в файл карты компоновщика, может быть, вы сможете «переставить» раздел памяти. Массаж говорит «последовательные байты», поэтому, возможно, места еще достаточно, но он фрагментирован.

Bye

1 голос
/ 10 марта 2010

у вас закончилась память ... судя по всему.

попробуйте выдвинуть его как глобальную переменную, посмотрите, улучшится ли это.

...