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

Я боюсь IARа :-)

Недавно в теме "typedef" обнаружил нечто. Сначала думал у меня руки кривые. Потом создал простейший проект в IAR EWARM 4.20 и испугался не на шутку. Потому как уже много проектов делал на ИАРе с максимальной оптимизацией. Можно сказать, на кон поставлена моя репутация (:)). Ведь все шишки от заказчиков повалятся на меня, а не на IAR.

 

Вобщем, прилагаю скриншот проекта. Ничего особенного. Всё что надо - видно на экране. Ассемблерные вставки применял в качестве volatile кода, чтобы наглядно и компилер не выкинул. Разумеется их можно заменить на любые другие действия. Всё чудесно работает на низких и средних оптимизациях, но не на максимальных (обоих). Самое интересное выделено красным. Зелёная полоса - начало main(). Проект тоже прикрепил на всякий пожарный.

post-16753-1211909958_thumb.jpg

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


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

Картинки какие-то, ну очень цветные...

Предпочитаю листинги читать.

     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, и раритетных не коллекционирую, посему рассмотреть подробно не могу.

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


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

А вот мой:

   \                                 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          }

Изменено пользователем 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 и он не заработал. Тоже на максимуме оптимизации. Мне сейчас очень интересно почему :) Я тогда ещё подумал, что новые версии глючные.

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


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

Как-то рабочий проект из 4.20 скомпилил на 4.30 и он не заработал. Тоже на максимуме оптимизации.

Ну по этому поводу могу сказать только то, что никогда свои исходники без макимальных оптимизаций не компилировал и всегда пользуюсь свежим IAR. На проблему IAR наступил однажды года три назад - буквально в слежующем релиза рна фигурировала в списке исправлений. Причем это была правка чужого кода - сам-бы я в таком стиле не написал. По нынешним временам вообще лучше 5 версией пользоваться.

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


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

Согласен с zltigo, перешел на IAR после "голимости" Keil-a для 51 семейства. Сейчас использую 5-е версии для AVR и ARM. Всегда использую полную оптимизацию по скорости или, где требуется по размеру. Не встречал еще ни одной ошибки, связанной с компилятором... Только свои ручки :)

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


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

YAM, ну, вот, к примеру )

http://electronix.ru/forum/index.php?showtopic=44643

проявляется именно при макс. оптимизации.

 

Ещё сталкивался с неверными результатами вычислений с плавающей точкой, причём тот же код корректно работал в Keil.

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


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

YAM, ну, вот, к примеру )

Дело не в примерах - примеров можно пачками посмотреть в списках исправленных багов в каждой новой версии IAR, дело в том, насколько стиль написания провоцирует натыкания на грабли.

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


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

Дело не в примерах ... дело в том, насколько стиль написания провоцирует натыкания на грабли.
У меня в примерах что, какой-то неправильный стиль написания?
На проблему IAR наступил однажды года три назад - буквально в слежующем релиза рна фигурировала в списке исправлений. Причем это была правка чужого кода - сам-бы я в таком стиле не написал.
ИМХО надо создать FAQ по "неправильным" стилям написания :) Кстати, какая версия-то IARa была?

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


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

У меня в примерах что, какой-то неправильный стиль написания?

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

ИМХО надо создать FAQ по "неправильным" стилям написания

Не берусь :( стиль складывался стихийно с набиванием реальных шишек на многиз имногих реально еще глюковатых компиляторах начиная с середины 80x.

Кстати, какая версия-то IARa была?

Какая-то свежайшая трехлетней давности. Могу по списку исправленных багов найти, а нужно?

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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