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

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

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

заранее спасибо

7 ответов

Решение

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

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

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

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

Дейв

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

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

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

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

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

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

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

Другие вопросы по тегам