haker_fox 61 26 июля, 2019 Опубликовано 26 июля, 2019 · Жалоба 6 minutes ago, VladislavS said: Выявили? Значит обязаны учитывать. Первоначально-то говорили об этом 18 hours ago, VladislavS said: Правильный код никакой уровень оптимизации сломать не может! Код правильный: что Си/Си++, что машинный. И как вы напишите код, который заставит компилятор выдать определённую последовательность машинных команд? Ну, например, какая разница между этим mov r0, 0xaa55 mov r1, 0x55aa и этим mov r1, 0x55aa mov r0, 0xaa55 , если дальше эти регистры просто используются? Но железо реагирует по-разному. Так как объяснить это компилятору? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 26 июля, 2019 Опубликовано 26 июля, 2019 · Жалоба 58 минут назад, haker_fox сказал: Но железо реагирует по-разному. Не верю. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 26 июля, 2019 Опубликовано 26 июля, 2019 · Жалоба 4 minutes ago, Сергей Борщ said: Не верю. Станиславский? Пример, естественно, утрированный. Я не могу найти топик, где проблема была освещена более подробно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexandrY 3 26 июля, 2019 Опубликовано 26 июля, 2019 · Жалоба 2 hours ago, haker_fox said: Станиславский? Пример, естественно, утрированный. Я не могу найти топик, где проблема была освещена более подробно. У меня такое было. Есть такая фишка в компиляторах под ARM-ы как длинное сохранение контекста, Т.е. когда компилятор много регистров за одну команду в стек помещает. Но это задерживает реакцию на прерывания. Поэтому обычно я всегда разрешал только короткие сохранения, а тут случайно получилось длинное. В той же самой процедуре которая всегда работала железно. И понеслось. Это был челендж где-то на месяц поисков. Самое скверное что трабл действительно зависел от содержимого этих регистров и их последовательности в цепочке сохранения, и проявлялся не всегда. Там проблема была в таймингах DDRAM. Недаром тесты внешней памяти такие сложные. Еще можно посмотреть список аппаратных траблов найденных мной буквально за несколько месяцев освоения Kinetis - https://electronix.ru/forum/index.php?app=forums&module=forums&controller=topic&id=139690 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 27 июля, 2019 Опубликовано 27 июля, 2019 · Жалоба 6 hours ago, AlexandrY said: У меня такое было. Уф, класс! Спасибо, что поделились конкретным случаем) А то помню,что где-то было, а найти -никак((( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 27 июля, 2019 Опубликовано 27 июля, 2019 · Жалоба 3 часа назад, haker_fox сказал: Уф, класс! Спасибо, что поделились конкретным случаем) А то помню,что где-то было, а найти -никак((( Осталось понять, при чём тут уровень оптимизации :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 27 июля, 2019 Опубликовано 27 июля, 2019 · Жалоба 58 minutes ago, AHTOXA said: Осталось понять, при чём тут уровень оптимизации :) Вы шутите, с вашим-то опытом? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 27 июля, 2019 Опубликовано 27 июля, 2019 · Жалоба 1 час назад, AHTOXA сказал: Осталось понять, при чём тут уровень оптимизации :) Уровень оптимизации тут не при чём. При чём тут кривое построение архитектуры проекта, при котором его работа рушится от обычной команды. Разработчик изначально должен быть предусмотреть задержки входов в прерывание вызванные обычными командами. А ведь в M4 и выше есть ещё FPU, а там регистров ещё больше.... PS: Хотя со стороны компилятора очень даже неплохо было бы иметь ключ для ограничения количества одновременно сохраняемых регистров в коде генерируемом компилятором. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SSerge 6 27 июля, 2019 Опубликовано 27 июля, 2019 · Жалоба 12 часов назад, AlexandrY сказал: Есть такая фишка в компиляторах под ARM-ы как длинное сохранение контекста, Т.е. когда компилятор много регистров за одну команду в стек помещает. Но это задерживает реакцию на прерывания. Насколько помню, инструкции LDM и STM у АРМ-ов сделаны прерываемыми. Цитата The processor implements the Interruptible-continuable Instruction field. Load multiple (LDM) operations and store multiple (STM) operations are interruptible. The ICI field of the EPSR holds the information required to continue the load or store multiple from the point where the interrupt occurred. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 27 июля, 2019 Опубликовано 27 июля, 2019 · Жалоба 4 минуты назад, SSerge сказал: Насколько помню, инструкции LDM и STM у АРМ-ов сделаны прерываемыми. Зато сохранение/восстановление контекста при входе/выходе в/из ISR - непрерываемые. Косяк AlexandrY был в том, что он стек (в который происходит сохранение контекста) поместил в DRAM. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SSerge 6 27 июля, 2019 Опубликовано 27 июля, 2019 · Жалоба Пора, однако, вернуться к проблемам нашего ТС. В 25.07.2019 в 15:42, jenya7 сказал: Вобщем то любой проект который я компилирую с уровнем оптимизации High перестает работать. Я могу предложить только один способ, довольно болезненный на первых порах. С самого начала поставить высокий уровень оптимизации и писать так, чтобы работало. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 27 июля, 2019 Опубликовано 27 июля, 2019 · Жалоба 4 часа назад, haker_fox сказал: Вы шутите, с вашим-то опытом? Нет, я не шучу. Вы рассказывали, что читали про какой-то случай, когда при включении оптимизации нарушалась работа корректно написанной программы, но не можете его найти. AlexandrY рассказал вам свою интересную историю, и вы высказались в том духе, что это и есть пример некорректной работы оптимизации. Но случай, который описал AlexandrY, совершенно из другой оперы. Просто при включении оптимизации поехали тайминги, и программа стала сбоить. (Да и вообще он что-то темнит. Длинные LDM/STM - прерываемые, и не могут "задерживать реакцию на прерывания"). И ещё раз повторю: если включение оптимизации ломает работу программы, то практически в 100% случаев виноват программист, а не компилятор. Либо программист делает задержки на цикле по не-volatile переменной, либо работа его программы зависит от таймингов выполнения участков программы. Естественно, тайминги меняются при включении оптимизации, она для этого и сделана! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 27 июля, 2019 Опубликовано 27 июля, 2019 · Жалоба 3 hours ago, AHTOXA said: и вы высказались в том духе, что это и есть пример некорректной работы оптимизации. Перечитал ещё раз. Действительно, выходит, что так. Прошу простить, я поспешил, отвечая на сообщение @AlexandrY. Это не тот случай, я согласен. 3 hours ago, AHTOXA said: то практически в 100% случаев виноват программист, а не компилятор. А железо? Я имею в виду схемотехнику МК. Я точно помню, что был подобный случай на форуме. Они же сложные ,эти современные микроконтроллеры. Теоретически же может быть такая ситуация. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 27 июля, 2019 Опубликовано 27 июля, 2019 · Жалоба 2 часа назад, haker_fox сказал: А железо? Я имею в виду схемотехнику МК. Вы имеете в виду, что включение оптимизации может выявить какие-то недочёты в схемотехнике? Это запросто. Поэтому я всегда пишу сразу с включённой оптимизацией. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexandrY 3 27 июля, 2019 Опубликовано 27 июля, 2019 · Жалоба 6 hours ago, AHTOXA said: (Да и вообще он что-то темнит. Длинные LDM/STM - прерываемые, и не могут "задерживать реакцию на прерывания"). Речь шла об ARM9 в i.MX 1 hour ago, AHTOXA said: Вы имеете в виду, что включение оптимизации может выявить какие-то недочёты в схемотехнике? Это запросто. Поэтому я всегда пишу сразу с включённой оптимизацией. Не надо писать с "включенной оптимизацией" . Быстро устанете. А вот компилировать с полной и самой жесткой оптимизацией стоит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться