|
вопрос по IARy, IAR спасовал? |
|
|
|
Jun 16 2005, 09:30
|

Участник

Группа: Новичок
Сообщений: 47
Регистрация: 5-03-05
Пользователь №: 3 082

|
Компилю текст: #pragma vector = TIMER2_OVF_vect __interrupt void system_timer() { blink_timer++; }
и выдает:
#pragma vector = TIMER2_OVF_vect __interrupt void system_timer() ST -Y, R31 ST -Y, R30 ST -Y, R17 ST -Y, R16 IN R17, 0x3F } blink_timer++; LDI R30, LOW(blink_timer) LDI R31, (blink_timer) >> 8 LD R16, Z INC R16 ST Z, R16 } OUT 0x3F, R17 LD R16, Y+ LD R17, Y+ LD R30, Y+ LD R31, Y+ RETI
при максимальной оптимизации. Не пойму почему бы ему не использовать STS? или я что-то не так пишу или хваленый иар не спосбен на подвиги? ЧТО Я НЕ ТАК ДЕЛАЮ?
|
|
|
|
|
 |
Ответов
|
Jun 21 2005, 06:35
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
Цитата(AlexOr @ Jun 20 2005, 19:41) Кстати, LDI R30, LOW(blink_timer) LDI R31, (blink_timer) >> 8 LD R16, Z INC R16 ST Z, R16
занимает столько же места как и
LDS R30,_blink_timer SUBI R30,-LOW(1) STS _blink_timer,R30
но последнее в прерывании намного выгоднее (быстрее и менее расходно по регистрам). Это до тех пор, пока у Вас единственное обращение к однобайтовой переменной. Сделайте эту переменную интом, выигрыш не замедлит проявиться. Или, к примеру, если там не к одной переменной обращение, а к нескольким, лежащим в пределах досягаемости указателя (для этого их надо объявлять вместе). Или к структуре обращение. Словом, когда ситуация уходить от первого простейшего случая, результат меняется Цитата(AlexOr @ Jun 20 2005, 19:41) Черт меня дернул сделать проект на IAR. Сейчас взглянул на прологи/эпилоги и Ужаснулся. Не стОит так переживать из-за этой мелочи. Она погоду не делает совершенно. Наоборот, способность IAR'а приводить обращения к косвенным дает очень приличный выигрыш на деле. AVR-GCC имеет весьма неплохой кодогенератор, но он проигрывает IAR'у именно на этом моменте - AVR-GCC злоупотребляет lds/sts, из-за чего размер кода там получается больше. Не знаю, как сегодня обстоит дело, но некоторое время назад остальные компляторы - CodeVision, ImageCraft уступали по качеству кодогенерации обоим - и IAR'у, и AVR-GCC. Может сейчас что-то изменилось, но сомневаюсь. Сравнивать надо не на коде из трех строк, а на реальных проектах. Попробуйте, увидите, что IAR рулит.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Jun 21 2005, 07:08
|

Участник

Группа: Новичок
Сообщений: 47
Регистрация: 5-03-05
Пользователь №: 3 082

|
[/quote] Не стОит так переживать из-за этой мелочи. Она погоду не делает совершенно. Наоборот, способность IAR'а приводить обращения к косвенным дает очень приличный выигрыш на деле. AVR-GCC имеет весьма неплохой кодогенератор, но он проигрывает IAR'у именно на этом моменте - AVR-GCC злоупотребляет lds/sts, из-за чего размер кода там получается больше. [/quote] Но прерывание ИАР слишком раздул, а надо то тока инкрементировать глобальную переменную. кстати это системный таймер и я думаю, что там не одна переменная может быть, но и несколько, а если они не подряд - то работа с указателями это только проигрыш.
|
|
|
|
|
Jun 21 2005, 07:36
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
Цитата(LeoLabs @ Jun 21 2005, 13:08) Но прерывание ИАР слишком раздул, а надо то тока инкрементировать глобальную переменную. кстати это системный таймер и я думаю, что там не одна переменная может быть, но и несколько, а если они не подряд - то работа с указателями это только проигрыш. Ну и сколько это байт оверхеда на фоне всего проекта? Сравнивайте весь проект (или хотя бы более-менее значимую часть), скомпиленные одним компиятором и другим. Переменным не обязательно быть подряд. Им достаточно быть в пределах досягаемости указателя - 64 байта. Для того, чтобы они были вместе, достаточно их объявить вместе и включить оптимизацию clustering variables, которая, afair, включена по умолчанию.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Jun 21 2005, 07:57
|

