Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Ещё раз о бутлоадере
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
Страницы: 1, 2
Сергей Борщ
Цитата(pvp @ Oct 22 2007, 18:24) *
Поясните, пожалуйста, назначение "__z" (и источник информации)
Было в каком-то из .html в папке документации. Указывает компилятору передавать первый указатель в регистровой паре Z. Встречается также в вариациях __x, __xz (если память не изменяет).
singlskv
Цитата(SasaVitebsk @ Oct 22 2007, 14:43) *
С другой стороны, как я вижу, и как вы сами доказываете - вполне можно пользоваться любым инструментом. Надо просто его хорошо знать. Методы такого рода оптимизации основаны на знании как именно сам компилятор генерит код. С другой стороны, такая оптимизация достаточно зависима от компилятора.
Эээ... попробую пояснить почему я Вас агитировал за Gcc.
Конечно у IAR оптимизатор написан чуть лучше чем у Gcc(в среднем), и на "плохом" коде
это всегда сказывается.
Дальше все зависит от конкретной задачки и от модели компиляции разными компиляторами.
У IAR AVR есть одно принципиальное отличие от других компиляторов,
он использует регистровую пару Y под стек и на этом очень часто превосходит
другие компиляторы, но, задачки то разные бывают...
Посмотрев исходники я увидел что в данной проге очень часто нужно >2 указателей одновременно.
Соответственно преимущество для таких задач будет иметь компилятор у которого больше
регистровых пар в распоряжении, а это Gcc а не IAR.
Просто посмотрите на листинги первоначального варианта кода и количество
использования в них инструкций типа mov X/Z, R(xx):R(xx+1) и mov R(xx):R(xx+1), X/Z
SasaVitebsk
smile.gif
Я когда первый раз увидел результаты компилирования IAR, то тоже был немало удивлён наличием двух стеков. И первый вопрос - зачем! Чем не устраивает стандартный стэк? Зачем использовать такую дефицитную вещь как регистровая пара?

Внимательно рассматривая листинги - я понял. Именно при оптимизации по объёму такой подход даёт преимущество. При оптимизации по объёму появляется большое количество подпрограмм. При использовании второго стека можно делать подпрограммы сохранения регистров и восстановления. Есть и ещё ряд преимуществ. В частности возможность прямого обращения к данным в стэке. Например когда параметры находятся в стеке. Если использовать основной стек, то это более сложно получится.

Короче каждый подход имеет свои положительные стороны и свои отрицательные. Что очевидно.

К GCC претензий у меня нет и не может быть. Я не против данного компилятора. Просто работать с ним оказалось сложнее чем с IAR. Может быть когда-нибудь я его освою.
pvp
Цитата(Сергей Борщ @ Oct 22 2007, 19:33) *
Было в каком-то из .html...

Спасибо за ответ. Найду и почитаю.
skripach
Не стал создавать новую тему, поэтому здесь.
Можно ли заставить работать(не получается пока) приложение скомпилированное с такими настройками линкера
Код
define symbol __ICFEDIT_intvec_start__ = 0x00000000;
/*-Memory Regions-*/
define symbol __ICFEDIT_region_ROM_start__ = 0x00000044;
define symbol __ICFEDIT_region_ROM_end__   = 0x0007FFFF;
define symbol __ICFEDIT_region_RAM_start__ = 0x40000040;
define symbol __ICFEDIT_region_RAM_end__   = 0x4000FFFF;

если расположить его по адресу скажем 0х1000?
Скопировал вектора, сделал ремап, передал управление на 0-вой адрес. Переходит разумеется не туда...
Если я к тому что лежит с 0х40000020-го адреса прибавляю число 0х1000 то после сброса переходит туда куда надо biggrin.gif но приложение всё равно не работает.
skripach
Что никто не знает? ...или я что-то не то спросил.
zltigo
Цитата(skripach @ Nov 12 2009, 10:30) *
Что никто не знает? ...или я что-то не то спросил.

Нет желания разгадывать шарады.
KSN
Есть вопрос по прерываниям в bootloader и application. Итак, контроллер atmega8. Карта памяти:
0x0000 - 0x13FF: Application
0x1400 -0x17FF: Common memory (здесь храняться общие функции, доступные из application & bootloader)
0x1800 - 0x1FFF: Bootloader.
В bootloader используется одно прерывание от таймера2 по сравнению.
Контроллер программируется Avreal и стартует с Bootloader, проверяется CRC, если все ок, то переход на application. Также есть возможность запуска bootloader из application.
Итак, программирую контроллер только прошивкой загрузчика: все хорошо, прерывание работает.
Теперь, программирую контроллер с общей прошивкой (приложение+загрузчик): загрузчик запускается, отрабатывает и передает управление приложению. Затем из приложения вызываю загрузчик и вижу, что прерывание не работает. В загрузчике и приложении использую разные low_level_init, причем в загрузчике устанавливаю IVSEL, а в приложении сбрасываю. Может у кого было подобное?
Сергей Борщ
Цитата(KSN @ Feb 27 2010, 11:55) *
Может у кого было подобное?
Нет, не было. Прекрасно работают прерывания и там и там. Можете прислать проект на serzh собака rrt.lv, посмотрю.
zltigo
Цитата(KSN @ Feb 28 2010, 20:56) *
Отправил повторно.....

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