Подтвердить что ты не робот

Выключение оптимизации для конкретной функции в gcc 4.2.2

Можно ли отключить оптимизацию определенной функции? У моего друга проблема, что gcc-оптимизация делает некоторые (неизвестные мне) μ-controller-code, не работают. Мы знаем, какие функции есть, но мы не имеем понятия о самом коде, поэтому самым простым и безопасным способом, вероятно, было бы просто отключить его для всей функции.

Печально http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html показывает, что существует атрибут/прагма оптимизатора функции, но для него требуется gcc 4.4, которого у нас нет.

заблаговременно

4b9b3361

Ответ 1

Если прагма не сработает для вас, попробуйте разбить функцию в свой собственный файл и затем скомпилируйте этот файл без установленного флага оптимизации.

Ответ 2

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

Одна из наиболее распространенных ошибок, возникающих при включении оптимизации с помощью gcc, связана со строгим псевдонимом. Убедитесь, что все предупреждения включены, и посмотрите, есть ли у вас предупреждения, которые могут помочь вам понять, в чем проблема. Если вы не можете понять это, попробуйте уменьшить проблему до небольшой, полной программы и разместите ее здесь.

Ответ 3

Ответы до сих пор игнорировали ключевые слова в исходном вопросе, которые представляют собой "код микроконтроллера". Очень часто при написании такого кода с отключением оптимизация - агрессивные оптимизаторы будут "оптимизировать" все заявления, чьи побочным эффектом является управление контроллером. Это другой мир от применения кодирование. Для приложения в обычном пространстве программирования я пришел сюда, глядя для той же информации, чтобы избежать рутины для суммирования Кахана (см. wikipedia) оптимизированный в ничто. Поэтому не будем предполагать, что изменение уровня оптимизации генерация разного поведения программы автоматически является признаком плохого кода. Ошибки могут быть устранены с помощью умножающего ключевого слова умным образом, а в некоторых случаях необходимо создать фактический язык ассемблера и проверить его. (Я считаю, это все еще можно сделать с ключом -S на gcc). Помните, что C предназначен для своего рода портативный ассемблер, а не своего рода COBOL.

Dave

Ответ 4

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

Как отмечали другие, скорее всего, виновником является оптимизация в отношении 'strict aliasing'. Хотя в конечном итоге вы, вероятно, должны исправить этот код, в краткосрочной перспективе вы можете играть с добавлением "-fno-strict-aliasing" в вашу командную строку. При -O2 и выше компилятор делает определенные предположения о взаимодействиях между указателями. Добавление этого параметра указывает на то, что он не делает эти предположения.

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

Ответ 5

Я не могу сказать наверняка, но, насколько мне известно, такой возможности нет. Однако оптимизация никогда не должна изменять семантику четко определенного кода. Единственное, что может случиться здесь, это то, что переменная встраивается или изменяется порядок чтения/записи.

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

Ответ 6

Я знаю, что это старый пост. Страница GCC, которую дает OP, фактически говорит: Чтобы избежать повторения таких вызовов, установите asm (""); в функции. Наверное, это простой способ. Просто прекратите это, надейтесь, что он может помочь другие люди, как я.

Ответ 7

Для людей, которые все еще используют устаревшую версию gcc: Более новая версия gcc решает эту проблему. Я успешно использовал это в gcc-4.5.1. Гудлак.