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

Привет всем!

 

Неожиданно проявилась проблема с IAR.

После перехода на версию 5.4 Full девайс на LPC1766 стал глючить.

Оптимизация - High/Balanced.

 

Анализ выявил следующее.

 

Заглючила строка сравнивающая старшее и младшее слово

INT32U kc=key_code;  // key_code тоже INT32U
  if(!(0xFFFF&(kc^(kc>>16)))) {...}

Компилятор породил следущий код

\   0000013C   080C               LSRS     R0,R1,#+16 // в R1 находится kc
\   0000013E   91EA000F           TEQ      R1,R0
\   00000142   4DD1               BNE.N    ??__int_display_2

Очевидно, что 0xFFFF проигнорирован напрочь.

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

Однако, после некоторых манипуляций, конструкция была изменена на

   if((0xFFFF&kc)==(kc>>16)){...}

 

Что породило уже рабочую последовательность

\   0000013C   88B2               UXTH     R0,R1 // в R1 находится kc
\   0000013E   B0EB114F           CMP      R0,R1, LSR #+16
\   00000142   4DD1               BNE.N    ??__int_display_2

 

Я, конечно, понимаю, что в IAR люди работают и ничего человеческое им не чуждо.

Посмотрел на сайте и скачал Evalution версии 5.41, однако ничего не изменилось!!!!

На мой взгляд, оба варианта сравнения идентичны по сути.

Может быть первоначальный вариант и не столь очевиден, НО компилятора это не должно касаться.

Такого рода конструкций в проге куча.

Что же теперь, всё перепроверять на понятность и адекватность компилятора?

Печально, но я IARу раньше доверял как родному.

 

Суть вопроса - версию 5.4 в топку или я чего-то не не понимаю?

 

Заранее благодарен.

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


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

Доброго времени суток.

 

Посмотрел в старой копии, что генерировал 5.3.

 

В R3 находится значение kc.

\   0000012A   83EA1342           EOR      R2,R3,R3, LSR #+16
\   0000012E   92B2               UXTH     R2,R2
\   00000130   002A               CMP      R2,#+0
\   00000132   54D1               BNE.N    ??__int_display_3

 

Немного длиннее, но, главное, все корректно. Следовательно в 5.4 "улучшили" чего-то.

Учитывая, что у меня trial, писать в IAR бесполезно,

а с моим знанием английского ещё и безсмысленно.

 

Так что, любители новых версий IAR будьте осторожны - не выбрасывайте 5.3.

 

Удачи!

Изменено пользователем Ytrnj

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


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

Такого рода конструкций в проге куча.

"Такого рода конструкций" у меня ни одной - можно я выброшу 5.3 компилятор???

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


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

А вы уверены в правильности своего кода?

Дело в том что для INT32 операция сдвига вправо расширяет знак!

т.е.

если ks = 0x80008000

то условие

if((0xFFFF&kc)==(kc>>16))

не выполнится

0x8000 != 0xFFFF8000

---------------

Не все ок!

не заметил букву U в конце типа! Обычно ее в начале ставят

Изменено пользователем KRS

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


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

Дело в том что для INT32 операция сдвига вправо расширяет знак!
Согласно стандарту результат операции сдвига вправа отрицательного числа вообще отдан на откуп компилятору. Сам был немало удивлен.

 

Я тоже подумал об этой причине, но в последний момент успел заметить U.

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


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

действительно с XORом какой то глюк! При проверке на 0

volatile int beep;
void test1(unsigned a)
{
    if ((a ^ (a >> 16)) & 0xffff)
        beep = 1;
}

void test2(unsigned a)
{
    if ((a ^ (a >> 1)) & 0xffff)
        beep = 1;
}

unsigned test3(unsigned a)
{
    return ((a ^ (a >> 16)) & 0xffff);

}

void test4(unsigned a, unsigned b)
{
    if ((a ^ (b >> 16)) & 0xffff)
        beep = 1;
}

void test5(unsigned a, unsigned b)
{
    if ((a ^ (b >> 1)) & 0xffff)
        beep = 1;
}

void test6(unsigned a, unsigned b)
{
    if (((a & 0xffff) ^ (b >> 16)))
        beep = 1;
}

void test7(unsigned a)
{
    if (((a & 0xffff) ^ (a >> 16)))
        beep = 1;
}

void test8(unsigned a)
{
    if (((a & 0xffff) ^ (a >> 1)))
        beep = 1;
}

void test9(unsigned a, unsigned b)
{
    if (((a & 0xffff) ^ (b >> 1)))
        beep = 1;
}

 

Все эти функции кроме 3, 8, 9

