Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: IAR-Keil для C51 - работа с локальными переменными
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > MCS51
1kvi1
Доброго времени суток!

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

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

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

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

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

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

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

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

У меня проблема с оперативной памятью - полностью забита.
Пишу новую функцию, объявляю локальную переменную, а он пишет что оперативка кончилась.
shreck
Цитата(1kvi1 @ Aug 17 2011, 15:39) *
У iar'а как обстоят дела с локальными переменными?

Можно как и в Keil в виде overlapped области. Можно стандартно, в виде классического стека. Расположение стека также можно выбрать (data, idata, xdata)
Палыч
Цитата(1kvi1 @ Aug 17 2011, 12:39) *
Пишу новую функцию, объявляю локальную переменную, а он пишет что оперативка кончилась.
Скорее всего, так оно и есть. У МК51 оперативной памяти - не богато... Вам нужно заботится о её сохранении (например, флаги объявлять битовыми), или взять МК51 с "on-chip XRAM" на борту...
1kvi1
использую C8051F342 - 256 RAM+4096XRAM
вся забита под завязку

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

Меня интересует вопрос - делает ли так же IAR?
zltigo
QUOTE (shreck @ Aug 17 2011, 08:29) *
Буквально на днях отказался от IAR в пользу Keil. Не вдаваясь в подробности скажу, что у Keilа реализация стандартных библиотек существенно лучше заточена под 51 ядро. В результате программа не влезавшая в 8К под IAR'ом влезла под Keil'ом еще и место осталось.

Ну и что за критерий? Имеем меньшие по размеру библиотеки (это хорошо, а что у них со производительнорстью? Вообще-то использование стандартных библиотек на 51 у себя я вообще я что-то и не припомню ). Получается какая-то поверхностная оценка sm.gif.
P.S.
Я для 51 крайне редко что-то пишу, по этой причине совершенно не собираюсь дискутировать по поводу Keil/IAR. Просто не смог удержаться от комментария по поводу оценки критерия.
Палыч
Цитата(1kvi1 @ Aug 17 2011, 13:26) *
Меня интересует вопрос - делает ли так же IAR?
Вам выше уже ответили:
Цитата(shreck @ Aug 17 2011, 12:45) *
Можно как и в Keil в виде overlapped области. Можно стандартно, в виде классического стека.
Только, если Вы будете распологать локальные переменные в стеке, то тут же всплывет закономерный вопрос : достаточно ли выделенной под стек памяти для размещения локальных переменных? Keil ещё на этапе линковки по-возможности "перекрыл" области памяти, отводимые под локальные переменные, и определил: памяти - не хватает! Используя IAR, Вы немножко помучаетесь, определяя потребный размер стека, и, скорее всего, прийдёте к тому же выводу...

scifi
Цитата(1kvi1 @ Aug 17 2011, 13:26) *
использую C8051F342 - 25д6 RAM+4096XRAM
вся забита под завязку

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

Если не ошибаюсь, Keil анализирует программу (строит граф вызовов функций или что-то в этом духе) и оптимизирует использование памяти. То есть если на этапе компиляции известно, что две функции не вызывают друг друга, то их локальные переменные могут располагаться в перекрывающихся участках памяти. При анализе вызовов функций компилятор может быть сбит с толку, например, указателями на функции (попробуй проследи за ними). Так что я бы попытался понять, есть ли в программе что-то, что мешает компилятору делать свою работу.
Вот тут есть немного информации про указатели на функции и граф вызовов функций: Application Note 129 - Function Pointers in C51.
1kvi1
Цитата(Палыч @ Aug 17 2011, 22:56) *
Только, если Вы будете распологать локальные переменные в стеке, то тут же всплывет закономерный вопрос : достаточно ли выделенной под стек памяти для размещения локальных переменных? Keil ещё на этапе линковки по-возможности "перекрыл" области памяти, отводимые под локальные переменные, и определил: памяти - не хватает! Используя IAR, Вы немножко помучаетесь, определяя потребный размер стека, и, скорее всего, прийдёте к тому же выводу...


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

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

так ли это? может ли iar делать код подобный варианту для AVR'а(32 регистра для и аппаратный+программный стек)?
Палыч
Цитата(1kvi1 @ Aug 18 2011, 03:26) *
как я понимаю - такая тактика должна позволить минимизировать расходы памяти для размещения локальных переменных в стеке, что должно положительно сказаться на расходах памяти и быстродействии
На быстродействии - возможно, хотя в данном случае дополнительные регистры эмулируются - большой вопрос будет ли расти быстродействие. А, вот, на расход памяти это никоим образом не скажется - если некая функция использует регистр под переменную, то прежнее содержимое этого регистра необходимо сохранить в том же стеке...
редактор
Чтобы уменьшить расход памяти (особенно если много переменных по 4 байта) возможны следующие варианты
- почитать документацию на компилятор в части размещения локальных параметров. Сперва используются регистры банка, если их не хвататет (а этого всего 8 байт), то переменные размещаются в памяти согласно модели.
- по возможности сократить количество вложенных вызовов (особенно с передачей параметров).
- проверить объявление констант, так как без ключевого слова "code" данные могут копировать из флеши в ОЗУ.
- возможно для передачи параметров использовать глобальные переменные (некрасиво но иногда помогает).

если оптимизировать объем данных не получается - последний шаг - использовать дополнительную внешнюю память или другой кристалл.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.