| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Микроконтроллеры (MCU) и микропроцессоры (MPU) > [avr-gcc] Как побороть лишнюю оптимизацию? |
| Автор: UniBomb 4.2.2009, 16:51 | ||||
| Добрый день. Столкнулся вот с какой незадачей - компиляция программы происходит так, что часть одной функции как бы выбрасывается из программы. Ошибок в функции нет, но что там говорить, вот эта функция: (функция "как есть", в целях понимания ничего не убирал, надеюсь поймёте)
если упрощённо, то функция делает следующее:
Так вот - вне зависимости от значения во второй и тетий if программа незаходит. Т.е. зачение расчитывается, я его спрашиваю по модбасу, оно соответсвует действительности, но ни один светодиод не загорается и звуковой извещатель всё время молчит. Поэтому я даже не знаю - толи эти if'ы не вошли в готовую программу, либо всё время заходит в последний иф. В живую получить значения выше mdns.mdfl[Pr] у меня нет возможности, поэтому этот if мне не проверить. В процессе отладки я закомментировал расчёты mdns.mdfl[Conc] просто присваивал этой переменной различные значения. Результат тотже (это в принципе неудивительно, тут ещё можно поверить оптимизатору), но если я этой переменной присваивал значение выше чем mdns.mdfl[Pr], то в первый if программа заходит. Из этого я могу сделать вывод, что оптимизации поддались все остальные if'ы. Можно ли это как-нибудь побороть? прочие исходные данные : avr-gcc (WinAVR 20080512) 4.3.0; уровень оптимизации "s" (меньше ставить нельзя, больше смысла нет). |
| Автор: Mazzi 4.2.2009, 17:10 |
| Если ты будешь задавать в программе литералы, то от оптимимзации не избавишься.(наверное Сделай так, помести вызов этой функции в цикл, в цикле на каждом проходе меняй переменные влияющие на ветвления и вызывай эту функцию. А затем проверь что вышло в симуляторе. Удачи! |
| Автор: UniBomb 5.2.2009, 08:52 | ||||
Эта функция и так вызывается циклически - по таймеру. В процесе отладки я менял значения mdns.mdfl[Conc] в симуляторе (AVRStudio) всё было хорошо - я попадал в нужные ветвления и нормально выполнялась работа, а зашиваю в мк и фиг.
Тогда размер пограммы будет превышать память мк и попросту не влезет в него. Вырезать из программы лишнее думаю смысла нет, ибо в этом случае нарушиться чистота эксперемета. Ведь нет пока причин отрицать возможное влияние остальных частей программы на эту ситуацию... |
| Автор: UniBomb 9.2.2009, 14:02 |
| Всем спасибо за внимание, проблема разрешилась. Я немного упростил эту функцию и часть её вынес в другую. Всё заработало, хотя о причинах этого глюка я до сих пор могу только догадываться. |
| Автор: Cr@$h 9.2.2009, 14:11 | ||||
Проверял?
Если есть возможность, можно сделать профилирование и посмотреть, какие ветки сколько раз использовались.. |
| Автор: OlegIT 9.2.2009, 15:18 |
| Обратите внимание на volatile. Сталкивался с такой проблемой, мне помогло. |
| Автор: UniBomb 9.2.2009, 21:40 |
Да, компилятор выдаёт ошибку, что размер программы превышает 8кб и дальше компилироваться уже нет смысла. Чего? о_О Обратил... |
| Автор: Cr@$h 9.2.2009, 23:35 | ||
Хотя, раз с размером проблемы... Тогда всё дело в оптимизациях этого размера. Примудрости из разряда style-of-art. |