jan 0 18 января, 2010 Опубликовано 18 января, 2010 · Жалоба Привет всем! Неожиданно проявилась проблема с 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 в топку или я чего-то не не понимаю? Заранее благодарен. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jan 0 18 января, 2010 Опубликовано 18 января, 2010 (изменено) · Жалоба Доброго времени суток. Посмотрел в старой копии, что генерировал 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. Удачи! Изменено 18 января, 2010 пользователем Ytrnj Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 18 января, 2010 Опубликовано 18 января, 2010 · Жалоба Такого рода конструкций в проге куча. "Такого рода конструкций" у меня ни одной - можно я выброшу 5.3 компилятор??? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 0 18 января, 2010 Опубликовано 18 января, 2010 (изменено) · Жалоба А вы уверены в правильности своего кода? Дело в том что для INT32 операция сдвига вправо расширяет знак! т.е. если ks = 0x80008000 то условие if((0xFFFF&kc)==(kc>>16)) не выполнится 0x8000 != 0xFFFF8000 --------------- Не все ок! не заметил букву U в конце типа! Обычно ее в начале ставят Изменено 18 января, 2010 пользователем KRS Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 123 18 января, 2010 Опубликовано 18 января, 2010 · Жалоба Дело в том что для INT32 операция сдвига вправо расширяет знак!Согласно стандарту результат операции сдвига вправа отрицательного числа вообще отдан на откуп компилятору. Сам был немало удивлен. Я тоже подумал об этой причине, но в последний момент успел заметить U. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 0 18 января, 2010 Опубликовано 18 января, 2010 · Жалоба действительно с 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RabidRabbit 0 19 января, 2010 Опубликовано 19 января, 2010 · Жалоба Учитывая, что у меня trial, писать в IAR бесполезно, а с моим знанием английского ещё и безсмысленно. Извиняюсь за оффтопик, но например с KEIL я отправил багрепорт в их техподдержку (в заявке S/N продукта = EVALUATION) на своём корявом английском - так ничего, прислали DLL'ку с пофиксенным багом :) Они ведь тоже люди ;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jan 0 19 января, 2010 Опубликовано 19 января, 2010 (изменено) · Жалоба действительно с XORом какой то глюк! При проверке на 0 ... Все эти функции кроме 3, 8, 9 компилируются с ошибкой! ... Фундаментальный подход. Внушает. Убедился - не в моих руках дело. Сношу 5.4 и жду 5.5. Спасибо всем, кто откликнулся. KRS - персональное "БОЛЬШОЕ СПАСИБО". Мне кажется, это серьезная проблема для IAR. Странно, если они о ней ещё не знают. После скачивания Evalution на мыло пришло какое-то сообщение от IAR, можно в ответ послать им письмо с примерами от KRS (если KRS не возражает). Удачи всем. Изменено 19 января, 2010 пользователем Ytrnj Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IgorKossak 0 19 января, 2010 Опубликовано 19 января, 2010 · Жалоба Никому не приходило в голову, что 16-ричная константа 0xffffffff может быть знаково расширена до 0xffffffffffffffff? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 123 19 января, 2010 Опубликовано 19 января, 2010 · Жалоба Никому не приходило в голову, что 16-ричная константа 0xffffffff может быть знаково расширена до 0xffffffffffffffff?А почему она должна быть расширена? Она без модификатора, значит int. Int у ARM 32-битный. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IgorKossak 0 19 января, 2010 Опубликовано 19 января, 2010 · Жалоба А почему она должна быть расширена? Она без модификатора, значит int. Int у ARM 32-битный. Это проверено или из области предположений (надо сказать, логичных)? Что в этом случае говорит стандарт? К сожалению, у меня сейчас не установлен IAR, чтобы проверить 0xffffffffUL. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 0 19 января, 2010 Опубликовано 19 января, 2010 (изменено) · Жалоба Никому не приходило в голову, что 16-ричная константа 0xffffffff может быть знаково расширена до 0xffffffffffffffff? Это почему может быть? такие константы по стандарту unsigned ( если тип int 16 битный) а если 32 битный то без разницы. К тому же как видно по операции присваивания этого выражения, никакого расширения знака не происходит! Глюк именно с XORом с проверкой на 0. Может быть ноги растут с 16 разрядной платформы - компилер считатет что старшие 16 бит и так 0. Изменено 19 января, 2010 пользователем KRS Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IgorKossak 0 19 января, 2010 Опубликовано 19 января, 2010 · Жалоба Проверяли только XOR или другие операции тоже? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 0 19 января, 2010 Опубликовано 19 января, 2010 · Жалоба Проверяли только 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 } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 123 19 января, 2010 Опубликовано 19 января, 2010 · Жалоба Это проверено или из области предположений (надо сказать, логичных)?Проверено что? Константа без модификатора согласно стандарта считается int. Int у ARM 32-битный точно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться