реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> IAR-Keil для C51 - работа с локальными переменными
1kvi1
сообщение Aug 14 2011, 07:49
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 36
Регистрация: 5-12-10
Пользователь №: 61 414



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

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

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

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

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

Всем заранее спасибо!
Go to the top of the page
 
+Quote Post
Палыч
сообщение Aug 14 2011, 13:57
Сообщение #2


Гуру
******

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



Лучше чем Keil среды для разработки программ для МК51, скорее всего, не найти.
Память кончилась? Включите оптимизацию - Level 4 должен помочь в эканомии памяти. Если и это не поможет - Вы, наверное, ошиблись с выбором МК...
Go to the top of the page
 
+Quote Post
1kvi1
сообщение Aug 17 2011, 01:44
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 36
Регистрация: 5-12-10
Пользователь №: 61 414



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

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

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

Может кто по существу что-нибудь напишет? Неужели никто iar'ом не пользовался?
Go to the top of the page
 
+Quote Post
shreck
сообщение Aug 17 2011, 06:29
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 327
Регистрация: 24-06-06
Из: Томск
Пользователь №: 18 328



Буквально на днях отказался от IAR в пользу Keil. Не вдаваясь в подробности скажу, что у Keilа реализация стандартных библиотек существенно лучше заточена под 51 ядро. В результате программа не влезавшая в 8К под IAR'ом влезла под Keil'ом еще и место осталось.
Go to the top of the page
 
+Quote Post
1kvi1
сообщение Aug 17 2011, 08:39
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 36
Регистрация: 5-12-10
Пользователь №: 61 414



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

У меня проблема с оперативной памятью - полностью забита.
Пишу новую функцию, объявляю локальную переменную, а он пишет что оперативка кончилась.
Go to the top of the page
 
+Quote Post
shreck
сообщение Aug 17 2011, 08:45
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 327
Регистрация: 24-06-06
Из: Томск
Пользователь №: 18 328



Цитата(1kvi1 @ Aug 17 2011, 15:39) *
У iar'а как обстоят дела с локальными переменными?

Можно как и в Keil в виде overlapped области. Можно стандартно, в виде классического стека. Расположение стека также можно выбрать (data, idata, xdata)
Go to the top of the page
 
+Quote Post
Палыч
сообщение Aug 17 2011, 09:06
Сообщение #7


Гуру
******

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



Цитата(1kvi1 @ Aug 17 2011, 12:39) *
Пишу новую функцию, объявляю локальную переменную, а он пишет что оперативка кончилась.
Скорее всего, так оно и есть. У МК51 оперативной памяти - не богато... Вам нужно заботится о её сохранении (например, флаги объявлять битовыми), или взять МК51 с "on-chip XRAM" на борту...
Go to the top of the page
 
+Quote Post
1kvi1
сообщение Aug 17 2011, 09:26
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 36
Регистрация: 5-12-10
Пользователь №: 61 414



использую C8051F342 - 256 RAM+4096XRAM
вся забита под завязку

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

Меня интересует вопрос - делает ли так же IAR?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 17 2011, 09:37
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



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

Ну и что за критерий? Имеем меньшие по размеру библиотеки (это хорошо, а что у них со производительнорстью? Вообще-то использование стандартных библиотек на 51 у себя я вообще я что-то и не припомню ). Получается какая-то поверхностная оценка sm.gif.
P.S.
Я для 51 крайне редко что-то пишу, по этой причине совершенно не собираюсь дискутировать по поводу Keil/IAR. Просто не смог удержаться от комментария по поводу оценки критерия.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Палыч
сообщение Aug 17 2011, 13:56
Сообщение #10


Гуру
******

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



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

Go to the top of the page
 
+Quote Post
scifi
сообщение Aug 17 2011, 14:48
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



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

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

Если не ошибаюсь, Keil анализирует программу (строит граф вызовов функций или что-то в этом духе) и оптимизирует использование памяти. То есть если на этапе компиляции известно, что две функции не вызывают друг друга, то их локальные переменные могут располагаться в перекрывающихся участках памяти. При анализе вызовов функций компилятор может быть сбит с толку, например, указателями на функции (попробуй проследи за ними). Так что я бы попытался понять, есть ли в программе что-то, что мешает компилятору делать свою работу.
Вот тут есть немного информации про указатели на функции и граф вызовов функций: Application Note 129 - Function Pointers in C51.
Go to the top of the page
 
+Quote Post
1kvi1
сообщение Aug 17 2011, 23:26
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 36
Регистрация: 5-12-10
Пользователь №: 61 414



Цитата(Палыч @ Aug 17 2011, 22:56) *
Только, если Вы будете распологать локальные переменные в стеке, то тут же всплывет закономерный вопрос : достаточно ли выделенной под стек памяти для размещения локальных переменных? Keil ещё на этапе линковки по-возможности "перекрыл" области памяти, отводимые под локальные переменные, и определил: памяти - не хватает! Используя IAR, Вы немножко помучаетесь, определяя потребный размер стека, и, скорее всего, прийдёте к тому же выводу...


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

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

так ли это? может ли iar делать код подобный варианту для AVR'а(32 регистра для и аппаратный+программный стек)?
Go to the top of the page
 
+Quote Post
Палыч
сообщение Aug 18 2011, 06:58
Сообщение #13


Гуру
******

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



Цитата(1kvi1 @ Aug 18 2011, 03:26) *
как я понимаю - такая тактика должна позволить минимизировать расходы памяти для размещения локальных переменных в стеке, что должно положительно сказаться на расходах памяти и быстродействии
На быстродействии - возможно, хотя в данном случае дополнительные регистры эмулируются - большой вопрос будет ли расти быстродействие. А, вот, на расход памяти это никоим образом не скажется - если некая функция использует регистр под переменную, то прежнее содержимое этого регистра необходимо сохранить в том же стеке...
Go to the top of the page
 
+Quote Post
редактор
сообщение Aug 30 2011, 09:54
Сообщение #14


Местный
***

Группа: Участник
Сообщений: 356
Регистрация: 9-06-07
Пользователь №: 28 315



Чтобы уменьшить расход памяти (особенно если много переменных по 4 байта) возможны следующие варианты
- почитать документацию на компилятор в части размещения локальных параметров. Сперва используются регистры банка, если их не хвататет (а этого всего 8 байт), то переменные размещаются в памяти согласно модели.
- по возможности сократить количество вложенных вызовов (особенно с передачей параметров).
- проверить объявление констант, так как без ключевого слова "code" данные могут копировать из флеши в ОЗУ.
- возможно для передачи параметров использовать глобальные переменные (некрасиво но иногда помогает).

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


--------------------
Хорошую систему делают из стандартных блоков нестандартно мыслящие инженеры.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 17th June 2025 - 20:58
Рейтинг@Mail.ru


Страница сгенерированна за 0.01464 секунд с 7
ELECTRONIX ©2004-2016