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

 
 
> Оптимизация кода IAR С++ v5.10 компилятора, весьма странный код... :(
sonycman
сообщение May 18 2008, 15:47
Сообщение #1


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Всем привет.
Не даёт покоя один момент в коде программы.
Вкратце - есть прога на С, которую компилирует IAR C/C++ Compiler for AVR
5.10A/W32 (5.10.1.5).
Оптимизация на макс. скорость.
Вот фрагмент сгенерированного кода:

Код
159                  for (a = length; a>0; a--)
   \   00000028   2F01               MOV     R16, R17
    160                  {
    161                      *pBuffer++    =    *text++;
   \                     ??usartSendCommand_4:
   \   0000002A   01F9               MOVW    R31:R30, R19:R18
   \   0000002C   9115               LPM     R17, Z+
   \   0000002E   019F               MOVW    R19:R18, R31:R30
   \   00000030   931D               ST      X+, R17
    162                  }
   \   00000032   950A               DEC     R16
   \   00000034   F7D1               BRNE    ??usartSendCommand_4


Вот думаю, для чего надо выполнять каждую итерацию цикла команды MOVW?
Почему бы не выполнять их один раз перед/после цикла?
Не подскажете, уважаемые, каким образом образумить тупонький компилятор? 07.gif
А то запарил он повсюду создавать подобную конструкцию...

ЗЫ: вспомнил, что по ИАРу есть отдельная ветка, если нужно, то пусть модераторы перекинут тему туда, извиняюсь...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Andreas1
сообщение May 21 2008, 12:54
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 446
Регистрация: 12-03-06
Из: Москва
Пользователь №: 15 142



Еще непонятки с оптимизацией, правда в IAR AVR 4.30
3 варианта одного и того-же
Код
     54              *ptr=b;
   \   00000026   8310               ST      Z, R17
     55              ptr-=7;
     56              if(*(ptr++)!=0xE0) return;//ptr++;
   \   00000028   9737               SBIW    R31:R30, 7
   \   0000002A   01DF               MOVW    R27:R26, R31:R30
   \   0000002C   9631               ADIW    R31:R30, 1
   \   0000002E   910C               LD      R16, X
   \   00000030   3E00               CPI     R16, 224
   \   00000032   F459               BRNE    ??RSRecByte_0
     57              if(*(ptr++)!=0x00) return;//ptr++;
   \   00000034   9101               LD      R16, Z+
   \   00000036   2300               TST     R16
   \   00000038   F441               BRNE    ??RSRecByte_0

Код
     54              *ptr=b;
   \   00000022   8310               ST      Z, R17
     55          //    ptr-=7;
     56              if(*(ptr++)!=0xE0) return;//ptr++;
   \   00000024   9101               LD      R16, Z+
   \   00000026   3E00               CPI     R16, 224
   \   00000028   F459               BRNE    ??RSRecByte_0
     57              if(*(ptr++)!=0x00) return;//ptr++;
   \   0000002A   9101               LD      R16, Z+
   \   0000002C   2300               TST     R16
   \   0000002E   F441               BRNE    ??RSRecByte_0

Код
     54              *ptr=b;
   \   00000022   8310               ST      Z, R17
     55              ptr-=7;
   \   00000024   9737               SBIW    R31:R30, 7
     56              if(*(ptr)!=0xE0) return;ptr++;
   \   00000026   9101               LD      R16, Z+
   \   00000028   3E00               CPI     R16, 224
   \   0000002A   F471               BRNE    ??RSRecByte_0
     57              if(*(ptr)!=0x00) return;ptr++;
   \   0000002C   9101               LD      R16, Z+
   \   0000002E   2300               TST     R16
   \   00000030   F459               BRNE    ??RSRecByte_0

Кроме того появляется сохранение/восстановление R26:27.
Вроде немного, но совершенно непонятная разница.
Получается, лучше дробить длинные выражения по кускам?
Цитата(zltigo @ May 19 2008, 22:09) *
В общем-то не слишком и сложно, если подумать, то не сложнее писания врукопашную на ASM. Опыт и навыки естественно нужны.

К сожалению, опыт приходится наживать свой и только мало-мало чужого, в отличие от писюкового программизма. Нет литературы, ориентированной на оптимальное написание на С.

P.S. Это пока только заготовка
Код
void RSRecByte(){
  if(!IsRecByteRS())return;
  byte b=GetByteRS();
  if(RSStatus==RS_RECCMD){//ïðèåì êîìàíäû
    byte *ptr=RSRecCmdBuffer; for(byte i=0;i<7;i++,ptr++)*ptr=*(ptr+1);
    *ptr=b;
    ptr-=7;
    if(*ptr!=0xE0) return;ptr++;
    if(*ptr!=0x00) return;ptr++;
    if(*ptr!=SysNum) return;ptr++;
    if(*ptr!=0x01) return;ptr++;
    RSStatus=1;
  }else{//ïðèåì äàííûõ
  }
}

Знать-бы какие подсказки компилер понимает sad.gif
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 21 2008, 14:32
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Andreas1 @ May 21 2008, 15:54) *
P.S. Это пока только заготовка

