Перейти к содержанию
    

IDE Keil

Добрый день! Работаю в среде Keil, пишу для Si1020 - микроконтроллер, совместимый с 8051 по командам, но 128 KB Flash и 8 KB RAM. При компиляции проекта возникла ошибка линковщика

L107 - Address Space Overflow, хотя в сумме размер скомпилированного кода 63138 байт, а RAM - 5116 байт, что меньше 128 К и 8 К, соответственно. Не поможет ли кто понять в чём я неправ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...Не поможет ли кто понять в чём я неправ?

 

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

коментарий уменьшаете и так до строчки, если раньше не увидите глазками.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добрый день! Работаю в среде Keil, пишу для Si1020 - микроконтроллер, совместимый с 8051 по командам, но 128 KB Flash и 8 KB RAM. При компиляции проекта возникла ошибка линковщика

L107 - Address Space Overflow, хотя в сумме размер скомпилированного кода 63138 байт, а RAM - 5116 байт, что меньше 128 К и 8 К, соответственно. Не поможет ли кто понять в чём я неправ?

128k мне помнится это страничная память ее переключать надо

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не поможет ли кто понять в чём я неправ?

Было бы легче Вам подсказать, если бы Вы привели бы текст сообщения об ошибке полностью.

 

Вероятная ошибка в том, что 8051 содержит в себе несколько типов RAM, отличающихся методами (командами) доступа к содержимому, и которые специфицируются нестандартными ключевыми словами: data, idata, bdata, xdata, pdata. Распределение переменных между этими типами RAM производится программистом (задается спецификатор типа памяти или команды линкера) либо самим транслятором\компановщиком путем задания модели памяти SMALL, COMPACT или LARGE.

 

Подозреваю, что Вам достаточно будет указать модель памяти LARGE, чтобы избавиться от ошибки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добрый день!

Memory model Large: Variables in XDATA. Пробовал даже перед декларацией каждой переменной ставить XDATA.

Code ROM size: Large 64 K Program Поставил галочки в Use OnChip ROM, Use OnChip XRAM.

 

Ошибка Error L107 - Address space Overflow.

 

Память, действительно, сегментирована, но первые 32 К - не сегментированные, переключаются на три банка "верхние" 32 К.

У меня программа на данный момент даже без оптимизации кода 63222 байта и RAM 2876 Байт. То есть должно умещаться без переключения сегментов.

 

Да, ещё, про оптимизацию. Использую прерывания по часовому таймеру (static void Alarm_isr (void) interrupt 8 using 1).

При уровне оптимизации кода до 2 (Data Overlaying) включительно работает как и хочу.

Если не изменяя кода поставить уровень оптимизации выше - прерывается один раз и дальше программа не идёт.

С отладчиком было бы просто, но, так как программа "пролеченная" аппаратный отладчик Silicon Laboratories USB Debug Adapter

умеет только загружать программу. Отлаживать приходится на Симуляторе, а он не умеет прерыватьсяя от таймера.

Может, кто сталкивался с нюансами оптимизации?

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...