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

 
 
> EWARM странные операции со стеком.
Artem_Petrik
сообщение Jun 15 2008, 13:58
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 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 07.gif Зачем????. Насколько я понимаю в данной функции все push/pop можно просто выбросить, без ущерба функциональности. Это у меня результат компиляции с максимальной оптимизацией по размеру. Если же оптимизировать по скорости, то меняется только PUSH {R0,LR} на PUSH {R3,LR}. Здесь R3 сохранили, и его же восстановили. Но зачем?
Это кривость компилятора? или я чего-то не так делаю? Пугает то, что даже такую простую функцию откомпилить нормально не получается. Это чтож будет на реальных программах. Так недолго довести производительность ARM до уровня AVR 05.gif . Как заставить компилятор генерить более оптимальный код? Или переходить на другой компилятор? Переходить не хотелось бы, привык к ИАРу за годы работы с АВР-ками.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Artem_Petrik
сообщение Jun 15 2008, 18:26
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 443
Регистрация: 22-07-06
Из: Украина, г. Харьков
Пользователь №: 19 006



Цитата(zltigo @ Jun 15 2008, 19:16) *
Вот и пишите реальные программы smile.gif. А то взяли две строчки, где компилятору хорошо умеющему делать глобальные оптимизаци и развернутся негде. Зато вынужденному соблюдать определенные правила компилятотору дополнительно заморочили голову прямым приказом создать совершенно не нужную локальную переменую....
Уберите для начала вот эту хрень:
AT91PS_USART pUSART = AT91C_BASE_US0;
ну THUMB, зачем Вам сдался? Экономить Flash любой ценой? Тогда не жалуйтесь на "цену".


Конечно реальные программы я писать буду, никуда не денусь. Уже занимаюсь. Но согласитесь, что если бы я вам тут привел листинг на 1500 строк вам было бы сложнее его читать, и давать советы. Кроме того, будь функция побольше, вы бы сказали: "ой, ну три лишних инструкции из 100, че вы придираетесь!" и были бы в чем то правы. Но я хочу чтобы этих лишних команд не было! Согласитесь, в данном конкретном случае их быть не должно, более того, именно ТАКИЕ лишние команды совсем не к лицу хоть сколько-нибудь оптимизирующему компилятору. Ведь они СОВСЕМ ничего не делают!
"Хрень" можно убрать, это ничего не меняет. Вставлена она в результате попытки "подсказать" компилятору как сделать код короче. Чтоб он не грузил значение LDR-ом два раза, а использовал загруженное единожды. Правда все равно не помогло, ну да это я еще могу простить. А вот АБСОЛЮТНО ненужные команды меня просто бесят.
Flash я экономлю, но вовсе не "любой ценой". Очень часто, и в данном примере в частности, компиляция в ARM и THUMB дает одинаковое количество команд, иногда в тхумбе всего на пару команд больше. Так что экономия выходит не любой ценой, а "нахаляву". Кроме того атмеловские процы на высоких частотах ядра THUMB команды выполняют быстрее (не так проявляется ограничения из-за медленной флеши). Так что, на мой взгляд, использование THUMB инструкций во многих случаях очень даже уместно.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Artem_Petrik   EWARM странные операции со стеком.   Jun 15 2008, 13:58
- - zltigo   Цитата(Artem_Petrik @ Jun 15 2008, 15:58)...   Jun 15 2008, 16:16
- - 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
- - Artem_Petrik   Стоп! Что-то у меня лыжи не едут! Откомпил...   Jun 15 2008, 20:49
|- - zltigo   Цитата(Artem_Petrik @ Jun 15 2008, 22:49)...   Jun 15 2008, 21:11
|- - Artem_Petrik   Цитата(zltigo @ Jun 16 2008, 00:11) По на...   Jun 15 2008, 21:27
|- - zltigo   Цитата(Artem_Petrik @ Jun 15 2008, 23:27)...   Jun 15 2008, 21:57
- - aaarrr   Оптимизация-то включена вообще?   Jun 15 2008, 20:51
- - Artem_Petrik   Цитата(aaarrr @ Jun 15 2008, 23:51) Оптим...   Jun 15 2008, 20:56


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

 


RSS Текстовая версия Сейчас: 31st July 2025 - 06:04
Рейтинг@Mail.ru


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