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

 
 
> 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, 20:49
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 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

Значит у меня все же что-то или с настройками компилятора, или одно из двух.
Подскажите какая у вас версия и настройки компилятора. Не успокоюсь, пока не получу у себя такойже код как у вас!
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 15 2008, 21:11
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Artem_Petrik @ Jun 15 2008, 22:49) *
Стоп! Что-то у меня лыжи не едут!
...
Сейчас у меня EWARM-EW-WEB 5.11

По началу Вы на V4 жаловались, вот я и 4.42 и компильнул. Ну у V5 действительно такие фокусы с push/pop в Thumb. Но тем не менее он глобально лучше smile.gif в ARM компилит.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Artem_Petrik
сообщение Jun 15 2008, 21:27
Сообщение #4


Местный
***

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



Цитата(zltigo @ Jun 16 2008, 00:11) *
По началу Вы на V4 жаловались, вот я и 4.42 и компильнул. Ну у V5 действительно такие фокусы с push/pop в Thumb. Но тем не менее он глобально лучше smile.gif в ARM компилит.


У меня была версия 4.40A, там были такие же пуши и попы. И много других идиотизмов, в том числе и в ARM режиме. Грешил я в основном на букву A в версии, думал может что-то совсем сырое попалось. Из нового скачал сразу последнюю версию. Эх, разочарован я. Буду серьезно думать насчет RealView smile.gif . Ну ничего, оно и к лучшему. Значит пришло время мне привыкнуть к какому-либо компиляторонезависимому редактору типа слика, чтобы больше не привыкать то к одной ИДЕ, то к другой, а писать все в одном редакторе. И компилить чем душе угодно smile.gif
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
- - 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
|- - 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
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


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


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