|
Лучшее - враг хорошего?, Глюки при оптимизации компилятора 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, 12:25
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(vlad_new @ May 30 2012, 15:07)  3. В локальных только static. А что просто написать Код uint8_t tmp; нельзя? Обязательно писать Код static uint8_t tmp; ?
|
|
|
|
|
May 30 2012, 12:49
|
Знающий
   
Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725

|
Цитата(_Артём_ @ May 30 2012, 14:25)  А что просто написать Код uint8_t tmp; нельзя? Обязательно писать Код static uint8_t tmp; ? Речь также о "видимости" переменной между модулями. static видна только в своем модуле. Это означает, что в других можно использовать то же имя, если хочется. Не объявленная как static будет глобальной и "видна" и доступна всем модулям программы. Могут случиться казусы. Цитата(vlad_new @ May 30 2012, 14:07)  1. Уровень по default 0 Таки -O2. Это видно в строке ключей в итоге, как я обнаружил только что. Цитата 2. Вопрос конечно интересный. Были у меня проблеммы с массивами. Хотя может в последних версиях KEILа уже что то и подправили. Вот именно на это я и "грешу". Похоже, что массивы (буферы) ведут себя странно.
|
|
|
|
|
May 30 2012, 14:01
|
Знающий
   
Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725

|
Цитата(aaarrr @ May 30 2012, 15:07)  Тогда добейтесь сперва стабильного воспроизведения ошибки. Без этого никак. Во-во. Именно это не получалось: лишь в одном из 10 случаев происходили какие-то странности... Цитата Характер ошибок ("иногда что-то ломается") указывает скорее на порчу данных из-за ошибки в программе. Я тоже так и понял, потому поддержал "тему" массивов. Ищу... P.S. Прикол теперь в том, что я вернул установки оптимизации в якобы проблемные, загрузил, а всё работает! Конечно, между делом кое-что развивалось в программе. Не знаю, радоваться или огорчаться....
Сообщение отредактировал KnightIgor - May 30 2012, 14:15
|
|
|
|
|
May 30 2012, 18:44
|
Участник

Группа: Участник
Сообщений: 22
Регистрация: 21-07-08
Пользователь №: 39 116

|
Была у меня когда-то тоже похожая проблема с оптимизацией (правда в IAR-е, но может и для KEIL-а это будет тоже) : без оптимизации работало нормально, а с оптимизацией появились хаотические ошибки и зависания. Причем не стабильно - здесь и сейчас - а время от времени, без никакой видимой системы. Но потом после мучительных поисков нашел так-ки причину - у меня не корректно сохранялись регистры в блоке обработки IRQ прерываний. Я не сохранял регистр R12, а как оказалось компилятор этот регистр тоже использует как регистр общего назначения, т.е. в тех процедурах в которых он используется, компилятор не генериует команды на сохранение его при в ходе процедуру и восстановлении его при выходе из процедуры (как это делается с регистрами R4-R11) Соответственно причина была в том что без оптимизации R12 вообще не использовался компилятором, а оптимизированный код изредка использует R12. И весь хаос получался тогда, когда так стекались обстоятельства, что прерывание возникало в процедуре которая пользовалась R12. Обработчик IRQ в моем коде (MyIrqHandler) тоже компилировался (при оптимизации) с R12. А поскольку компилятор не генерирует код сохранения этого регистра при входе, то при выходе из MyIrqHandler R12 был "сбит", вот и получалось что R12 рушился но происходило это редко и хаотично. Проверьте, может и у вас та-же проблема. Код IRQ_Handler_Entry: PUSH {R0,R1} MRS R1,CPSR BIC R0,R1,#0x1F ORR R0,R0,#ARM_MODE_SVC MSR CPSR_C,R0 ... PUSH {R1-R3,LR} --> а про R12 я забыл, т.е. потом поправил так: PUSH {R1-R3,R12,LR} /POP {R1-R3,R12,LR} ^ в зависимости от того какие регистры выше R3 будут использованы в MyIrqHandler, компилятор сам их сохранит и восстановит (кроме R12 BL MyIrqHandler (MyIrqHandler - процедура на Cи) POP {R1-R3,LR} ... MSR CPSR_C,R1 POP {R0,R1} SUBS PC,LR,#04
Сообщение отредактировал Albun - May 30 2012, 18:46
|
|
|
|
Сообщений в этой теме
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 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
|
|
|