Почему использование структуры в программе на C вызывает ошибку Link
Я пишу программу на 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 ответа
Сообщение означает, что ваша локальная переменная testStruct
не может быть выделено в ОЗУ (или DSEG, который должен быть СЕГМЕНТОМ ДАННЫХ вашего двоичного файла), поскольку ваш менеджер памяти не смог найти 29 последовательных байтов для его выделения.
Это странно, так как ваша структура должна иметь длину 8 байт... но, кстати, это не имеет никакого отношения к удалению структуры, это кажется проблемой управления памятью... Я не очень хорошо знаю спецификации 8051, но она должна быть довольно ограниченной, верно?
РЕДАКТИРОВАТЬ: глядя на спецификации 8051, кажется, что он просто имеет 128 байтов оперативной памяти. Это может вызвать проблему, потому что переменная, объявленная как локальная, выделяется во внутренней памяти, в то время как вы должны попытаться разместить ее на внешней микросхеме памяти, если это возможно (с использованием шины адреса / данных микросхемы), но я не уверен, так как этот вид микроконтроллера не должен использоваться для этих целей.
У вас закончилась память... судя по всему.
попробуйте переместить его как глобальную переменную, посмотрите, улучшит ли это его.
Просто предположение: 8051 имеет только 128 или 256 байт "внутренней оперативной памяти". Не так много... Он может использовать его часть как стек и часть для регистров. Возможно, ваша "большая" (8 байт!!!) структура в стеке заставляет компилятор резервировать слишком много стекового пространства во внутренней памяти. Предлагаю заглянуть в файл карты компоновщика, возможно, вы сможете "переставить" раздел памяти. Массаж говорит "последовательные байты", поэтому, возможно, места еще достаточно, но он фрагментирован.
до свидания