Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Я боюсь IARа :-)
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
GetSmart
Недавно в теме "typedef" обнаружил нечто. Сначала думал у меня руки кривые. Потом создал простейший проект в IAR EWARM 4.20 и испугался не на шутку. Потому как уже много проектов делал на ИАРе с максимальной оптимизацией. Можно сказать, на кон поставлена моя репутация (smile.gif). Ведь все шишки от заказчиков повалятся на меня, а не на IAR.

Вобщем, прилагаю скриншот проекта. Ничего особенного. Всё что надо - видно на экране. Ассемблерные вставки применял в качестве volatile кода, чтобы наглядно и компилер не выкинул. Разумеется их можно заменить на любые другие действия. Всё чудесно работает на низких и средних оптимизациях, но не на максимальных (обоих). Самое интересное выделено красным. Зелёная полоса - начало main(). Проект тоже прикрепил на всякий пожарный.
zltigo
Картинки какие-то, ну очень цветные...
Предпочитаю листинги читать.
Код
     17          void main()
     18          {
   \                     main:
   \   00000000   30402DE9           PUSH     {R4,R5,LR}
     19              init();
   \   00000004   ........           BL       init
     20              if (cnt >= 1024) asm("MOV R14,R15");
   \   00000008   ........           LDR      R4,??DataTable2 ;; cnt
   \   0000000C   000094E5           LDR      R0,[R4, #+0]
   \   00000010   400E50E3           CMP      R0,#+1024
   \   00000014   010000BA           BLT      ??main_0
   \   00000018   0FE0A0E1           MOV R14,R15      
   \   0000001C   000000EA           B        ??main_1
     21              else asm("MOV R15,R14");
   \                     ??main_0:
   \   00000020   0EF0A0E1           MOV R15,R14      
     22              cnt = 1024;
   \                     ??main_1:
   \   00000024   400EA0E3           MOV      R0,#+1024
   \   00000028   000084E5           STR      R0,[R4, #+0]
     23              stop();
   \   0000002C   ........           LDR      R5,??DataTable3 ;; `?<Constant "\\375\\362\\356 \\352\\356\\355\\345\\366\\`
   \                     ??main_2:
   \   00000030   0510A0E1           MOV      R1,R5
   \   00000034   040084E2           ADD      R0,R4,#+4
   \   00000038   ........           _BLF     sprintf,??sprintf??rA
   \   0000003C   FBFFFFEA           B        ??main_2
     24          }

Это правда 4.42, и раритетных не коллекционирую, посему рассмотреть подробно не могу.
GetSmart
А вот мой:
Код
   \                                 In segment CODE, align 4, keep-with-next
   \   00000000                      CODE32      
     17          void main()
     18          {
   \                     main:
   \   00000000   30402DE9           STMDB       SP!,{R4,R5,LR}    ;; Push
     19              init();
   \   00000004   ........           BL          init
     20              if (cnt >= 1024) asm("MOV R14,R15");
   \   00000008   ........           LDR         R4,??DataTable2   ;; cnt
   \   0000000C   000094E5           LDR         R0,[R4, #+0]
   \   00000010   0FE0A0E1           MOV R14,R15
     21              else asm("MOV R15,R14");
   \   00000014   0EF0A0E1           MOV R15,R14
     22              cnt = 1024;
   \   00000018   400EA0E3           MOV         R0,#+0x400
   \   0000001C   000084E5           STR         R0,[R4, #+0]
     23              stop();
   \   00000020   ........           LDR         R5,??DataTable3   ;; `?<Constant "\\375\\362\\356 \\352\\356\\355\\345\\366\\`
   \                     ??main_0:
   \   00000024   0510A0E1           MOV         R1,R5
   \   00000028   040084E2           ADD         R0,R4,#+0x4
   \   0000002C   ........           _BLF        sprintf,sprintf??rA
   \   00000030   FBFFFFEA           B           ??main_0
     24          }
zltigo
Цитата(GetSmart @ May 27 2008, 20:02) *
А вот мой:

А сишный исходник для чего похерили???
GetSmart
Цитата(zltigo @ May 28 2008, 00:05) *
А сишный исходник для чего похерили???
Я их просто не включил. Вот архив вместе с листингами.
GetSmart
Вот, что в теме "typedef" меня удивило:
Код
    typedef float real;

    const double tmp = 1.0/3;

    if (*(real *)&tmp == tmp)
    { asm("NOP");
    }
    else
    { asm("NOP");
      asm("NOP");
    }
Это я вставил в начало процедуры (любой) в одном моём проекте. Смысл был в том, чтобы отличить тип, допустим float от double (либо на этапе компиляции, либо в рунтайме) и выполнить одно из действий. Там при приведении типа в real можно вместо него сразу float поставить. Не суть. Суть в том, что опять оба варианта в IFе выполняются на EWARM 4.20.

Как-то рабочий проект из 4.20 скомпилил на 4.30 и он не заработал. Тоже на максимуме оптимизации. Мне сейчас очень интересно почему smile.gif Я тогда ещё подумал, что новые версии глючные.
zltigo
Цитата(GetSmart @ May 27 2008, 21:21) *
Как-то рабочий проект из 4.20 скомпилил на 4.30 и он не заработал. Тоже на максимуме оптимизации.

Ну по этому поводу могу сказать только то, что никогда свои исходники без макимальных оптимизаций не компилировал и всегда пользуюсь свежим IAR. На проблему IAR наступил однажды года три назад - буквально в слежующем релиза рна фигурировала в списке исправлений. Причем это была правка чужого кода - сам-бы я в таком стиле не написал. По нынешним временам вообще лучше 5 версией пользоваться.
YAM
Согласен с zltigo, перешел на IAR после "голимости" Keil-a для 51 семейства. Сейчас использую 5-е версии для AVR и ARM. Всегда использую полную оптимизацию по скорости или, где требуется по размеру. Не встречал еще ни одной ошибки, связанной с компилятором... Только свои ручки smile.gif
vet
YAM, ну, вот, к примеру )
http://electronix.ru/forum/index.php?showtopic=44643
проявляется именно при макс. оптимизации.

Ещё сталкивался с неверными результатами вычислений с плавающей точкой, причём тот же код корректно работал в Keil.
zltigo
Цитата(vet @ May 28 2008, 09:34) *
YAM, ну, вот, к примеру )

Дело не в примерах - примеров можно пачками посмотреть в списках исправленных багов в каждой новой версии IAR, дело в том, насколько стиль написания провоцирует натыкания на грабли.
GetSmart
Цитата(zltigo)
Дело не в примерах ... дело в том, насколько стиль написания провоцирует натыкания на грабли.
У меня в примерах что, какой-то неправильный стиль написания?
Цитата(zltigo)
На проблему IAR наступил однажды года три назад - буквально в слежующем релиза рна фигурировала в списке исправлений. Причем это была правка чужого кода - сам-бы я в таком стиле не написал.
ИМХО надо создать FAQ по "неправильным" стилям написания smile.gif Кстати, какая версия-то IARa была?
zltigo
Цитата(GetSmart @ May 28 2008, 10:01) *
У меня в примерах что, какой-то неправильный стиль написания?

Трудно сказать, я не имею старых IAR-ов, посему не могу глянуть, что будет, например, без столь не любимых мною asm(), что будет при более общирном коде, а не исскуственной оберточке.
Цитата
ИМХО надо создать FAQ по "неправильным" стилям написания

Не берусь sad.gif стиль складывался стихийно с набиванием реальных шишек на многиз имногих реально еще глюковатых компиляторах начиная с середины 80x.
Цитата
Кстати, какая версия-то IARa была?

Какая-то свежайшая трехлетней давности. Могу по списку исправленных багов найти, а нужно?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.