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

|
Цитата(aaarrr @ May 30 2012, 11:35)  3. Возможно. Вопрос в скобках совершенно непонятен - это все равно что спросить, нужно ли объявлять переменную как volatile int, или достаточно int.
Описываемое поведение больше похоже на проблемы со стеком. Пусть есть "глобальная" переменная, через которую передаются состояния между участками кода из разных *.C модулей или же переменная внутри одного *.С модуля, через которую "общаются" процедуры внутри его. Обязательно надо volatile [static] <type>?! Вряд ли, т.к. этот модификатор не встречается в общедоступном известном коде как Chan FatFS или contiki, которые, как известно, проверенно работают. Стек вряд ли, т.к. я не выделяю ограниченую область памяти для него (путем startup_xxxx.s), а, подобно DOS  , ставлю его на самый верх имеющейся RAM. В моем проекте при 48кБ RAM используется около половины, а остальное сверху - стек. Если это действительно проблема стека, то такое должно означать, что оптимизация требует его больше, что противоречило бы идее. Что может еще быть? Гипотеза - при вызове функции изнутри другой функции и передаче ей в качестве параметра ссылки на локальную переменную, которая как правило размещена в стеке, для "высоких" уровней оптимизации такая переменная может быть ошибочно размещена в регистре, и ссылаться будет не на что. Это был бы явно глюк компилятора. Цитата(kovigor @ May 30 2012, 11:41)  Были подобные проблемы, когда не хватало быстродействия МК. В моем случае проблема решилась перепрограммированием PLL для получения макс. допустимой для LPC214x тактовой частоты (60 МГц) ... То есть, оптимизированный код работает МЕДЛЕНЕЕ, и ему нужен более производительный процессор? Кстати, подумал о программых задержках (типа for {i = 10000; i; i--}), которые, напротив, могут оказаться слишком быстыми с оптимизацией, и недожидаться чего-либо. В моем коде я их не использую (а пользую DWT, дающий абсолютное время).
|
|
|
|
|
May 30 2012, 11:34
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(KnightIgor @ May 30 2012, 15:17)  Пусть есть "глобальная" переменная, через которую передаются состояния между участками кода из разных *.C модулей или же переменная внутри одного *.С модуля, через которую "общаются" процедуры внутри его. Обязательно надо volatile [static] <type>?! Вряд ли, т.к. этот модификатор не встречается в общедоступном известном коде как Chan FatFS или contiki, которые, как известно, проверенно работают. Нет, не нужно. Цитата(KnightIgor @ May 30 2012, 15:17)  Стек вряд ли, т.к. я не выделяю ограниченую область памяти для него (путем startup_xxxx.s), а, подобно DOS  , ставлю его на самый верх имеющейся RAM. В моем проекте при 48кБ RAM используется около половины, а остальное сверху - стек. Если это действительно проблема стека, то такое должно означать, что оптимизация требует его больше, что противоречило бы идее. Ну, если стек вне подозрений, остаются еще выходы за границы массивов, несоответствующие действительности прототипы функций и т.п. После изменения проекта поменялось расположение данных в памяти, вот ошибки и вылезли. Цитата(KnightIgor @ May 30 2012, 15:17)  Что может еще быть? Гипотеза - при вызове функции изнутри другой функции и передаче ей в качестве параметра ссылки на локальную переменную, которая как правило размещена в стеке, для "высоких" уровней оптимизации такая переменная может быть ошибочно размещена в регистре, и ссылаться будет не на что. Это был бы явно глюк компилятора. Поверьте, таких глюков точно нет.
|
|
|
|
Сообщений в этой теме
KnightIgor Лучшее - враг хорошего? May 30 2012, 08:30 SII На Си, вообще говоря, не пишу, хотя кой-какие вещи... May 30 2012, 09:15   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, 13:41 _Артём_ Цитата(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 zuy Цитата(vlad_new @ May 31 2012, 05:41) А В... Jun 1 2012, 05:58  Lotor Цитата(zuy @ Jun 1 2012, 09:58) Уверен, ч... Jun 1 2012, 12:32   aaarrr Цитата(Lotor @ Jun 1 2012, 16:32) С Кейло... Jun 1 2012, 12:39    Lotor Цитата(aaarrr @ Jun 1 2012, 16:39) А ниче... Jun 1 2012, 12:42     _Артём_ Цитата(Lotor @ Jun 1 2012, 15:42) ставить... Jun 1 2012, 13:31      scifi Цитата(_Артём_ @ Jun 1 2012, 17:31) P.S. ... Jun 1 2012, 13:38      Lotor Цитата(_Артём_ @ Jun 1 2012, 17:31) Очень... Jun 2 2012, 18:36       _Артём_ Цитата(Lotor @ Jun 2 2012, 21:36) Вы забл... Jun 2 2012, 19:53        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
|
|
|