Page 2 of 6

Re: Пропуски зажигания при сборке GCC и новыми верс. IAR

Posted: Sun May 13, 2012 12:48 am
by nikll
по адресу 0000002A и ниже (текстовый поиск в обоих листингах) явно заметны различия в работе оптимизатора, к примеру разворачивание функций.
Кстати вопрос для тех кто знает авр-ассемблер, что означают записи типа:
\ 0000001A REQUIRE _A_PORTD
\ 0000001A REQUIRE _A_PORTC
\ 0000001A REQUIRE _A_DDRD
\ 0000001A REQUIRE _A_DDRC

в листинге четвертой версии их нету....
Так же нашел существенные отличия в распределении и использовании стека, копмилятор версии 610 заметно хуже отработал.

Вообще чисто субьективно четвертая версия компилятора выдает более чистый и более оптимизированный код

Еще вопрос по GCC, вы пробовали собирать с опцией -O0 ?

Re: Пропуски зажигания при сборке GCC и новыми верс. IAR

Posted: Sun May 13, 2012 8:10 am
by Stranger21
а можно ли , в исходный тест , засунуть какойнибуть , макрос или что то , чтобы компилировалось только на 4.21 версии ИАР , ну и под вин авр также ? ну чтобы пользователи , пока не найдется в чем проблема, не мучались в неведении ?

Re: Пропуски зажигания при сборке GCC и новыми верс. IAR

Posted: Sun May 13, 2012 10:31 am
by nikll
хм, гугль и документация к компилятору в помощь.
с gcc подобное делается в make файле через определение версии gcc

Re: Пропуски зажигания при сборке GCC и новыми верс. IAR

Posted: Mon May 14, 2012 5:40 am
by skodafelicia
nikll wrote:Еще вопрос по GCC, вы пробовали собирать с опцией -O0 ?
У меня GCC под М16 не собирает - памяти контроллера не хватает.

Кстати, пошивка с IAR 4.21 работает без пропусков...

Re: Пропуски зажигания при сборке GCC и новыми верс. IAR

Posted: Mon May 14, 2012 6:36 am
by Stranger21
ну вот еще один победивший призраков )) удачи на дороге ! )))

Re: Пропуски зажигания при сборке GCC и новыми верс. IAR

Posted: Mon May 14, 2012 8:16 am
by STC
\ 0000001A REQUIRE _A_PORTD
\ 0000001A REQUIRE _A_PORTC
\ 0000001A REQUIRE _A_DDRD
\ 0000001A REQUIRE _A_DDRC
Это скорее всего перечисление внешних связей - переменных используемых в данной функции. В данном случае это ячейки памяти в ОЗУ соответствующие регистрам портов.

Re: Пропуски зажигания при сборке GCC и новыми верс. IAR

Posted: Mon May 14, 2012 6:38 pm
by STC
Мне удалось скомпилировать прошивку с GCC 3-й версии. Когда причешу код, то постараюсь выложить.

Re: Пропуски зажигания при сборке GCC и новыми верс. IAR

Posted: Tue May 15, 2012 12:04 pm
by STC
Прошивка в репозитории подрихтована для сборки с использованием более старых версий AVR-GCC (WinAVR).
Проверено на той версии WinAVR, на которую давал сслыку ender11.

Есть пара нюансов.
1. Если будет ругаться на опцию -fno-inline-small-functions, то соответствующую строчку в Makefile нужно закомментировать:
#CFLAGS += -fno-inline-small-functions
2. Я еще не разобрался со строчкой кода в bootldr.h:

Code: Select all

#define boot_loader_start() ((void (*)())((SECU3BOOTSTART+0xA)/2))()
Компилятор ругается на нечетный адрес, возникающий если не убрать /2. Или в новой версии компилятора GCC поведение отличается от более старых (в более новых нужно использовать адрес слова), или отличий нет (везде байтовый адрес), а просто /2 нужно убрать (тогда непонятно как оно работает с последней версией WinAVR).
Проверил что при использовании версии: gcc version 4.1.1 (WinAVR 20070122) компилятор уже не ругается.

Все. Разобрался и исправил проблему с boot_loader_start(). Проблема заключалась в разном поведении компиляторов GCC разных версий.
Страя версия использовала команду CALL, а новая ICALL. Использовал ассемблерную вставку чтобы навсегда отбить охоту компилятору заниматься творчеством. :lol:

Теперь код полностью пригоден для компиляции более старыми версиями GCC.

Re: Пропуски зажигания при сборке GCC и новыми верс. IAR

Posted: Tue May 15, 2012 12:22 pm
by Stranger21
пропусков нет ?

Re: Пропуски зажигания при сборке GCC и новыми верс. IAR

Posted: Tue May 15, 2012 2:14 pm
by STC
пропусков нет ?
Я не проверял на железе.