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

Оптимизация ломает проект.

6 minutes ago, VladislavS said:

Выявили? Значит обязаны учитывать. 

Первоначально-то говорили об этом

18 hours ago, VladislavS said:

Правильный код никакой уровень оптимизации сломать не может!

Код правильный: что Си/Си++, что машинный. И как вы напишите код, который заставит компилятор выдать определённую последовательность машинных команд? Ну, например, какая разница между этим

mov r0, 0xaa55
mov r1, 0x55aa

и этим

mov r1, 0x55aa
mov r0, 0xaa55

, если дальше эти регистры просто используются? Но железо реагирует по-разному. Так как объяснить это компилятору?

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


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

58 минут назад, haker_fox сказал:

Но железо реагирует по-разному.

Не верю.

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


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

4 minutes ago, Сергей Борщ said:

Не верю.

Станиславский?:blum: Пример, естественно, утрированный. Я не могу найти топик, где проблема была освещена более подробно.

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


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

2 hours ago, haker_fox said:

Станиславский?:blum: Пример, естественно, утрированный. Я не могу найти топик, где проблема была освещена более подробно.

У меня такое было.
Есть такая фишка в компиляторах под ARM-ы как длинное сохранение контекста,
Т.е. когда компилятор много регистров за одну команду в стек помещает. 
Но это задерживает реакцию на прерывания.  
Поэтому обычно я всегда разрешал только короткие сохранения, а тут случайно получилось длинное. В той же самой процедуре которая всегда работала железно.
И понеслось. Это был челендж где-то на месяц поисков. 
Самое скверное что трабл действительно зависел от содержимого  этих регистров и их последовательности в цепочке сохранения, и проявлялся не всегда.   
Там проблема была в таймингах DDRAM.   Недаром тесты внешней памяти такие сложные. 

Еще можно посмотреть список аппаратных траблов найденных мной буквально за несколько месяцев освоения Kinetis - https://electronix.ru/forum/index.php?app=forums&module=forums&controller=topic&id=139690

 

 

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


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

6 hours ago, AlexandrY said:

У меня такое было.

Уф, класс! Спасибо, что поделились конкретным случаем) А то помню,что где-то было, а найти -никак(((

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


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

3 часа назад, haker_fox сказал:

Уф, класс! Спасибо, что поделились конкретным случаем) А то помню,что где-то было, а найти -никак(((

Осталось понять, при чём тут уровень оптимизации :)

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


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

58 minutes ago, AHTOXA said:

Осталось понять, при чём тут уровень оптимизации :)

Вы шутите, с вашим-то опытом?:blum:

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


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

1 час назад, AHTOXA сказал:

Осталось понять, при чём тут уровень оптимизации :)

Уровень оптимизации тут не при чём. При чём тут кривое построение архитектуры проекта, при котором его работа рушится от обычной команды. Разработчик изначально должен быть предусмотреть задержки входов в прерывание вызванные обычными командами.

А ведь в M4 и выше есть ещё FPU, а там регистров ещё больше....  :russian_ru:

 

PS: Хотя со стороны компилятора очень даже неплохо было бы иметь ключ для ограничения количества одновременно сохраняемых регистров в коде генерируемом компилятором.

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


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

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.

 

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


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

4 минуты назад, SSerge сказал:

Насколько помню, инструкции LDM и STM у АРМ-ов сделаны прерываемыми.

Зато сохранение/восстановление контекста при входе/выходе в/из ISR - непрерываемые.

Косяк AlexandrY был в том, что он стек (в который происходит сохранение контекста) поместил в DRAM.

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


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

Пора, однако, вернуться к проблемам нашего ТС.

В 25.07.2019 в 15:42, jenya7 сказал:

Вобщем то любой проект который я компилирую с уровнем оптимизации High перестает работать.

Я могу предложить только один способ, довольно болезненный на первых порах.

С самого начала поставить высокий уровень оптимизации и писать так, чтобы работало.

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


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

4 часа назад, haker_fox сказал:

Вы шутите, с вашим-то опытом?:blum:

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

(Да и вообще он что-то темнит. Длинные LDM/STM - прерываемые, и не могут "задерживать реакцию на прерывания").

И ещё раз повторю: если включение оптимизации ломает работу программы, то практически в 100% случаев виноват программист, а не компилятор.

Либо программист делает задержки на цикле по не-volatile переменной, либо работа его программы зависит от таймингов выполнения участков программы. Естественно, тайминги меняются при включении оптимизации, она для этого и сделана!

 

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


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

3 hours ago, AHTOXA said:

и вы высказались в том духе, что это и есть пример некорректной работы оптимизации.

Перечитал ещё раз. Действительно, выходит, что так. Прошу простить, я поспешил, отвечая на сообщение @AlexandrY. Это не тот случай, я согласен.

3 hours ago, AHTOXA said:

то практически в 100% случаев виноват программист, а не компилятор.

А железо? Я имею в виду схемотехнику МК. Я точно помню, что был подобный случай на форуме. Они же сложные ,эти современные микроконтроллеры. Теоретически же может быть такая ситуация.

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


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

2 часа назад, haker_fox сказал:

А железо? Я имею в виду схемотехнику МК.

Вы имеете в виду, что включение оптимизации может выявить какие-то недочёты в схемотехнике? Это запросто. Поэтому я всегда пишу сразу с включённой оптимизацией.

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


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

6 hours ago, AHTOXA said:

(Да и вообще он что-то темнит. Длинные LDM/STM - прерываемые, и не могут "задерживать реакцию на прерывания").

Речь шла об ARM9 в i.MX

1 hour ago, AHTOXA said:

Вы имеете в виду, что включение оптимизации может выявить какие-то недочёты в схемотехнике? Это запросто. Поэтому я всегда пишу сразу с включённой оптимизацией.

Не надо писать с "включенной оптимизацией" . Быстро устанете. :biggrin:
А вот компилировать с полной и самой жесткой оптимизацией стоит. 
 

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


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

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

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

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

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

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

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

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

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

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