Участник

Группа: Новичок
Сообщений: 47
Регистрация: 5-03-05
Пользователь №: 3 082

|
Цитата(dxp @ Jun 21 2005, 14:36) Цитата(LeoLabs @ Jun 21 2005, 13:08) Но прерывание ИАР слишком раздул, а надо то тока инкрементировать глобальную переменную. кстати это системный таймер и я думаю, что там не одна переменная может быть, но и несколько, а если они не подряд - то работа с указателями это только проигрыш. Ну и сколько это байт оверхеда на фоне всего проекта? Сравнивайте весь проект (или хотя бы более-менее значимую часть), скомпиленные одним компиятором и другим. Переменным не обязательно быть подряд. Им достаточно быть в пределах досягаемости указателя - 64 байта. Для того, чтобы они были вместе, достаточно их объявить вместе и включить оптимизацию clustering variables, которая, afair, включена по умолчанию. ну что ж: вот расстояние между байтами 19, а как обрабатывается - при полной оптимизации, включая Clustering of variables. 5 #pragma vector = TIMER2_OVF_vect \ In segment CODE, align 2, keep-with-next 6 __interrupt void system_timer(void) \ system_timer: 7 { \ 00000000 93FA ST -Y, R31 \ 00000002 93EA ST -Y, R30 \ 00000004 931A ST -Y, R17 \ 00000006 930A ST -Y, R16 \ 00000008 B71F IN R17, 0x3F 8 blink_timer++; \ 0000000A .... LDI R30, 0x66 \ 0000000C .... LDI R31, 0x01 \ 0000000E 8100 LD R16, Z \ 00000010 9503 INC R16 \ 00000012 8300 ST Z, R16 9 mySREG++; \ 00000014 .... LDI R30, 0x79 \ 00000016 .... LDI R31, 0x01 \ 00000018 8100 LD R16, Z \ 0000001A 9503 INC R16 \ 0000001C 8300 ST Z, R16 10 } \ 0000001E BF1F OUT 0x3F, R17 \ 00000020 9109 LD R16, Y+ \ 00000022 9119 LD R17, Y+ \ 00000024 91E9 LD R30, Y+ \ 00000026 91F9 LD R31, Y+ \ 00000028 9518 RETI В чем дело то? может у меня завихрения? да и в прерываниях, которые очень критичны к скорости, совсем ни к чему указатели. а по поводу памяти - то ее почти всегда хватит, напротив быстродействия всегда мало.
|
|
|
|
Сообщений в этой теме
LeoLabs вопрос по IARy Jun 16 2005, 09:30 vet Цитата(LeoLabs @ Jun 16 2005, 13:30)Не пойму ... Jun 16 2005, 09:54 LeoLabs не верю! ну не может такого быть! Jun 17 2005, 04:22 vet Ещё немного сравнительных результатов от ICC v6.30... Jun 17 2005, 06:28 AlexOr Нет слов.
Только маты. Jun 20 2005, 13:28 vet Цитата(AlexOr @ Jun 20 2005, 17:41)Кстати,
LD... Jun 20 2005, 15:23  LeoLabs Задал этот вопрос (почему через указатели а не чер... Jun 21 2005, 01:12     dxp Цитата(LeoLabs @ Jun 21 2005, 13:57)ну что ж:... Jun 21 2005, 09:05      LeoLabs Цитата(dxp @ Jun 21 2005, 16:05)Непонятно, ка... Jun 22 2005, 01:24       dxp Цитата(LeoLabs @ Jun 22 2005, 07:24)Цитата(dx... Jun 22 2005, 04:30  vet Цитата(dxp @ Jun 21 2005, 10:35)Это до тех по... Jun 21 2005, 09:04   dxp Цитата(vet @ Jun 21 2005, 15:04)Прямо сейчас ... Jun 21 2005, 09:25    vet Цитата(dxp @ Jun 21 2005, 13:25)Цитата(vet ... Jun 21 2005, 10:03
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|