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

Что делать если большой проект перестает работать при оптимизации?

В 20.07.2022 в 18:24, Димон Безпарольный сказал:

Любая оптимизация (О1-О3) делает проект глючным. Есть какой - нибудь подход чтобы выявить эти глюки?

Обычно это означает проблему в стиле написания кода - один или несколько используемых приемов имеют потенциальные угрозы  глючности. Теоретически может помочь статический анализатор кода по MISRA C который обругает потенциально проблемные места которые к подобному(и не только) могут приводить.

ЗЫ. К примеру, макросы без скобок -  просто упрашивают получать в некоторых местах трудноуловимую хрень.

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


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

On 7/21/2022 at 7:55 PM, aaarrr said:

Отличное "решение", да.

  

Ну это был юморной стёб )))   Но факт : после перехода на GCC, я перестал получать эту проблему как в новых , так и в старых проектах.  Что-же там кейловцы всё-таки сделали?

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


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

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

Но факт: после перехода на GCC, я перестал получать эту проблему как в новых , так и в старых проектах...

Какую "проблему"? Я много лет пользуюсь кейлом, прошивки тестирую под разными оптимизациями, проблем компилятора в этом плане не замечал никогда. Проблемы всегда были в коде. Не надо наводить смуту на кейл, у него очень хороший компилятор. Естественно, баги есть, но где их нет? Кроме того, компилятор постоянно обновляется, баги фиксят, все развивается в нормальном направлении.

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


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

14 часов назад, artemkad сказал:

Обычно это означает проблему в стиле написания кода - один или несколько используемых приемов имеют потенциальные угрозы  глючности.

Стиль тут по-моему не причем. Тут конкретный случай - ожидание сброса флага 'Busy' у модуля QUAD_SPI. Чтобы убедиться в неправильной работе тут - достаточно ТС вместо функции 

QUAD_SPI_WaitBusy();

поставить небольшую задержку. И если при разных оптимизациях будет работать, то дело тут именно.

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


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

On 7/21/2022 at 4:28 PM, Димон Безпарольный said:

До этого еще не дошел. Вечером посмотрю ассемблерный код.

Ассемблер тут ни причем, в отладчике посмотрите:

1. какие строки (С, С++) игнорируются (на них нельзя поставить брекпойты), в кейле "рабочие" строки выделены слева цветом

часть кода кейл выкидывает, т.к. использует тоже самое из др. частей (оптимизирует)) )

 

2. протрассировать подозрительные места, где как подозреваете может быть проблемма, мне как правило это помогает

 

3. худший вариант, когда код "срывается" в х.з. куда, но 

по своему опыту скажу, что сам виноват был (грязно писал код в этих местах и путал линковщик) 

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

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

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


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

On 7/22/2022 at 3:40 PM, Arlleex said:

Какую "проблему"?

 

Программа вешалась ещё до входа в main( ).

 

Если поменять местами строчки кода внутри main( ) или сделать для main #pragma optimize -O0  - переставала вешаться.

Может HAL, может SPL или кало-куб такой эффект давали - Х.З.  Но факт: как только я слез с этого всего и перешёл на GCC, проблемы ушли.

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

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


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

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

Но факт: как только я слез с этого всего и перешёл на GCC, проблемы ушли.

Ваши логические взаимосвязи больше похожи на проявление когнитивного "эффекта техасского стрелка".
Потому что Вы нашли якобы логически обоснованную взаимосвязь там, где ее на самом деле нет. И вот это

Цитата

Может HAL, может SPL или кало-куб такой эффект давали - Х.З.

лишь доказывает мою точку зрения. Вы просто, видимо, не разобрались тогда до конца.

Я, разумеется, не вкладываю в свои слова какой-то оскорбительный потенциал:wink:

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


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

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

. . . Программа вешалась ещё до входа в main( ).. . . 

Намек на "невиноватая я !!!". :biggrin:  Если не CPP, то да.  Если CPP, то конструкторы отрабатывают до main  (и свои, и "чужие")

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


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

54 минуты назад, k155la3 сказал:

Если не CPP, то да.  Если CPP, то конструкторы отрабатывают до main  (и свои, и "чужие")

Ну, компилятор кейла позволяет вызывать пользовательские функции до main() автоматически даже из исходника на Си

#define FUNC_CALL_PRIORITY 101

__attribute__((constructor(FUNC_CALL_PRIORITY)))
void func(void) {
  ...
}


Не знаю, есть ли такое в GCC, но думаю, что есть.

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


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

On 7/22/2022 at 2:15 PM, Arlleex said:

Не знаю, есть ли такое в GCC, но думаю, что есть.

В GCC пишешь свой файл startup и из него вызываешь что хочешь хоть до main, хоть после.

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


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

44 минуты назад, dimka76 сказал:

В GCC пишешь свой файл startup и из него вызываешь что хочешь хоть до main, хоть после.

Можно подумать это прям "фишка" GCC. Да везде так можно, а как я предложил - нет.

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


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

45 минут назад, Arlleex сказал:

а как я предложил - нет

Ну, так gcc тоже умеет. Но зачем, если есть Си с плюсами (вопрос риторический)?

 

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


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

On 7/22/2022 at 4:24 PM, Сергей Борщ said:

Но зачем

Это когда сильно хочется что-то вызвать до main, а цеплять к проекту внешний startup файл сильно не хочется )

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


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

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

Это когда сильно хочется что-то вызвать до main, а цеплять к проекту внешний startup файл сильно не хочется )

Сергей имел ввиду тот факт, что в плюсах конструкторы глобальных объектов вызываются до main() без вообще каких-либо дополнительных телодвижений.

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


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

On 7/22/2022 at 6:30 PM, Arlleex said:

Сергей имел ввиду тот факт, что в плюсах конструкторы глобальных объектов вызываются до main() без вообще каких-либо дополнительных телодвижений.

Конечно, Все телодвижения уже записаны в startup

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


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

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

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

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

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

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

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

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

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

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