|
Лучшее - враг хорошего?, Глюки при оптимизации компилятора KEIL |
|
|
|
May 30 2012, 08:30
|
Знающий
   
Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725

|
Привет, коллеги.
Следующая предыстория. Есть работающая, но и далее развиваемая программа на STM32F103RC на собственном железе. В ней много всего: поддержка FlashFS на microSD через SPI и на EEPROM через I2C, комбинированное USB устройство (HID/CDC/MassStorage), два радиомодуля на CC1101, и т.п. В какой-то момент код созрел до такой степени, что устаканившуюся часть его я решил "слить" в библиотеку, чтобы исключить длительные перекомпиляции исходников. Для этого создал новый проект, который собирает библиотеку, а основной проект её включает.
Все пошло. И тут начались неуловимые глюки и странности. Вроде все работает, но иногда файловая система сбоит - например, вдруг носитель якобы не содержит файлов. В некоторых условиях при интенсивном обмене по радиоканалам устройство может сброситься, и т.п. Начинаю скрупулезно сравнивать проекты и вдруг натыкаюсь на факт, что мой "библиотечный" проект имеет в опциях уровень оптимизации "по умолчанию". Так как основной проект собирается с -O0 (пока отлаживаюсь, оптимизация выключена, да и память не вышла вся еще), я включил -O0 и для библиотеки и... всё заработало без проблем.
Возникают вопросы: 1. Какой уровень оптимизации у KEIL по-умолчанию? 2. Глюки программы связаны с ошибками компилятора на высоких уровнях оптимизации? 3. Мой код имеет синтаксические недостатки, которые проявляются лишь при сильной оптимизации (например, нужно ли писать для переменных static volatile или достаточно static)? 4. Можно ли "смешивать" в результирующем коде различные уровни оптимизации? 5. Как откомпилированы в смысле оптимизации библиотеки RL от KEIL?
Каков ваш опыт, коллеги?
Сообщение отредактировал KnightIgor - May 30 2012, 08:32
|
|
|
|
|
 |
Ответов
|
May 31 2012, 13:41
|
Местный
  
Группа: Участник
Сообщений: 218
Регистрация: 24-06-10
Пользователь №: 58 127

|
Цитата Но что там оптимизатор может натворить? А Вы его и спросите. К примеру sprintf(mas,"бла...бла", tmp); при объявленном локальном массиве char mas[10] и включенном оптимизаторе O1 просто не заработал. И передача адреса массива в другую функцию send(char *mas) то же не работало. Помог static.
Сообщение отредактировал vlad_new - May 31 2012, 13:49
|
|
|
|
|
Jun 1 2012, 05:58
|

Частый гость
 
Группа: Свой
Сообщений: 173
Регистрация: 30-11-05
Из: San Francisco
Пользователь №: 11 593

|
Цитата(vlad_new @ May 31 2012, 05:41)  А Вы его и спросите. К примеру sprintf(mas,"бла...бла", tmp); при объявленном локальном массиве char mas[10] и включенном оптимизаторе O1 просто не заработал. И передача адреса массива в другую функцию send(char *mas) то же не работало. Помог static. Уверен, что косяк у вас в коде. Довольно часто использовал подобные конструкции на разных уровнях оптимизации, никогда проблем не было. Думаю, что обьяснение данное выше KnightIgor довольно точно описывает причину происходящего.
|
|
|
|
|
Jun 1 2012, 12:32
|
Местный
  
Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866

|
Цитата(zuy @ Jun 1 2012, 09:58)  Уверен, что косяк у вас в коде. С Кейлом знаком еще по 51 семейству, еще тогда были проблемы с локальными переменными, если их передавать в функции (при чем в свои, а не в sprintf) и не обозвать static. Для arm аналогично, будет время покопаю этот момент.
--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
|
|
|
|
|
Jun 1 2012, 12:42
|
Местный
  
Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866

|
Цитата(aaarrr @ Jun 1 2012, 16:39)  А ничего так, что это два совершенно разных компилятора от разных производителей? Я это к тому, что еще с тех пор взял за правило ставить static у локальных переменных в функциях, если они идут дальше. Цитата(aaarrr) 99.9% "ошибок компилятора" и "багов оптимизатора" - это косяки в коде. Обратному можно верить только при наличии примера в виде код + дизассемблер. Я к этому мнению пришел недавно, намного позже, чем стал ставить static у локальных переменных. =) Поэтому и хочу при наличии времени поиграться именно с дизассемблером.
--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
|
|
|
|
|
Jun 2 2012, 18:36
|
Местный
  
Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866

