Перейти к содержанию
    

C появлением V5 ARM компилятора у IAR это утверждение стало совсем уже не однозначным.

есть проект под STR710, в собранном виде с максимальной оптимизацией по размеру на IAR 4.42 еле-еле укладывается в существующие там 256+16К (то есть, свободного места порядка сотен байтов). Это с оптимизацией типов данных, выравнивания, временных переменных и прочей ерунды. После портирования его под IAR 5.20 сборка того же кода с максимальной оптимизацией по размеру дает превышение допустимого объема примерно на 0x400 байт. Следует ли полагать, что я чего-то недоучел/недопортировал/недовключил? Расширять проект еще хочется, так что вопрос весьма актуален

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Давно пользуюсь IAR для AVR. Поэтому для нового проекта для LPC2103 выбрал компилятор от IAR 4.31. Первое что бросается в глаза - отсутствие поддержки многих слов, таких как __noreturn, __task и прочих... Создается впечатление сырой разработки. Кроме того не могу добиться условного выполнения инструкций ни при каких настройках оптимизации. Хотя оптимизация по размеру - на высоте.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кроме того не могу добиться условного выполнения инструкций ни при каких настройках оптимизации.

 

Условное выполнение инструкций возможно только в ARM-режиме. В тумбе этого нет.

 

Первое что бросается в глаза - отсутствие поддержки многих слов, таких как __noreturn, __task

 

Для ARM'а это не актуально.

 

Да и компиллер не стыдно взять посвежее... 5.30 уже на дворе.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Специально закачал 5.30 - так же не использует условного выполнения, в ARM режиме то же. __noreturn полезно при использовании многозадачности - компилятор не выполняет сохранения контекста, размер которого достигает 40 байт, при 4 задачах - уже 160 не так много для ARM'а, но все же...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

так же не использует условного выполнения, в 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.

 

Что-то Вы совсем не то делаете.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Говорю про подобные моменты:

//  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 есть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Говорю про подобные моменты:

 

Вот Ваш код. Собран 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

 

Где криминал?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

__noreturn в 4.31 ARM - еще отсутствует, хотя в 4.11 для AVR есть.

А вот 19 веке, ни фирмы Atmel, ни AVR не существовало. Ну и что? __noreturn есть и в 4 и в 5 ветках EWARM, возможно, что его когда-то не было, ну и что?

 

 

 

 

 

Вот Ваш код. Собран 5.20

Четверка, естественно, генерит такой-же.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за подсказку! Моя ошибка была в попытке использования директивы "#pragma optimize=s 9" для изменения параметров компиляции одной функции. Максимальная оптимизация для всего проекта исправила код.

Не понятно только одно - почему компилятор не использует важной особенности процессора (условное выполнение инструкций) без максимальной оптимизации? Сделано для того что бы поставить галочку - убрал условный переход, значит хорошо выполнил оптимизацию? Разработчики софта считают использование инструкции оптимизацией?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не понятно только одно - почему компилятор не использует важной особенности процессора (условное выполнение инструкций) без максимальной оптимизации?

 

Я вообще собираю проекты исключительно на максимальной оптимизации. Что там происходит на малых уровнях - не интересует совершенно. И Вам советую поступать так же.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...