sergik_vrn 0 14 января, 2009 Опубликовано 14 января, 2009 · Жалоба C появлением V5 ARM компилятора у IAR это утверждение стало совсем уже не однозначным. есть проект под STR710, в собранном виде с максимальной оптимизацией по размеру на IAR 4.42 еле-еле укладывается в существующие там 256+16К (то есть, свободного места порядка сотен байтов). Это с оптимизацией типов данных, выравнивания, временных переменных и прочей ерунды. После портирования его под IAR 5.20 сборка того же кода с максимальной оптимизацией по размеру дает превышение допустимого объема примерно на 0x400 байт. Следует ли полагать, что я чего-то недоучел/недопортировал/недовключил? Расширять проект еще хочется, так что вопрос весьма актуален Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Кононов Василий 0 2 марта, 2009 Опубликовано 2 марта, 2009 · Жалоба Давно пользуюсь IAR для AVR. Поэтому для нового проекта для LPC2103 выбрал компилятор от IAR 4.31. Первое что бросается в глаза - отсутствие поддержки многих слов, таких как __noreturn, __task и прочих... Создается впечатление сырой разработки. Кроме того не могу добиться условного выполнения инструкций ни при каких настройках оптимизации. Хотя оптимизация по размеру - на высоте. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rst7 5 2 марта, 2009 Опубликовано 2 марта, 2009 · Жалоба Кроме того не могу добиться условного выполнения инструкций ни при каких настройках оптимизации. Условное выполнение инструкций возможно только в ARM-режиме. В тумбе этого нет. Первое что бросается в глаза - отсутствие поддержки многих слов, таких как __noreturn, __task Для ARM'а это не актуально. Да и компиллер не стыдно взять посвежее... 5.30 уже на дворе. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Кононов Василий 0 2 марта, 2009 Опубликовано 2 марта, 2009 · Жалоба Специально закачал 5.30 - так же не использует условного выполнения, в ARM режиме то же. __noreturn полезно при использовании многозадачности - компилятор не выполняет сохранения контекста, размер которого достигает 40 байт, при 4 задачах - уже 160 не так много для ARM'а, но все же... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rst7 5 2 марта, 2009 Опубликовано 2 марта, 2009 · Жалоба так же не использует условного выполнения, в ARM режиме то же. Быть того не может. Наглядный пример 536 if (coef<0) \ 0000001C A260A0E1 LSR R6,R2,#+1 \ 00000020 000055E3 CMP R5,#+0 \ 00000024 0700005A BPL ??z_and_q_0 537 { 538 unsigned int tmp; 539 tmp = -coef; 540 tmp += __q>>1; /* for rounding */ \ 00000028 005065E2 RSB R5,R5,#+0 \ 0000002C 055086E0 ADD R5,R6,R5 541 #ifdef USE_MUL 542 coef = -(tmp>__q?MUL_U16(tmp, __iq):0); \ 00000030 050052E1 CMP R2,R5 \ 00000034 94050230 MULCC R2,R4,R5 \ 00000038 2228A031 LSRCC R2,R2,#+16 \ 0000003C 0020A023 MOVCS R2,#+0 \ 00000040 002062E2 RSB R2,R2,#+0 \ 00000044 040000EA B ??z_and_q_1 543 #else 544 coef = -DIVIDE_(tmp, __q); 545 #endif 546 } 547 else 548 { 549 unsigned int tmp; 550 tmp = coef; 551 tmp += __q>>1; /* for rounding */ \ ??z_and_q_0: \ 00000048 055086E0 ADD R5,R6,R5 552 #ifdef USE_MUL 553 coef = tmp>__q?MUL_U16(tmp,__iq):0; \ 0000004C 050052E1 CMP R2,R5 \ 00000050 94050230 MULCC R2,R4,R5 \ 00000054 2228A031 LSRCC R2,R2,#+16 \ 00000058 0020A023 MOVCS R2,#+0 \ ??z_and_q_1: \ 0000005C 54449FE5 LDR R4,??z_and_q_2 ;; z_q + 780 \ 00000060 004094E5 LDR R4,[R4, #+0] \ 00000064 044052E0 SUBS R4,R2,R4 554 #else 555 coef = DIVIDE_(tmp, __q); 556 #endif 557 } И переходы есть, и условное выполнение. Все по необходимости. __noreturn полезно при использовании многозадачности Кстати. Только что глянул в хелп. Есть __noreturn. Что-то Вы совсем не то делаете. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Кононов Василий 0 2 марта, 2009 Опубликовано 2 марта, 2009 · Жалоба Говорю про подобные моменты: // 890 if (bit) CMP R0,#+0 BEQ ??korsumcount_5 // 891 dword0 |=1; ORR R1,R1,#0x1 // 892 // 893 databuffshift[0]=dword0; ??korsumcount_5: STR R1,[R2, #+0] а мог бы сделать так: // 890 if (bit) CMP R0,#+0 // 891 dword0 |=1; ORRNE R1,R1,#0x1 // 892 // 893 databuffshift[0]=dword0; STR R1,[R2, #+0] GCC выполняет подобную оптимизацию и без включения оптимизации... __noreturn в 4.31 ARM - еще отсутствует, хотя в 4.11 для AVR есть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rst7 5 2 марта, 2009 Опубликовано 2 марта, 2009 · Жалоба Говорю про подобные моменты: Вот Ваш код. Собран 5.20 ############################################################################### # # # 02/Mar/2009 12:31:04 # # IAR ANSI C/C++ Compiler V5.20.0.20892/W32 EVALUATION for ARM # # Copyright 1999-2008 IAR Systems AB. # # # # Cpu mode = arm # # Endian = little # # Source file = E:\JPEGcoder\CoderARM\t.c # # Command line = E:\JPEGcoder\CoderARM\t.c -lC # # E:\JPEGcoder\CoderARM\Debug\List\ -o # # E:\JPEGcoder\CoderARM\Debug\Obj\ --no_unroll # # --no_inline --debug --endian=little --cpu=ARM920T -e # # --fpu=None --dlib_config D:\IAR_ARM520\ARM\INC\DLib_Conf # # ig_Normal.h -I D:\IAR_ARM520\ARM\INC\ --interwork # # --cpu_mode arm -Ohs # # List file = E:\JPEGcoder\CoderARM\Debug\List\t.lst # # Object file = E:\JPEGcoder\CoderARM\Debug\Obj\t.o # # # # # ############################################################################### \ In section .text, align 4, keep-with-next E:\JPEGcoder\CoderARM\t.c 1 void foox(unsigned long bit, unsigned long dword0, unsigned long *databuffshift) 2 { 3 if (bit) \ foox: \ 00000000 000050E3 CMP R0,#+0 4 dword0 |=1; \ 00000004 01108113 ORRNE R1,R1,#0x1 5 databuffshift[0]=dword0; \ 00000008 001082E5 STR R1,[R2, #+0] 6 } \ 0000000C 1EFF2FE1 BX LR ;; return Maximum stack usage in bytes: Function .cstack -------- ------- foox 0 Section sizes: Function/Label Bytes -------------- ----- foox 16 16 bytes in section .text 16 bytes of CODE memory Errors: none Warnings: none Где криминал? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 2 марта, 2009 Опубликовано 2 марта, 2009 · Жалоба __noreturn в 4.31 ARM - еще отсутствует, хотя в 4.11 для AVR есть. А вот 19 веке, ни фирмы Atmel, ни AVR не существовало. Ну и что? __noreturn есть и в 4 и в 5 ветках EWARM, возможно, что его когда-то не было, ну и что? Вот Ваш код. Собран 5.20 Четверка, естественно, генерит такой-же. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Кононов Василий 0 2 марта, 2009 Опубликовано 2 марта, 2009 · Жалоба Спасибо за подсказку! Моя ошибка была в попытке использования директивы "#pragma optimize=s 9" для изменения параметров компиляции одной функции. Максимальная оптимизация для всего проекта исправила код. Не понятно только одно - почему компилятор не использует важной особенности процессора (условное выполнение инструкций) без максимальной оптимизации? Сделано для того что бы поставить галочку - убрал условный переход, значит хорошо выполнил оптимизацию? Разработчики софта считают использование инструкции оптимизацией? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rst7 5 2 марта, 2009 Опубликовано 2 марта, 2009 · Жалоба Не понятно только одно - почему компилятор не использует важной особенности процессора (условное выполнение инструкций) без максимальной оптимизации? Я вообще собираю проекты исключительно на максимальной оптимизации. Что там происходит на малых уровнях - не интересует совершенно. И Вам советую поступать так же. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться