1kvi1 0 14 августа, 2011 Опубликовано 14 августа, 2011 · Жалоба Доброго времени суток! Интересует опыт использования iar'а для С51, точнее эффективность компилятора по сравнению с Keil. Собственно проблема следующая: keil для локальных переменных выделяет память статически, причем линкер при определенных условиях может обеспечить совместное использование этой памяти разными процедурами. Данное свойство приводит к большому расходу памяти, что нежелательно. У iar'а есть опция эмуляции 32-х регистров общего пользования, позволяет ли эта опция минимизировать потребление памяти локальными переменными? Опыта работы с C51 к сожалению мало, подобная работа keil'а с локальными переменными была для меня настоящим сюрпризом - память неожиданно кончилась без видимых причин... Всем заранее спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 6 14 августа, 2011 Опубликовано 14 августа, 2011 · Жалоба Лучше чем Keil среды для разработки программ для МК51, скорее всего, не найти. Память кончилась? Включите оптимизацию - Level 4 должен помочь в эканомии памяти. Если и это не поможет - Вы, наверное, ошиблись с выбором МК... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
1kvi1 0 17 августа, 2011 Опубликовано 17 августа, 2011 · Жалоба Лучше чем Keil среды для разработки программ для МК51, скорее всего, не найти. А вы пробовали? Конкретно про iar что-нибудь знаете? Оптимизация 4 не помогает, ибо используется уже 8-я... Может кто по существу что-нибудь напишет? Неужели никто iar'ом не пользовался? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ashr 0 17 августа, 2011 Опубликовано 17 августа, 2011 · Жалоба Буквально на днях отказался от IAR в пользу Keil. Не вдаваясь в подробности скажу, что у Keilа реализация стандартных библиотек существенно лучше заточена под 51 ядро. В результате программа не влезавшая в 8К под IAR'ом влезла под Keil'ом еще и место осталось. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
1kvi1 0 17 августа, 2011 Опубликовано 17 августа, 2011 · Жалоба У iar'а как обстоят дела с локальными переменными? У меня проблема с оперативной памятью - полностью забита. Пишу новую функцию, объявляю локальную переменную, а он пишет что оперативка кончилась. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ashr 0 17 августа, 2011 Опубликовано 17 августа, 2011 · Жалоба У iar'а как обстоят дела с локальными переменными? Можно как и в Keil в виде overlapped области. Можно стандартно, в виде классического стека. Расположение стека также можно выбрать (data, idata, xdata) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 6 17 августа, 2011 Опубликовано 17 августа, 2011 · Жалоба Пишу новую функцию, объявляю локальную переменную, а он пишет что оперативка кончилась.Скорее всего, так оно и есть. У МК51 оперативной памяти - не богато... Вам нужно заботится о её сохранении (например, флаги объявлять битовыми), или взять МК51 с "on-chip XRAM" на борту... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
1kvi1 0 17 августа, 2011 Опубликовано 17 августа, 2011 · Жалоба использую C8051F342 - 256 RAM+4096XRAM вся забита под завязку Очень много локальных переменных типа unsigned long - причем для каждой из них компилятор выделяет 4 байта в XRAM Меня интересует вопрос - делает ли так же IAR? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 0 17 августа, 2011 Опубликовано 17 августа, 2011 · Жалоба Буквально на днях отказался от IAR в пользу Keil. Не вдаваясь в подробности скажу, что у Keilа реализация стандартных библиотек существенно лучше заточена под 51 ядро. В результате программа не влезавшая в 8К под IAR'ом влезла под Keil'ом еще и место осталось. Ну и что за критерий? Имеем меньшие по размеру библиотеки (это хорошо, а что у них со производительнорстью? Вообще-то использование стандартных библиотек на 51 у себя я вообще я что-то и не припомню ). Получается какая-то поверхностная оценка :). P.S. Я для 51 крайне редко что-то пишу, по этой причине совершенно не собираюсь дискутировать по поводу Keil/IAR. Просто не смог удержаться от комментария по поводу оценки критерия. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 6 17 августа, 2011 Опубликовано 17 августа, 2011 · Жалоба Меня интересует вопрос - делает ли так же IAR?Вам выше уже ответили: Можно как и в Keil в виде overlapped области. Можно стандартно, в виде классического стека.Только, если Вы будете распологать локальные переменные в стеке, то тут же всплывет закономерный вопрос : достаточно ли выделенной под стек памяти для размещения локальных переменных? Keil ещё на этапе линковки по-возможности "перекрыл" области памяти, отводимые под локальные переменные, и определил: памяти - не хватает! Используя IAR, Вы немножко помучаетесь, определяя потребный размер стека, и, скорее всего, прийдёте к тому же выводу... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 17 августа, 2011 Опубликовано 17 августа, 2011 · Жалоба использую C8051F342 - 25д6 RAM+4096XRAM вся забита под завязку Очень много локальных переменных типа unsigned long - причем для каждой из них компилятор выделяет 4 байта в XRAM Если не ошибаюсь, Keil анализирует программу (строит граф вызовов функций или что-то в этом духе) и оптимизирует использование памяти. То есть если на этапе компиляции известно, что две функции не вызывают друг друга, то их локальные переменные могут располагаться в перекрывающихся участках памяти. При анализе вызовов функций компилятор может быть сбит с толку, например, указателями на функции (попробуй проследи за ними). Так что я бы попытался понять, есть ли в программе что-то, что мешает компилятору делать свою работу. Вот тут есть немного информации про указатели на функции и граф вызовов функций: Application Note 129 - Function Pointers in C51. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
1kvi1 0 17 августа, 2011 Опубликовано 17 августа, 2011 · Жалоба Только, если Вы будете распологать локальные переменные в стеке, то тут же всплывет закономерный вопрос : достаточно ли выделенной под стек памяти для размещения локальных переменных? Keil ещё на этапе линковки по-возможности "перекрыл" области памяти, отводимые под локальные переменные, и определил: памяти - не хватает! Используя IAR, Вы немножко помучаетесь, определяя потребный размер стека, и, скорее всего, прийдёте к тому же выводу... основная моя мысль по поводу iar'а следующая: он позволяет выполнять эмуляцию 32 регистров общего назначения вместо 8 регистров, то есть отказывается от использования банков как я понимаю - такая тактика должна позволить минимизировать расходы памяти для размещения локальных переменных в стеке, что должно положительно сказаться на расходах памяти и быстродействии так ли это? может ли iar делать код подобный варианту для AVR'а(32 регистра для и аппаратный+программный стек)? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 6 18 августа, 2011 Опубликовано 18 августа, 2011 · Жалоба как я понимаю - такая тактика должна позволить минимизировать расходы памяти для размещения локальных переменных в стеке, что должно положительно сказаться на расходах памяти и быстродействииНа быстродействии - возможно, хотя в данном случае дополнительные регистры эмулируются - большой вопрос будет ли расти быстродействие. А, вот, на расход памяти это никоим образом не скажется - если некая функция использует регистр под переменную, то прежнее содержимое этого регистра необходимо сохранить в том же стеке... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Edit2007 3 30 августа, 2011 Опубликовано 30 августа, 2011 · Жалоба Чтобы уменьшить расход памяти (особенно если много переменных по 4 байта) возможны следующие варианты - почитать документацию на компилятор в части размещения локальных параметров. Сперва используются регистры банка, если их не хвататет (а этого всего 8 байт), то переменные размещаются в памяти согласно модели. - по возможности сократить количество вложенных вызовов (особенно с передачей параметров). - проверить объявление констант, так как без ключевого слова "code" данные могут копировать из флеши в ОЗУ. - возможно для передачи параметров использовать глобальные переменные (некрасиво но иногда помогает). если оптимизировать объем данных не получается - последний шаг - использовать дополнительную внешнюю память или другой кристалл. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться