|
Знатокам Кейла |
|
|
|
Nov 11 2008, 06:06
|

Знающий
   
Группа: Участник
Сообщений: 794
Регистрация: 4-09-06
Из: Москва(ЗелАО), РФ
Пользователь №: 20 055

|
При компиляции для At89c51rc ( 32 kB flash ) выдает такую ошибку:
Build target 'Target 1' linking... LX51 LINKER/LOCATER V4.17 - SN: ********* COPYRIGHT KEIL ELEKTRONIK GmbH 1995 - 2007 @.\Release\Exe\1 nnnn.lnp ".\Release\Exe\STARTUP.obj", ".\Release\Exe\MAIN.obj" TO ".\Release\Exe\1nnnn" PRINT(".\Release\1 nnnn.map") CLASSES (XDATA (X:0x0-X:0xFF), HDATA (X:0x0-X:0xFF), CODE (C:0x0-C:0x7FFF), CONST (C:0x0-C:0x7FFF), ECODE (C:0x0-C:0x7FFF), HCONST (C:0x0-C:0x7FFF)) *** ERROR L107: ADDRESS SPACE OVERFLOW SPACE: XDATA SEGMENT: ?XD?MAIN LENGTH: 000132H ****************************************************************************** * RESTRICTED VERSION WITH 0800H BYTE CODE SIZE LIMIT; USED: 4287H BYTE (831%) * ****************************************************************************** Program Size: data=10.6 xdata=321 const=0 code=17723 *** ERROR L107: ADDRESS SPACE OVERFLOW SPACE: XDATA SEGMENT: ?XD?MAIN LENGTH: 000132H *** ERROR L250: CODE SIZE LIMIT IN RESTRICTED VERSION EXCEEDED LIMIT: 0800H BYTES Target not created
Чего ему не хватат - ОЗУ, программной памяти или всего сразу? Или другие причины ( RESTRICTED VERSION WITH 0800H BYTE CODE SIZE LIMIT; USED: 4287H BYTE (831%) *)?
Сообщение отредактировал =L.A.= - Nov 11 2008, 06:08
--------------------
-Кто-то работает на совесть, а кто-то на других заказчиков.-
|
|
|
|
|
 |
Ответов
|
Nov 11 2008, 10:15
|

Знающий
   
Группа: Участник
Сообщений: 794
Регистрация: 4-09-06
Из: Москва(ЗелАО), РФ
Пользователь №: 20 055

|
Цитата(Палыч @ Nov 11 2008, 10:04)  Во-первых, ему не хватает внешней памяти (xdata). Определено, что её (xdata) всего 256 байт, а только в main требуется 306 (132h) байт. Памяти программ в МК хватает: нужно на всё чуть больше 17К, но версия Keil, та, что Вы используете имеет ограничение на создаваемый код - 2К (это - поддаётся лечению) Видимо, я напрасно поставил галку use on-chip XRAM? Поскольку по доке у At89c51rc 512 байт ОЗУ. А по процессу лечения сообщите поподробнее пжлст. Я пользовался советами ника VAI.
--------------------
-Кто-то работает на совесть, а кто-то на других заказчиков.-
|
|
|
|
|
Nov 11 2008, 11:12
|

Знающий
   
Группа: Участник
Сообщений: 794
Регистрация: 4-09-06
Из: Москва(ЗелАО), РФ
Пользователь №: 20 055

