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

Любитель
    
Группа: Свой
Сообщений: 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? Почему бы не выполнять их один раз перед/после цикла? Не подскажете, уважаемые, каким образом образумить тупонький компилятор? А то запарил он повсюду создавать подобную конструкцию... ЗЫ: вспомнил, что по ИАРу есть отдельная ветка, если нужно, то пусть модераторы перекинут тему туда, извиняюсь...
|
|
|
|
|
 |
Ответов
|
May 19 2008, 13:40
|

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

|
Цитата(zltigo @ May 19 2008, 02:04)  Не ограничивать простор для возможности компилятору пооптимизировать и не создавать мелких функций, ну а если надо для, например, читаемости, то есть возможность заинлайнить: #pragma inline=forced Так их и нет, этих мелких функций. Строчка с копированием находится внутри большой функции, инлайнить нечего... Цитата(IgorKossak @ May 19 2008, 10:44)  Если речь идёт конкретно об IAR и функция не может быть однозначно заменена библиотечной типа memcpy_P(), то посмотрите в сторону атрибутов __x, __x_z ... описанных в \avr\doc\iccavr.htm ...попробовал вот так: Код __x_z void copymem_P(fbyte __flash* source, byte* dest, byte len) { while(len--) { *dest++ = *source++; } } ...но получилось тоже самое: Код 92 copymem_P(text, pBuffer, length); \ 00000022 2F01 MOV R16, R17 \ 00000024 01DF MOVW R27:R26, R31:R30 \ 00000026 9614 ADIW R27:R26, 4 \ ??usartSendCommand_4: \ 00000028 950A DEC R16 \ 0000002A 01F9 MOVW R31:R30, R19:R18 \ 0000002C 9115 LPM R17, Z+ \ 0000002E 019F MOVW R19:R18, R31:R30 \ 00000030 931D ST X+, R17 \ 00000032 F7D1 BRNE ??usartSendCommand_4 Эх, от этих MOVW, похоже, никуда не деться, так сказать, издержки компиляции Зато заметил, что при установке уровня оптимизации по скорости на средний - получаем наконец желаемое: Код 94 for (a = length; a>0; a--) \ 00000024 2F08 MOV R16, R24 \ 00000026 C003 RJMP ??usartSendCommand_4 95 { 96 *pBuffer++ = *text++; \ ??usartSendCommand_5: \ 00000028 9115 LPM R17, Z+ \ 0000002A 931D ST X+, R17 97 } \ 0000002C 950A DEC R16 \ ??usartSendCommand_4: \ 0000002E 2300 TST R16 \ 00000030 F7D9 BRNE ??usartSendCommand_5 но тут уже другие участки кода становятся не идеальными... Интересно, можно ли как-то получить красивый код такого цикла при высоком уровне оптимизации?
|
|
|
|
|
May 19 2008, 15:03
|

Профессионал
    
Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555

|
Цитата(sonycman @ May 19 2008, 17:40)  ...попробовал вот так: Код __x_z void copymem_P(fbyte __flash* source, byte* dest, byte len) { while(len--) { *dest++ = *source++; } } так в данном случае надо __z_x или поменять местами указатели на флеш и память! потому что у вас получается указатель на флеш в X, а он должен быть в Z
|
|
|
|
|
May 19 2008, 15:10
|

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

|
Цитата(KRS @ May 19 2008, 20:03)  так в данном случае надо __z_x или поменять местами указатели на флеш и память! потому что у вас получается указатель на флеш в X, а он должен быть в Z Поменял местами. Толку всё равно нет: Код \ ??usartSendCommand_4: \ 00000028 950A DEC R16 \ 0000002A 01F9 MOVW R31:R30, R19:R18 \ 0000002C 9115 LPM R17, Z+ \ 0000002E 019F MOVW R19:R18, R31:R30 \ 00000030 931D ST X+, R17 \ 00000032 F7D1 BRNE ??usartSendCommand_4 Вообще эта инлайн функция была приведена чисто для проверки, а так она там и даром не нужна. Как видно, конечный код в случае использования функции практически не отличается от цикла вида: *pBuffer++ = *text++; И MOVW никуда не уходят. Оптимизации, мать их так
|
|
|
|
Сообщений в этой теме
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    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 Andreas1 Еще непонятки с оптимизацией, правда в IAR AVR 4.3... May 21 2008, 12:54 Сергей Борщ Цитата(Andreas1 @ May 21 2008, 15:54) P.S... May 21 2008, 14:32  sonycman Цитата(Сергей Борщ @ May 21 2008, 19:32) ... May 26 2008, 17:12 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
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|