А попробуйте что-то вроде
Код
  if(RSStatus==RS_RECCMD)
{
      memcpy(RSRecCmdBuffer, &RSRecCmdBuffer, 7);
      RSRecCmdBuffer[7] = b;
memcpy - intrinsic, компилятор может ее реализовать эффективнее, чем компилируя ваш цикл.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
sonycman
сообщение May 26 2008, 17:12
Сообщение #4


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(Сергей Борщ @ May 21 2008, 19:32) *
А попробуйте что-то вроде
Код
  if(RSStatus==RS_RECCMD)
{
   memcpy(RSRecCmdBuffer, &RSRecCmdBuffer, 7);
   RSRecCmdBuffer[7] = b;
memcpy - intrinsic, компилятор может ее реализовать эффективнее, чем компилируя ваш цикл.


Дело в том, что memcpy использует в качестве счетчика регистровую пару, работа с которой при переброске маленьких блоков данных выглядит весьма неэффективной...
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- sonycman   Оптимизация кода IAR С++ v5.10 компилятора   May 18 2008, 15:47
- - Diz   Может, попробовать через стандартную memcpy ?   May 18 2008, 15:58
|- - sonycman   Цитата(Diz @ May 18 2008, 20:58) Может, п...   May 18 2008, 16:06
- - SasaVitebsk   Похоже указатель *text объявлен как volatile. Попр...   May 18 2008, 16:42
|- - sonycman   Цитата(SasaVitebsk @ May 18 2008, 21:42) ...   May 18 2008, 17:33
- - Diz   Если не ошибаюсь, в IAR для флеша есть memcpy_P.   May 18 2008, 17:47
- - vet   с флэш работает memcpy_P(). её объявление содержит...   May 18 2008, 17:47
|- - sonycman   Цитата(Diz @ May 18 2008, 22:47) Если не ...   May 18 2008, 17:51
|- - zltigo   Цитата(sonycman @ May 18 2008, 19:51) ......   May 18 2008, 21:04
- - IgorKossak   Если речь идёт конкретно об IAR и функция не может...   May 19 2008, 05:44
|- - sonycman   Цитата(zltigo @ May 19 2008, 02:04) Не ог...   May 19 2008, 13:40
|- - KRS   Цитата(sonycman @ May 19 2008, 17:40) ......   May 19 2008, 15:03
|- - sonycman   Цитата(KRS @ May 19 2008, 20:03) так в да...   May 19 2008, 15:10
|- - zltigo   Цитата(sonycman @ May 19 2008, 17:10) Опт...   May 19 2008, 15:31
|- - sonycman   Цитата(zltigo @ May 19 2008, 20:31) Ну ещ...   May 19 2008, 15:55
- - Rst7   Цитата...попробовал вот так: из этого никак не мог...   May 19 2008, 14:04
|- - sonycman   Цитата(Rst7 @ May 19 2008, 19:04) из этог...   May 19 2008, 14:11
- - Rst7   ЦитатаОптимизации, мать их так Ну попробуйте тако...   May 19 2008, 16:29
|- - sonycman   Цитата(Rst7 @ May 19 2008, 21:29) Ну попр...   May 19 2008, 16:52
||- - sonycman   Да, чудесным образом лишние инструкции исчезли...   May 19 2008, 18:05
||- - zltigo   Цитата(sonycman @ May 19 2008, 20:05) Да-...   May 19 2008, 18:09
|- - singlskv   Цитата(Rst7 @ May 19 2008, 20:29) Тут мно...   May 19 2008, 18:36
- - Rst7   ЦитатаПроблемы только с переносимостью между компи...   May 20 2008, 07:01
|- - singlskv   Цитата(Rst7 @ May 20 2008, 11:01) Это пок...   May 20 2008, 07:31
|- - sonycman   Цитата(Rst7 @ May 20 2008, 11:01) делаем ...   May 20 2008, 11:58
|- - singlskv   Цитата(sonycman @ May 20 2008, 15:58) Хм,...   May 20 2008, 12:09
|- - sonycman   Цитата(singlskv @ May 20 2008, 16:09) Там...   May 20 2008, 12:18
- - Rst7   Цитата3 варианта одного и того-же Местные телепат...   May 21 2008, 13:06
- - Waso   Немного не в тему, потому как речь о версии ИАР 4....   Nov 26 2010, 18:30
|- - demiurg_spb   А если так: Кодunion { // для доступа к одной я...   Nov 27 2010, 18:25
|- - Dog Pawlowa   Цитата(Waso @ Nov 26 2010, 21:30) Немного...   Nov 28 2010, 06:37
- - Xenia   Вот так напишите и будет вам щастье: Кодvoid ma...   Nov 28 2010, 07:37
- - Waso   demiurg_spb, неа, не канает. Xenia, Dog Pawlowa, ...   Nov 28 2010, 19:33
|- - rezident   Цитата(Waso @ Nov 29 2010, 00:33) Где про...   Nov 28 2010, 20:43
|- - Сергей Борщ   QUOTE (rezident @ Nov 28 2010, 22:43) В с...   Nov 28 2010, 22:18
- - Waso   Спасибо. Каюсь. Грешен. Ненавижу читать стандарты...   Nov 29 2010, 08:17


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

 


RSS Текстовая версия Сейчас: 30th July 2025 - 11:40
Рейтинг@Mail.ru


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