|
Цитата(Палыч @ Nov 11 2008, 14:00)  Возможно, ограничение на xdata в 256 байт - это тоже ограничение триальной версии... По поводу личения. Увы, я давно не использую Keil для новых проектов, а для поддержки старых - хватает древней версии Keil'а, поэтому плохо ориентируюсь в методах лечения современных версий. Ясно, что с лечением у Вас что-то не получилось... Когда я занимался самолечением для этого использовалась клизьма... В и-нете гуляли клизьмы с тремя цифирьками в конце (обозначение версии): 3хх - для АРМ; 7хх (позже 8хх) - для МК51. С клизьмой поставлась и инструкция по применению - (важно!) перед применением сгенерированной лицензии необходимо подменить указанный в инструкции и поставляемый с клизьмой файл (для Вас - L51.DLL). Результат применения можно проверить, если зайти в Keil'е (надеюсь, у Вас восьмая версия) в Menu->File->License Management - для продукта РК51Prof. Developers Kit должна быть действующая лицензия. Я применял эти рекомендации ( ника VAI ) только не перезапустил компьютер ( в них не указано, но очевидно, это необходимо) Теперь всё компилируется, если убрать галочку Use On chip XRAM (0x00 - 0xFF) Правда не работает. Будем смотреть далее.
--------------------
-Кто-то работает на совесть, а кто-то на других заказчиков.-
|
|
|
|
|
Nov 11 2008, 18:49
|

Знающий
   
Группа: Участник
Сообщений: 794
Регистрация: 4-09-06
Из: Москва(ЗелАО), РФ
Пользователь №: 20 055

|
Цитата(Палыч @ Nov 11 2008, 15:29)  Какой забавный МК Вы используете. Обратите внимание, что у него 512 байт On-chip RAM, а не 512 байт On-chip XRAM. Надо бы посмотреть DS на предмет: "что сие означает?". Использую этот МК по причине острой необходимости, и считаю его не забавным, а дерьмовым. DS я читал, если XRAM = expanded RAM (ERAM), то непонятно, почему галочка мешает. Правда атмеловские даташиты, прямо скажем, сумбурные. В общем, компилятор вроде зашуршал, а проблемы с неработоспособностью программы я как нибудь осилю  )
--------------------
-Кто-то работает на совесть, а кто-то на других заказчиков.-
|
|
|
|
|
Nov 12 2008, 07:02
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(=L.A.= @ Nov 11 2008, 21:49)  DS я читал, если XRAM = expanded RAM (ERAM), то непонятно, почему галочка мешает. Да, можно считать, что XRAM = expanded RAM (ERAM). Если посмотреть в DS, то размер ERAM равен 256. И Keil тоже так считает: возле галочки написано "Use On-chip XRAM (0x0-0xFF)". А, вот Вы пытаетесь поместить туда гораздо больше - 321 байт (судя по информации в Вашем первом посту). Кстати, у меня с подобной галкой были проблемы. Я считал, что установка этой галки заставит транслятор поместить в startup код устанавливающий бит в регистре, который разрешает использовать дополнительную внутреннюю память командами movx. Однако, ничего подобного не обнаружил. Пришлось startup править руками. Правда, это было давно, может быть, в современных версиях Keil'а это поправили (или я что-то тогда недопонял).
|
|
|
|
|
Nov 12 2008, 11:10
|

Знающий
   
Группа: Участник
Сообщений: 794
Регистрация: 4-09-06
Из: Москва(ЗелАО), РФ
Пользователь №: 20 055

