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

IAR-Keil для C51 - работа с локальными переменными

Доброго времени суток!

 

Интересует опыт использования iar'а для С51, точнее эффективность компилятора по сравнению с Keil.

 

Собственно проблема следующая:

keil для локальных переменных выделяет память статически, причем линкер при определенных условиях может обеспечить совместное использование этой памяти разными процедурами.

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

 

У iar'а есть опция эмуляции 32-х регистров общего пользования, позволяет ли эта опция минимизировать потребление памяти локальными переменными?

 

Опыта работы с C51 к сожалению мало, подобная работа keil'а с локальными переменными была для меня настоящим сюрпризом - память неожиданно кончилась без видимых причин...

 

Всем заранее спасибо!

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


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

Лучше чем Keil среды для разработки программ для МК51, скорее всего, не найти.

Память кончилась? Включите оптимизацию - Level 4 должен помочь в эканомии памяти. Если и это не поможет - Вы, наверное, ошиблись с выбором МК...

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


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

Лучше чем Keil среды для разработки программ для МК51, скорее всего, не найти.

 

А вы пробовали? Конкретно про iar что-нибудь знаете?

 

Оптимизация 4 не помогает, ибо используется уже 8-я...

 

Может кто по существу что-нибудь напишет? Неужели никто iar'ом не пользовался?

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


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

Буквально на днях отказался от IAR в пользу Keil. Не вдаваясь в подробности скажу, что у Keilа реализация стандартных библиотек существенно лучше заточена под 51 ядро. В результате программа не влезавшая в 8К под IAR'ом влезла под Keil'ом еще и место осталось.

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


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

У iar'а как обстоят дела с локальными переменными?

 

У меня проблема с оперативной памятью - полностью забита.

Пишу новую функцию, объявляю локальную переменную, а он пишет что оперативка кончилась.

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


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

У iar'а как обстоят дела с локальными переменными?

Можно как и в Keil в виде overlapped области. Можно стандартно, в виде классического стека. Расположение стека также можно выбрать (data, idata, xdata)

 

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


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

Пишу новую функцию, объявляю локальную переменную, а он пишет что оперативка кончилась.
Скорее всего, так оно и есть. У МК51 оперативной памяти - не богато... Вам нужно заботится о её сохранении (например, флаги объявлять битовыми), или взять МК51 с "on-chip XRAM" на борту...

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


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

использую C8051F342 - 256 RAM+4096XRAM

вся забита под завязку

 

Очень много локальных переменных типа unsigned long - причем для каждой из них компилятор выделяет 4 байта в XRAM

 

Меня интересует вопрос - делает ли так же IAR?

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


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

Буквально на днях отказался от IAR в пользу Keil. Не вдаваясь в подробности скажу, что у Keilа реализация стандартных библиотек существенно лучше заточена под 51 ядро. В результате программа не влезавшая в 8К под IAR'ом влезла под Keil'ом еще и место осталось.

Ну и что за критерий? Имеем меньшие по размеру библиотеки (это хорошо, а что у них со производительнорстью? Вообще-то использование стандартных библиотек на 51 у себя я вообще я что-то и не припомню ). Получается какая-то поверхностная оценка :).

P.S.

Я для 51 крайне редко что-то пишу, по этой причине совершенно не собираюсь дискутировать по поводу Keil/IAR. Просто не смог удержаться от комментария по поводу оценки критерия.

 

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


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

Меня интересует вопрос - делает ли так же IAR?
Вам выше уже ответили:

Можно как и в Keil в виде overlapped области. Можно стандартно, в виде классического стека.
Только, если Вы будете распологать локальные переменные в стеке, то тут же всплывет закономерный вопрос : достаточно ли выделенной под стек памяти для размещения локальных переменных? Keil ещё на этапе линковки по-возможности "перекрыл" области памяти, отводимые под локальные переменные, и определил: памяти - не хватает! Используя IAR, Вы немножко помучаетесь, определяя потребный размер стека, и, скорее всего, прийдёте к тому же выводу...

 

 

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


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

использую C8051F342 - 25д6 RAM+4096XRAM

вся забита под завязку

 

Очень много локальных переменных типа unsigned long - причем для каждой из них компилятор выделяет 4 байта в XRAM

Если не ошибаюсь, Keil анализирует программу (строит граф вызовов функций или что-то в этом духе) и оптимизирует использование памяти. То есть если на этапе компиляции известно, что две функции не вызывают друг друга, то их локальные переменные могут располагаться в перекрывающихся участках памяти. При анализе вызовов функций компилятор может быть сбит с толку, например, указателями на функции (попробуй проследи за ними). Так что я бы попытался понять, есть ли в программе что-то, что мешает компилятору делать свою работу.

Вот тут есть немного информации про указатели на функции и граф вызовов функций: Application Note 129 - Function Pointers in C51.

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


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

Только, если Вы будете распологать локальные переменные в стеке, то тут же всплывет закономерный вопрос : достаточно ли выделенной под стек памяти для размещения локальных переменных? Keil ещё на этапе линковки по-возможности "перекрыл" области памяти, отводимые под локальные переменные, и определил: памяти - не хватает! Используя IAR, Вы немножко помучаетесь, определяя потребный размер стека, и, скорее всего, прийдёте к тому же выводу...

 

основная моя мысль по поводу iar'а следующая:

он позволяет выполнять эмуляцию 32 регистров общего назначения вместо 8 регистров, то есть отказывается от использования банков

 

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

 

так ли это? может ли iar делать код подобный варианту для AVR'а(32 регистра для и аппаратный+программный стек)?

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


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

как я понимаю - такая тактика должна позволить минимизировать расходы памяти для размещения локальных переменных в стеке, что должно положительно сказаться на расходах памяти и быстродействии
На быстродействии - возможно, хотя в данном случае дополнительные регистры эмулируются - большой вопрос будет ли расти быстродействие. А, вот, на расход памяти это никоим образом не скажется - если некая функция использует регистр под переменную, то прежнее содержимое этого регистра необходимо сохранить в том же стеке...

 

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


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

Чтобы уменьшить расход памяти (особенно если много переменных по 4 байта) возможны следующие варианты

- почитать документацию на компилятор в части размещения локальных параметров. Сперва используются регистры банка, если их не хвататет (а этого всего 8 байт), то переменные размещаются в памяти согласно модели.

- по возможности сократить количество вложенных вызовов (особенно с передачей параметров).

- проверить объявление констант, так как без ключевого слова "code" данные могут копировать из флеши в ОЗУ.

- возможно для передачи параметров использовать глобальные переменные (некрасиво но иногда помогает).

 

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

 

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


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

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

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

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

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

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

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

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

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

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