-
- 1. Кто герой? 2. Может, с типами/диапазонами все-таки не то? - Vladimir Ljaschko(11.05.2011 13:00)
- 1. IAR Coldfire. 2. Проверил тщательно: прошёл по шагам в дизассемблере, проверил все промежуточные результаты. SciFi(111 знак., 11.05.2011 13:08)
- В ЙАР AVR сталкивались с "мутными" ситуациями. В некритичных по быстродействию местах просто разбивали сложную формулу на части, вводя промежуточные переменные, после чего работало. - AU08(11.05.2011 13:54)
- по-возможности всегда стараюсь разбивать на части, и вводить промежуточные переменные с минимально возможной областью видимости - koyodza(11.05.2011 15:07)
- Понятно, как этот глюк обойти. Просто этот компилятор ещё генерит неверный код для md5.c на уровне оптимизации high, favor speed. Вот и получается, что засада может быть где угодно. Зато код весьма компактный выдаёт :-) - SciFi(11.05.2011 15:12)
- это похоже самая беда у IAR`а - периодическая выдача нерабочего кода на максимальных уровнях оптимизации. - Mahagam(11.05.2011 15:39)
- Это всеобщая беда. PIC-овые компиляторы особливо приучали к отказу от сложных выражений в одной строке. - ASDFS(11.05.2011 15:55)
- ну в 90% случаев при внимательном разборе виноват сам программист: компилятору ещё нужно уметь объяснить, что можно оптимизировать koyodza(304 знак., 11.05.2011 15:45)
- Оно да, но если он выкидывает кусок кода - предупреждение бы не помешало. А volatile тоже та еще штука, требуестя в одном-двух местах, а не оптимизируется во всем коде, приходится в другие переменные перекидывать. Вот бы директивой её сделали, Kit(52 знак., 11.05.2011 17:02)
- предупреждения, когда выкидывается кусок кода, можно использовать только когда программа из десяти строк :=) koyodza(158 знак., 11.05.2011 23:42)
- Не вижу связи с размером. Если действие в программе написано, а в код не пошло, тут по-моему однозначно что-то не так. Причем не соптимизировалось, а именно совсем не пошло. От этой функции, например, останется только return: Kit(114 знак., 12.05.2011 00:35)
- связь с размером в том, что в проекте даже на пару тысяч строк варнинг о выбрасывании куска просто сведёт с ума - koyodza(12.05.2011 16:20)
- Такое весьма часто случается при использовании сравнительно универсальных #define и констант при их вызове AlexBi(65 знак., 12.05.2011 09:59)
- Какая ужасная функция. Я бы её тоже заоптимизировал в ноль. И штраф автору назначил, с отбыванием в колонии строгого режима :-) Смотреть надо не на код, а на результат выполнения программы. - SciFi(12.05.2011 00:38)
- А если это получилось в результате ошибки, тоже в колонию?:) - Kit(12.05.2011 01:03)
- В результате какой ошибки? Что хотелось сделать то? - Vladimir Ljaschko(12.05.2011 09:37)
- А если это получилось в результате ошибки, тоже в колонию?:) - Kit(12.05.2011 01:03)
- Не вижу связи с размером. Если действие в программе написано, а в код не пошло, тут по-моему однозначно что-то не так. Причем не соптимизировалось, а именно совсем не пошло. От этой функции, например, останется только return: Kit(114 знак., 12.05.2011 00:35)
- А не утоните в предупреждениях? Завели временную переменную, а компилятор ее выбросил - получи предупреждение. И как вы представляете себе volatile директивой? Cepгeй Бopщ(114 знак., 11.05.2011 17:10)
- Да, оптимизатор иногда задалбывает вместе с предупреждениями. Особенно "любимая" ситуация - нужно прочитать регистр периферии "в никуда". И начинается... То просто предупреждение, что переменная не используется после присвоения, то еще хуже - vmp(181 знак., 12.05.2011 17:39)
- Я написал "кусок кода", очевидно, что на a=b предупреждений дывать не надо. У меня и написано, что "приходится в другие переменные перекидывать", только это неудобно. А директиву я себе представляю очень просто: Kit(72 знак., 11.05.2011 22:34)
- То есть, в этом месте переменная XXX может быть изменена вне данного кода а в других местах такое не возможно? - Vallav(12.05.2011 08:32)
- Именно так - Kit(12.05.2011 12:31)
- Возможно, что-то такое может сработать: SciFi(163 знак., 12.05.2011 15:05)
- Так чем вариант не устраивает - ввести временную переменную там, где нужна оптимизированная обработка значения XXX, Vallav(398 знак., 12.05.2011 14:56)
- Именно так - Kit(12.05.2011 12:31)
- Замечательно. И будет оно читать ячейку XXX до потери сознания, ибо в том месте, где XXX надо было записать вы обрамить забудите. Cepгeй Бopщ(298 знак., 12.05.2011 02:26)
- лучше временными переменными оперировать поактивнее koyodza(254 знак., 11.05.2011 23:00)
- И как у Вас xx может измениться вне данного кода во время исполнения while? - Vallav(12.05.2011 08:37)
- В обработчике прерывания - Kit(12.05.2011 12:33)
- А адрес xx обработчик прерывания как узнает? Vallav(113 знак., 12.05.2011 14:46)
- В обработчике прерывания - Kit(12.05.2011 12:33)
- в данном случае xx - локальная и смысла в volatile не вижу. Хотя вот volatile int *xx=&x, может и интересно, надо подумать. Kit(39 знак., 11.05.2011 23:26)
- смысл локальной volatile в том, что доступ к ней не будет оптимизироваться koyodza(180 знак., 11.05.2011 23:38)
- Это понятно, только зачем бы оно могло понадобиться, чтобы кусок кода не снесло? Так IAR на это уже не ведётся:) Kit(435 знак., 12.05.2011 00:39)
- "Можно пользоваться временными переменными, но неудобно" - ага, а прагмы в тех же местах лепить по две удобнее. - Cepгeй Бopщ(12.05.2011 02:29)
- while отличается от for тем, что кроме while() может быть еще и do {...} while(); - rezident(12.05.2011 00:43)
- Так и думал, что напомните:) Kit(70 знак., 12.05.2011 00:53)
- А зачем выдумывать лишние сущности? for всегда с пред-проверкой условия. Так в стандарте C99 указано. rezident(165 знак., 12.05.2011 01:14 - 01:17)
- Это гипотетически:) Kit(219 знак., 12.05.2011 02:41)
- А зачем выдумывать лишние сущности? for всегда с пред-проверкой условия. Так в стандарте C99 указано. rezident(165 знак., 12.05.2011 01:14 - 01:17)
- Так и думал, что напомните:) Kit(70 знак., 12.05.2011 00:53)
- Это понятно, только зачем бы оно могло понадобиться, чтобы кусок кода не снесло? Так IAR на это уже не ведётся:) Kit(435 знак., 12.05.2011 00:39)
- смысл локальной volatile в том, что доступ к ней не будет оптимизироваться koyodza(180 знак., 11.05.2011 23:38)
- И как у Вас xx может измениться вне данного кода во время исполнения while? - Vallav(12.05.2011 08:37)
- Вообще-то в том же IAR есть #pragma optimize=[goal][level][no_optimization...] - rezident(11.05.2011 22:47)
- Я в курсе, но полностью отключить оптимизацию куску кода для того, чтобы одна переменная вела себя правильно, это совсем не то, чего хотелось бы. - Kit(11.05.2011 23:00)
- Язык программирования отличается от человеческих языков только тем, что результатом компиляции с него является машинный код для процессора. Но, как и в случае общения между людьми, компилятору иногда тоже нужны дополнительные пояснения: что именно rezident(114 знак., 11.05.2011 23:07)
- Не вижу, где-бы это я противоречил столь очевидной истине. Я только говорю, что слов для объяснения не хватает:) - Kit(11.05.2011 23:28)
- возможно, Вы просто не все слова выучили ;=) koyodza(99 знак., 11.05.2011 23:39)
- Возможно:) - Kit(12.05.2011 01:02)
- возможно, Вы просто не все слова выучили ;=) koyodza(99 знак., 11.05.2011 23:39)
- Не вижу, где-бы это я противоречил столь очевидной истине. Я только говорю, что слов для объяснения не хватает:) - Kit(11.05.2011 23:28)
- Язык программирования отличается от человеческих языков только тем, что результатом компиляции с него является машинный код для процессора. Но, как и в случае общения между людьми, компилятору иногда тоже нужны дополнительные пояснения: что именно rezident(114 знак., 11.05.2011 23:07)
- Я в курсе, но полностью отключить оптимизацию куску кода для того, чтобы одна переменная вела себя правильно, это совсем не то, чего хотелось бы. - Kit(11.05.2011 23:00)
- То есть, в этом месте переменная XXX может быть изменена вне данного кода а в других местах такое не возможно? - Vallav(12.05.2011 08:32)
- +1. Я так и делаю. Кстати, такой способ позволяет наоборот избежать "лишних" предупреждений в том случае, когда в операции используются больше одной volatile-переменных. При использовании двух или большего количества volatile, например, в rezident(105 знак., 11.05.2011 17:24)
- предупреждения, когда выкидывается кусок кода, можно использовать только когда программа из десяти строк :=) koyodza(158 знак., 11.05.2011 23:42)
- какбы да. но все равно - IAR лидирует по отказам кода. не раз было, что GCC собирает работоспособный код под любой оптимизацией, что по размеру что по скорости, а ИАР на этом же исходнике на максимуме генерит мертвечинку. Mahagam(160 знак., 11.05.2011 15:58)
- Просто этот ваш md5 написан финскими студентами. Нормальный проприеритарный код (где по одной операции на строчку) IAR компилирует нормально. - fk0(11.05.2011 16:05)
- Какие-то странные финские студенты: RSA Data Security, Inc. Created 1991. - SciFi(11.05.2011 16:55)
- То есть сразу признаёмся что парсер исходников у ИАРа - какашка? ))) - Mahagam(11.05.2011 16:06)
- Просто этот ваш md5 написан финскими студентами. Нормальный проприеритарный код (где по одной операции на строчку) IAR компилирует нормально. - fk0(11.05.2011 16:05)
- Оно да, но если он выкидывает кусок кода - предупреждение бы не помешало. А volatile тоже та еще штука, требуестя в одном-двух местах, а не оптимизируется во всем коде, приходится в другие переменные перекидывать. Вот бы директивой её сделали, Kit(52 знак., 11.05.2011 17:02)
- напоминает анекдот про машинисток :=) koyodza(181 знак., 11.05.2011 15:21 - 15:23)
- это похоже самая беда у IAR`а - периодическая выдача нерабочего кода на максимальных уровнях оптимизации. - Mahagam(11.05.2011 15:39)
- Понятно, как этот глюк обойти. Просто этот компилятор ещё генерит неверный код для md5.c на уровне оптимизации high, favor speed. Вот и получается, что засада может быть где угодно. Зато код весьма компактный выдаёт :-) - SciFi(11.05.2011 15:12)
- по-возможности всегда стараюсь разбивать на части, и вводить промежуточные переменные с минимально возможной областью видимости - koyodza(11.05.2011 15:07)
- В ЙАР AVR сталкивались с "мутными" ситуациями. В некритичных по быстродействию местах просто разбивали сложную формулу на части, вводя промежуточные переменные, после чего работало. - AU08(11.05.2011 13:54)
- 1. IAR Coldfire. 2. Проверил тщательно: прошёл по шагам в дизассемблере, проверил все промежуточные результаты. SciFi(111 знак., 11.05.2011 13:08)
- 1. Кто герой? 2. Может, с типами/диапазонами все-таки не то? - Vladimir Ljaschko(11.05.2011 13:00)