|
Цитата(Палыч @ Nov 12 2008, 10:02)  Да, можно считать, что XRAM = expanded RAM (ERAM). Если посмотреть в DS, то размер ERAM равен 256. И Keil тоже так считает: возле галочки написано "Use On-chip XRAM (0x0-0xFF)". А, вот Вы пытаетесь поместить туда гораздо больше - 321 байт (судя по информации в Вашем первом посту).
Кстати, у меня с подобной галкой были проблемы. Я считал, что установка этой галки заставит транслятор поместить в startup код устанавливающий бит в регистре, который разрешает использовать дополнительную внутреннюю память командами movx. Однако, ничего подобного не обнаружил. Пришлось startup править руками. Правда, это было давно, может быть, в современных версиях Keil'а это поправили (или я что-то тогда недопонял). Да, переменных получается на 321 байт ОЗУ. Большой пасиб за консультацию. Но у меня ощущение, что я этот 89c51rc заброшу и перепишу прогу под ПИК. Чую, окажется быстрее по времени. P.S. А мне Кейл хвалили как наилучший для семейства МК51.... Даже боюсь предположить, как функционируют другие среды.
Сообщение отредактировал =L.A.= - Nov 12 2008, 11:14
--------------------
-Кто-то работает на совесть, а кто-то на других заказчиков.-
|
|
|
|
|
Nov 12 2008, 11:51
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(=L.A.= @ Nov 12 2008, 14:10)  Да, переменных получается на 321 байт ОЗУ. В действительности переменных получается на 332 байта, что должно поместиться в ОЗУ (RAM+ERAM). А вот с распределением этих переменных у Вас не всё в порядке: 10.6 байта (10 байт и ещё 6 битов) Вы размещаете в секции data ("нормальном" ОЗУ мк, оно же RAM), а остальные 321 байта пытаетесь разместить в секции xdata ("внешнем" ОЗУ, или ERAM, которая размером 256 байт). Если часть данных, которые Вы размещаете в xdata разместить в data, то всё должно поместиться. Не забудьте, что в "нормальном" ОЗУ ещё располагается стек и часть его (ОЗУ) отображена на регистры. Т.е. переместить в data желательно по минимуму, так, чтобы остальные данные поместились в xdata. Желательно в data хранить наиболее часто используемые переменные. Цитата(=L.A.= @ Nov 12 2008, 14:10)  А мне Кейл хвалили как наилучший для семейства МК51.... Даже боюсь предположить, как функционируют другие среды. Keil - действительно самое лучшее средство разработки для МК51, остальные и близко не стоят...
|
|
|
|
|
Nov 13 2008, 14:29
|

Знающий
   
Группа: Участник
Сообщений: 794
Регистрация: 4-09-06
Из: Москва(ЗелАО), РФ
Пользователь №: 20 055

|
Цитата(Палыч @ Nov 12 2008, 14:51)  Keil - действительно самое лучшее средство разработки для МК51, остальные и близко не стоят... А вы не могли бы подсказать, как расставить галочки в проекте, чтобы распихать 321 байт переменных по банкам ОЗУ? Может , еще какие нибудь директивы применить в исходнике? Поскольку программа, которую я пытаюсь откомпилировать вполне работоспособная, только довольно старая. Раньше её компилировали в IAR примерно 1990 года выпуска.
Эскизы прикрепленных изображений
--------------------
-Кто-то работает на совесть, а кто-то на других заказчиков.-
|
|
|
|
|
Nov 13 2008, 16:53
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(=L.A.= @ Nov 13 2008, 17:29)  А вы не могли бы подсказать... Попробую помочь... Только, если что запамятовал за давностью - строго не судите! 1. Галки на форме, что Вы привели - пусть стоят. Они указывают, что данные из базы Keil о размерах памяти применённого Вами мк будут переданы линкеру для контроля: "не вылезла ли программа и данные за рамки памяти?". Это полезно для контроля за размерами использованной памяти. (Надеюсь, что тип мк в опциях проекта Вы указали AT89C51RC). 2. Данные в окнах "Off-chip XDATA memory" - убрать (внешнюю память Вы к мк не прикручивали) 3. Распихивают данные по разным областям с помощью спецификаторов: data — внутренняя память данных, прямая адресация idata — внутренняя память данных, косвенная адресация bdata — внутренняя память данных, побитно-адресуемая область xdata — внешняя память данных, обращение через DPTR pdata — внешняя память данных, обращение через @R code — память программ Если спецификатор не указан, то переменная помещается в область по-умолчанию. Обычно, это: bdata для битовых переменных; code - для констант; data - для всех остальных. У Вас, наверное, при описании переменных стоят спецификаторы xdata или pdata (иначе, зачем бы транслятор пытался запихнуть столько переменных в xdata ?). Итак. Переменные, которые Вы собираетель разместить в ERAM надо описать примерно так int xdata i; unsigned char xdata ch[8]; char * xdata ptr; Поскольку, память ERAM имеет размер 256 байт, то ко всей памяти ERAM можно адресоваться косвенно через регистр. Поэтому, возможно, с точки зрения быстродействия и расходов памяти программ, выгоднее будет использовать спецификатор pdata, т.е. int pdata i; unsigned char pdata ch[8]; char * pdata ptr; Те же переменные, которые Вы собираетесь хранить в RAM нужно оставить без спецификаторов (или, если это почему-то не поможет, приписать спецификаторы bdata для битовых переменных и data для всех остальных) int k; char d[20]; int * ptr; или int data k; char data d[20]; int * data ptr; Если у Вас в программе часто используются указатели, то для увеличения быстродействия, сокращения потребной памяти (данных и программ), хорошо бы указывать на что указатели будут собственно указывать. Например char data * xdata ptr1; // ptr1 распологается в xdata, указывает на char, который храниться в data 4. Что бы ERAM стала работать, необходимо установить какой-то там бит в каком-то регистре (посмотрите в DS). Нужно поправить Startup, вставив в него соответствующие команды.
|
|
|
|
|
Nov 13 2008, 21:33
|

