Почему использование структуры в программе C вызывает ошибку ссылки

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

  •  19-09-2019
  •  | 
  •  

Вопрос

Я пишу программу на 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; ошибка уходит.

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

Пока

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top