Отключение оптимизации для определенной функции в gcc 4.2.2 - PullRequest
13 голосов
/ 27 декабря 2008

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

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

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

Ответы [ 7 ]

12 голосов
/ 27 декабря 2008

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

7 голосов
/ 27 декабря 2008

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

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

5 голосов
/ 06 августа 2009

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

Dave

5 голосов
/ 28 декабря 2008

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

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

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

3 голосов
/ 17 июня 2010

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

3 голосов
/ 27 декабря 2008

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

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

2 голосов
/ 16 апреля 2011

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

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