Знающий
   
Группа: Участник
Сообщений: 794
Регистрация: 4-09-06
Из: Москва(ЗелАО), РФ
Пользователь №: 20 055

|
Цитата(Палыч @ Nov 13 2008, 19:53)  пасиб, буду разбираться. Попробовал, локальные переменные никак не хотят попадать в сегмент data. Глобальные переменные туда перенеслись. Стартап не смотрел, но он вроде для просто MK51, где внутренняя память ERAM отсутствует. Но локальные переменные компилятор пихает именно туда. P.S. И ведь некоторые недовольны ПИКами за кривизну обращения к ОЗУ через банки!
Сообщение отредактировал =L.A.= - Nov 13 2008, 21:49
--------------------
-Кто-то работает на совесть, а кто-то на других заказчиков.-
|
|
|
|
|
Nov 14 2008, 06:54
|

Знающий
   
Группа: Участник
Сообщений: 794
Регистрация: 4-09-06
Из: Москва(ЗелАО), РФ
Пользователь №: 20 055

|
Цитата(Палыч @ Nov 14 2008, 09:35)  Извиняюсь - не углядел... Модель памяти в приведенной Вами форме нужно поставить "Small: variables in DATA" При таких установках ошибка compiling TST51RC.C... TST51RC.C(2528): error C249: 'DATA': SEGMENT TOO LARGE Target not created Если установить модель "Large", то результат ОК Build target 'Target 1' assembling STARTUP.A51... compiling TST51RC.C... linking... Program Size: data=61.6 xdata=261 code=5900 creating hex file from ".\RELEASE\EXE\test51rc"... ".\RELEASE\EXE\test51rc" - 0 Error(s), 0 Warning(s). Вчера нашел еще одно окошко, где настройки влияют на использование ОЗУ. Там надо было сбросить галочку "Use memory layout from target dialog"
Но что интересно у меня 2 почти одинаковых проекта с одинаковыми настройками, но в первом такое окошко есть, а в другом его нет.
Сообщение отредактировал =L.A.= - Nov 14 2008, 06:59
--------------------
-Кто-то работает на совесть, а кто-то на других заказчиков.-
|
|
|
|
Сообщений в этой теме
=L.A.= Знатокам Кейла Nov 11 2008, 06:06              Палыч Цитата(=L.A.= @ Nov 14 2008, 09:54) При т... Nov 14 2008, 07:10               =L.A.= Цитата(Палыч @ Nov 14 2008, 10:10) Это - ... Nov 14 2008, 07:26                Палыч Цитата(=L.A.= @ Nov 14 2008, 10:26) Но, к... Nov 14 2008, 08:24                 =L.A.= Цитата(Палыч @ Nov 14 2008, 11:24) Может ... Nov 25 2008, 08:08                  Andy_ry Цитата(=L.A.= @ Nov 25 2008, 12:08) ... М... Dec 16 2008, 13:58 AndreyS Цитата(=L.A.= @ Nov 11 2008, 09:06) При к... Mar 23 2009, 14:25 Палыч Цитата(AndreyS @ Mar 23 2009, 17:25) Подк... Mar 23 2009, 14:57  AndreyS Цитата(Палыч @ Mar 23 2009, 17:57) Для МК... Mar 23 2009, 18:55
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|