|
EWARM странные операции со стеком. |
|
|
|
Jun 15 2008, 13:58
|
Местный
  
Группа: Свой
Сообщений: 443
Регистрация: 22-07-06
Из: Украина, г. Харьков
Пользователь №: 19 006

|
Вот и у меня на горизонте замаячил проектик, который видимо желательно реализовывать на MCU семейства ARM. Так что я приступил к их освоению. Имею (вредную?) привычку после компиляции смотреть листинг, чтобы оценить насколько результат близок к тому, что я написал бы на ассемблере. И, как всегда, смотрю, и сердце кровью обливается. Это даже при том, что я в армовском ассемблере почти ничего не понимаю. Поначалу у меня была сравнительно старая версия иара - 4.40A, и я решил что неоптимальность связанна именно с этим. Поэтому скачал 5.11. Код действительно стал лучше, но не на много. Наиболее непонятны для меня некоторые операции со стеком, которые компилятор вставляет при входе/выходе из процедуры при компиляции в режиме THUMB. Вот достаточно простой пример: Код 3 void putchar( char a) 4 { \ putchar: \ 00000000 01B5 PUSH {R0,LR} 5 AT91PS_USART pUSART = AT91C_BASE_US0; 6 7 while( !(pUSART->US_CSR & AT91C_US_TXRDY) ); \ ??putchar_0: \ 00000002 0449 LDR R1,??putchar_1 ;; 0xfffc0014 \ 00000004 0968 LDR R1,[R1, #+0] \ 00000006 8907 LSLS R1,R1,#+30 \ 00000008 FBD5 BPL ??putchar_0 8 pUSART->US_THR = a; \ 0000000A 0249 LDR R1,??putchar_1 ;; 0xfffc0014 \ 0000000C 8860 STR R0,[R1, #+8] 9 } \ 0000000E 08BC POP {R3} \ 00000010 01BC POP {R0} \ 00000012 0047 BX R0 ;; return \ ??putchar_1: \ 00000014 1400FCFF DC32 0xfffc0014 Несмотря на то, что в функции не происходит вызова других функций, зачем-то в стек сохраняется LR. Более того, с ним за компанию сохраняется параметр, передаваемый в функцию, который потом восстанавливается в r3  Зачем????. Насколько я понимаю в данной функции все push/pop можно просто выбросить, без ущерба функциональности. Это у меня результат компиляции с максимальной оптимизацией по размеру. Если же оптимизировать по скорости, то меняется только PUSH {R0,LR} на PUSH {R3,LR}. Здесь R3 сохранили, и его же восстановили. Но зачем? Это кривость компилятора? или я чего-то не так делаю? Пугает то, что даже такую простую функцию откомпилить нормально не получается. Это чтож будет на реальных программах. Так недолго довести производительность ARM до уровня AVR  . Как заставить компилятор генерить более оптимальный код? Или переходить на другой компилятор? Переходить не хотелось бы, привык к ИАРу за годы работы с АВР-ками.
|
|
|
|
|
 |
Ответов
|
Jun 15 2008, 20:49
|
Местный
  
Группа: Свой
Сообщений: 443
Регистрация: 22-07-06
Из: Украина, г. Харьков
Пользователь №: 19 006

|
Стоп! Что-то у меня лыжи не едут! Откомпилил у себя ваш вариант под ЛПЦ, (правда у меня не поняло выражение LSR_TEMT, пришлось заменить на 0x40) Сейчас у меня EWARM-EW-WEB 5.11 Код #include "iolpc2131.h"
__thumb void testputchar( char ch ) { while( !(U0LSR & 0x40) ); U0THR = ch; } и получил тот же маразм: Код \ In section .text, align 4, keep-with-next 13 __thumb void testputchar( char ch ) 14 { \ testputchar: \ 00000000 01B5 PUSH {R0,LR} \ 00000002 0349 LDR R1,??testputchar_0 ;; 0xe000c000 15 while( !(U0LSR & 0x40) ); \ ??testputchar_1: \ 00000004 0A7D LDRB R2,[R1, #+20] \ 00000006 5206 LSLS R2,R2,#+25 \ 00000008 FCD5 BPL ??testputchar_1 16 U0THR = ch; \ 0000000A 0870 STRB R0,[R1, #+0] 17 } \ 0000000C 08BD POP {R3,PC} ;; return \ 0000000E C046 Nop \ ??testputchar_0: \ 00000010 00C000E0 DC32 0xe000c000 Значит у меня все же что-то или с настройками компилятора, или одно из двух. Подскажите какая у вас версия и настройки компилятора. Не успокоюсь, пока не получу у себя такойже код как у вас!
|
|
|
|
|
Jun 15 2008, 21:27
|
Местный
  
Группа: Свой
Сообщений: 443
Регистрация: 22-07-06
Из: Украина, г. Харьков
Пользователь №: 19 006

|
Цитата(zltigo @ Jun 16 2008, 00:11)  По началу Вы на V4 жаловались, вот я и 4.42 и компильнул. Ну у V5 действительно такие фокусы с push/pop в Thumb. Но тем не менее он глобально лучше  в ARM компилит. У меня была версия 4.40A, там были такие же пуши и попы. И много других идиотизмов, в том числе и в ARM режиме. Грешил я в основном на букву A в версии, думал может что-то совсем сырое попалось. Из нового скачал сразу последнюю версию. Эх, разочарован я. Буду серьезно думать насчет RealView  . Ну ничего, оно и к лучшему. Значит пришло время мне привыкнуть к какому-либо компиляторонезависимому редактору типа слика, чтобы больше не привыкать то к одной ИДЕ, то к другой, а писать все в одном редакторе. И компилить чем душе угодно
|
|
|
|
Сообщений в этой теме
Artem_Petrik EWARM странные операции со стеком. Jun 15 2008, 13:58 zltigo Цитата(Artem_Petrik @ Jun 15 2008, 15:58)... Jun 15 2008, 16:16 Artem_Petrik Цитата(zltigo @ Jun 15 2008, 19:16) Вот и... Jun 15 2008, 18:26 zltigo Повторятся трижды было уж слишком
ЦитатаНо я хочу... Jun 15 2008, 18:37 Artem_Petrik Цитата(zltigo @ Jun 15 2008, 21:37) Повто... Jun 15 2008, 19:35  zltigo Цитата(Artem_Petrik @ Jun 15 2008, 21:35)... Jun 15 2008, 19:53   Artem_Petrik Цитата(zltigo @ Jun 15 2008, 22:53) Тольк... Jun 15 2008, 20:28    zltigo Цитата(Artem_Petrik @ Jun 15 2008, 22:28)... Jun 15 2008, 20:41    aaarrr Цитата(Artem_Petrik @ Jun 16 2008, 00:28)... Jun 15 2008, 20:43 GetSmart Цитата(zltigo)Смотрим на аналогичную функцию:... в... Jun 15 2008, 18:51 zltigo Цитата(GetSmart @ Jun 15 2008, 20:51) ...... Jun 15 2008, 18:58 GetSmart Цитата(zltigo)Thumb:Ну, это другое дело
А кто-нит... Jun 15 2008, 19:50 aaarrr Оптимизация-то включена вообще? Jun 15 2008, 20:51 Artem_Petrik Цитата(aaarrr @ Jun 15 2008, 23:51) Оптим... Jun 15 2008, 20:56
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|