компилируются с ошибкой!

 

      2          void test1(unsigned a)
      3          {
      4              if ((a ^ (a >> 16)) & 0xffff)
   \                     test1:
   \   00000000   010C               LSRS     R1,R0,#+16
   \   00000002   90EA010F           TEQ      R0,R1
   \   00000006   02D0               BEQ.N    ??test1_0
      5                  beep = 1;
   \   00000008   ....               LDR.N    R0,??DataTable7 ;; beep
   \   0000000A   0121               MOVS     R1,#+1
   \   0000000C   0160               STR      R1,[R0, #+0]
      6          }
   \                     ??test1_0:
   \   0000000E   7047               BX       LR              ;; return
      7          

   \                                 In section .text, align 2, keep-with-next
      8          void test2(unsigned a)
      9          {
     10              if ((a ^ (a >> 1)) & 0xffff)
   \                     test2:
   \   00000000   4108               LSRS     R1,R0,#+1
   \   00000002   90EA010F           TEQ      R0,R1
   \   00000006   02D0               BEQ.N    ??test2_0
     11                  beep = 1;
   \   00000008   ....               LDR.N    R0,??DataTable7 ;; beep
   \   0000000A   0121               MOVS     R1,#+1
   \   0000000C   0160               STR      R1,[R0, #+0]
     12          }
   \                     ??test2_0:
   \   0000000E   7047               BX       LR              ;; return
     13          

   \                                 In section .text, align 2, keep-with-next
     14          unsigned test3(unsigned a)
     15          {
     16              return ((a ^ (a >> 16)) & 0xffff);
   \                     test3:
   \   00000000   80EA1040           EOR      R0,R0,R0, LSR #+16
   \   00000004   80B2               UXTH     R0,R0
   \   00000006   7047               BX       LR              ;; return
     17          
     18          }
     19          

   \                                 In section .text, align 2, keep-with-next
     20          void test4(unsigned a, unsigned b)
     21          {
     22              if ((a ^ (b >> 16)) & 0xffff)
   \                     test4:
   \   00000000   090C               LSRS     R1,R1,#+16
   \   00000002   90EA010F           TEQ      R0,R1
   \   00000006   02D0               BEQ.N    ??test4_0
     23                  beep = 1;
   \   00000008   ....               LDR.N    R0,??DataTable7 ;; beep
   \   0000000A   0121               MOVS     R1,#+1
   \   0000000C   0160               STR      R1,[R0, #+0]
     24          }
   \                     ??test4_0:
   \   0000000E   7047               BX       LR              ;; return
     25          

   \                                 In section .text, align 2, keep-with-next
     26          void test5(unsigned a, unsigned b)
     27          {
     28              if ((a ^ (b >> 1)) & 0xffff)
   \                     test5:
   \   00000000   4908               LSRS     R1,R1,#+1
   \   00000002   90EA010F           TEQ      R0,R1
   \   00000006   02D0               BEQ.N    ??test5_0
     29                  beep = 1;
   \   00000008   ....               LDR.N    R0,??DataTable7 ;; beep
   \   0000000A   0121               MOVS     R1,#+1
   \   0000000C   0160               STR      R1,[R0, #+0]
     30          }
   \                     ??test5_0:
   \   0000000E   7047               BX       LR              ;; return
     31          

   \                                 In section .text, align 2, keep-with-next
     32          void test6(unsigned a, unsigned b)
     33          {
     34              if (((a & 0xffff) ^ (b >> 16)))
   \                     test6:
   \   00000000   090C               LSRS     R1,R1,#+16
   \   00000002   90EA010F           TEQ      R0,R1
   \   00000006   02D0               BEQ.N    ??test6_0
     35                  beep = 1;
   \   00000008   ....               LDR.N    R0,??DataTable7 ;; beep
   \   0000000A   0121               MOVS     R1,#+1
   \   0000000C   0160               STR      R1,[R0, #+0]
     36          }
   \                     ??test6_0:
   \   0000000E   7047               BX       LR              ;; return
     37          

   \                                 In section .text, align 2, keep-with-next
     38          void test7(unsigned a)
     39          {
     40              if (((a & 0xffff) ^ (a >> 16)))
   \                     test7:
   \   00000000   010C               LSRS     R1,R0,#+16
   \   00000002   90EA010F           TEQ      R0,R1
   \   00000006   02D0               BEQ.N    ??test7_0
     41                  beep = 1;
   \   00000008   ....               LDR.N    R0,??DataTable7 ;; beep
   \   0000000A   0121               MOVS     R1,#+1
   \   0000000C   0160               STR      R1,[R0, #+0]
     42          }
   \                     ??test7_0:
   \   0000000E   7047               BX       LR              ;; return
     43          

   \                                 In section .text, align 2, keep-with-next
     44          void test8(unsigned a)
     45          {
     46              if (((a & 0xffff) ^ (a >> 1)))
   \                     test8:
   \   00000000   81B2               UXTH     R1,R0
   \   00000002   91EA500F           TEQ      R1,R0, LSR #+1
   \   00000006   02D0               BEQ.N    ??test8_0
     47                  beep = 1;
   \   00000008   ....               LDR.N    R0,??DataTable7 ;; beep
   \   0000000A   0121               MOVS     R1,#+1
   \   0000000C   0160               STR      R1,[R0, #+0]
     48          }
   \                     ??test8_0:
   \   0000000E   7047               BX       LR              ;; return
     49          

   \                                 In section .text, align 2, keep-with-next
     50          void test9(unsigned a, unsigned b)
     51          {
     52              if (((a & 0xffff) ^ (b >> 1)))
   \                     test9:
   \   00000000   80B2               UXTH     R0,R0
   \   00000002   90EA510F           TEQ      R0,R1, LSR #+1
   \   00000006   02D0               BEQ.N    ??test9_0
     53                  beep = 1;
   \   00000008   ....               LDR.N    R0,??DataTable7 ;; beep
   \   0000000A   0121               MOVS     R1,#+1
   \   0000000C   0160               STR      R1,[R0, #+0]
     54          }
   \                     ??test9_0:
   \   0000000E   7047               BX       LR              ;; return

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


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

Учитывая, что у меня trial, писать в IAR бесполезно,

а с моим знанием английского ещё и безсмысленно.

 

Извиняюсь за оффтопик, но например с KEIL я отправил багрепорт в их техподдержку (в заявке S/N продукта = EVALUATION) на своём корявом английском - так ничего, прислали DLL'ку с пофиксенным багом :) Они ведь тоже люди ;)

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


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

действительно с XORом какой то глюк! При проверке на 0

...

Все эти функции кроме 3, 8, 9

компилируются с ошибкой!

...

Фундаментальный подход. Внушает.

Убедился - не в моих руках дело.

Сношу 5.4 и жду 5.5.

 

Спасибо всем, кто откликнулся.

KRS - персональное "БОЛЬШОЕ СПАСИБО".

 

Мне кажется, это серьезная проблема для IAR. Странно, если они о ней ещё не знают.

После скачивания Evalution на мыло пришло какое-то сообщение от IAR,

можно в ответ послать им письмо с примерами от KRS (если KRS не возражает).

 

Удачи всем.

Изменено пользователем Ytrnj

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


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

Никому не приходило в голову, что 16-ричная константа 0xffffffff может быть знаково расширена до 0xffffffffffffffff?

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


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

Никому не приходило в голову, что 16-ричная константа 0xffffffff может быть знаково расширена до 0xffffffffffffffff?
А почему она должна быть расширена? Она без модификатора, значит int. Int у ARM 32-битный.

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


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

А почему она должна быть расширена? Она без модификатора, значит int. Int у ARM 32-битный.

Это проверено или из области предположений (надо сказать, логичных)?

Что в этом случае говорит стандарт?

К сожалению, у меня сейчас не установлен IAR, чтобы проверить 0xffffffffUL.

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


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

Никому не приходило в голову, что 16-ричная константа 0xffffffff может быть знаково расширена до 0xffffffffffffffff?

Это почему может быть? такие константы по стандарту unsigned ( если тип int 16 битный) а если 32 битный то без разницы.

К тому же как видно по операции присваивания этого выражения, никакого расширения знака не происходит!

Глюк именно с XORом с проверкой на 0. Может быть ноги растут с 16 разрядной платформы - компилер считатет что старшие 16 бит и так 0.

Изменено пользователем KRS

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


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

Проверяли только XOR или другие операции тоже?

Другие вроде ок! Да и с XOR ок, только проверка на 0 глючит!

А такой код

 if ((a ^ (a >> 16)) & 0xffff)
    return (a ^ (a >> 16)) & 0xffff;

вообще смешно компилируется!

Проверка остается кривой, потом выражение почти заново считается для возврата.

 

      1          unsigned test(unsigned a) {
      2           if ((a ^ (a >> 16)) & 0xffff)
   \                     test:
   \   00000000   010C               LSRS     R1,R0,#+16
   \   00000002   90EA010F           TEQ      R0,R1
   \   00000006   02D0               BEQ.N    ??test_0
      3              return (a ^ (a >> 16)) & 0xffff;
   \   00000008   4840               EORS     R0,R1,R0
   \   0000000A   80B2               UXTH     R0,R0
   \   0000000C   7047               BX       LR
      4           return 1;
   \                     ??test_0:
   \   0000000E   0120               MOVS     R0,#+1
   \   00000010   7047               BX       LR              ;; return
      5          }

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


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

Это проверено или из области предположений (надо сказать, логичных)?
Проверено что? Константа без модификатора согласно стандарта считается int. Int у ARM 32-битный точно.

post-17095-1263900462_thumb.jpg

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


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

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

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

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

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

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

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

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

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

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