|
Цитата(_Артём_ @ Jun 1 2012, 17:31)  Очень странная идея. Зачем оно надо?
P.S. volatile не пробовали для локальных? Это хоть не так нелогично. Вы заблуждаетесь, логика присутствует. При static локальная переменная будет жить в глобальной области памяти, а не на стеке. И именно поэтому проблемы исчезали. PS: На работе попробовал по памяти набросать код, который вызывал когда-то проблемы (чтобы осмысленно глянуть в дизассемблер) - в функции локальный массив или указатель передается дальше. Но увы, всё работает, как надо при любой оптимизации. =) Помню, когда в последний раз такое случалось, я перенес аналогичный код в iar'овский компилятор - там без static работало. И т.к. это был не первый случай, то старался больше не рисковать и ставил static у локальных указателей и массивов, если они идут дальше (реентерабельность не требовалась). Прочитав эту тему по диагонали и заметив знакомую проблему, удивился что уважаемый aaarrr очень уверенно говорит, что дело не в компиляторе. Может оно и так, но помимо меня как минимум еще двое испытывают похожие проблемы.
--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
|
|
|
|
|
Jun 2 2012, 19:53
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(Lotor @ Jun 2 2012, 21:36)  Вы заблуждаетесь, логика присутствует.  Ну какая-то логика конечно присутствует, если программа всё-таки работает. Цитата(Lotor @ Jun 2 2012, 21:36)  При static локальная переменная будет жить в глобальной области памяти, а не на стеке. И именно поэтому проблемы исчезали. Зачем переменной "жить в глобальной области памяти"? Локальная переменная должна жить в стеке (за исключением особых случаев). Вопрос в том, почему такие проблемы вообще возникают. Что-то делаете не так. Согласен с мнением scifiЦитата Это танцы с бубном. Так не интересно. Лучше докопаться до сути проблемы. Каким-то образом вам удалось заткнуть проблему (с помощью static), но не факт что не вылезет где-нибудь в другом месте. Цитата(Lotor @ Jun 2 2012, 21:36)  И т.к. это был не первый случай, то старался больше не рисковать и ставил static у локальных указателей и массивов, если они идут дальше (реентерабельность не требовалась). Если реентерабельность не требуется, то как бы и ладно, если по другому никак. А как потребуется? Или как такое будет работать в программе с ОС? Понятно что никак не будет. Цитата(Lotor @ Jun 2 2012, 21:36)  Прочитав эту тему по диагонали и заметив знакомую проблему, удивился что уважаемый aaarrr очень уверенно говорит, что дело не в компиляторе. Может оно и так, но помимо меня как минимум еще двое испытывают похожие проблемы. aaarrr видимо прав на 100 %. Если у него таких проблем не возникает, то что-то эти "ещё двое" делают не правильно и дело не в компиляторе. Вообще за последние несколько лет не встречал чтобы дело было в компиляторе (правда я с iar работаю), 99% что виноват программист, ну и может доли процента можно оставить на глюки компилятора.
|
|
|
|
Сообщений в этой теме
KnightIgor Лучшее - враг хорошего? May 30 2012, 08:30 SII На Си, вообще говоря, не пишу, хотя кой-какие вещи... May 30 2012, 09:15 aaarrr 1. -O2
2. Нет
3. Возможно. Вопрос в скобках соверш... May 30 2012, 09:35 KnightIgor Цитата(aaarrr @ May 30 2012, 11:35) 3. Во... May 30 2012, 11:24  aaarrr Цитата(KnightIgor @ May 30 2012, 15:17) П... May 30 2012, 11:34   KnightIgor Цитата(aaarrr @ May 30 2012, 13:34) Нет, ... May 30 2012, 11:49    aaarrr Цитата(KnightIgor @ May 30 2012, 15:49) Я... May 30 2012, 12:04 kovigor Цитата(KnightIgor @ May 30 2012, 11:30) В... May 30 2012, 09:41 vlad_new 1. Уровень по default 0
2. Вопрос конечно интересн... May 30 2012, 12:07 _Артём_ Цитата(vlad_new @ May 30 2012, 15:07) 3. ... May 30 2012, 12:25  KnightIgor Цитата(_Артём_ @ May 30 2012, 14:25) А чт... May 30 2012, 12:49   aaarrr Цитата(KnightIgor @ May 30 2012, 16:49) В... May 30 2012, 13:07    KnightIgor Цитата(aaarrr @ May 30 2012, 15:07) Тогда... May 30 2012, 14:01     Albun Была у меня когда-то тоже похожая проблема с оптим... May 30 2012, 18:44 EvilWrecker Также в свое време потратил немало усилий на отыск... May 30 2012, 19:13 vlad_new Я вот еще чего вспомнил. Если массив объявлен внут... May 31 2012, 00:42 _Артём_ Цитата(vlad_new @ May 31 2012, 03:42) Есл... May 31 2012, 01:12 KnightIgor Цитата(vlad_new @ May 31 2012, 02:42) Я в... May 31 2012, 08:50  RabidRabbit А оно там при -O0 переменные само не инициализируе... May 31 2012, 10:39   KnightIgor Цитата(RabidRabbit @ May 31 2012, 12:39) ... May 31 2012, 11:53 vlad_new ЦитатаВот так объявляете:
Код
void Func()
{
st... May 31 2012, 12:20 _Артём_ Цитата(vlad_new @ May 31 2012, 15:20) Да.... May 31 2012, 12:40 vlad_new ЦитатаНет. Я о другом:
создавая массив static unsi... May 31 2012, 13:02 _Артём_ Цитата(vlad_new @ May 31 2012, 16:02) Ну ... May 31 2012, 13:22 KnightIgor Цитата(vlad_new @ May 31 2012, 15:02) Ну ... May 31 2012, 13:34 _Артём_ Цитата(vlad_new @ May 31 2012, 16:41) А В... May 31 2012, 13:50 aaarrr Цитата(vlad_new @ May 31 2012, 17:41) А В... May 31 2012, 14:11  _Артём_ Цитата(aaarrr @ May 31 2012, 17:11) А поч... May 31 2012, 14:21 KnightIgor Цитата(vlad_new @ May 31 2012, 15:41) А В... May 31 2012, 14:16      scifi Цитата(_Артём_ @ Jun 1 2012, 17:31) P.S. ... Jun 1 2012, 13:38        Lotor Цитата(_Артём_ @ Jun 2 2012, 23:53) Зачем... Jun 4 2012, 12:21 vlad_new ЦитатаВообще оптимизацией не воспользуешься, если ... May 31 2012, 13:59 _Артём_ Цитата(vlad_new @ May 31 2012, 16:59) Да,... May 31 2012, 14:09 vlad_new На счет ошибок - я уже показывал этот пример други... May 31 2012, 14:44 aaarrr Чтобы поддержать тему, расскажу о реальном замечен... Jun 4 2012, 13:07
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|