реклама на сайте
подробности

 
 
> Лучшее - враг хорошего?, Глюки при оптимизации компилятора KEIL
KnightIgor
сообщение May 30 2012, 08:30
Сообщение #1


Знающий
****

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
vlad_new
сообщение May 31 2012, 00:42
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 218
Регистрация: 24-06-10
Пользователь №: 58 127



Я вот еще чего вспомнил. Если массив объявлен внутрии фунции как char mas[100], и при попытке вызвать из этой ф-ции другую с передачей адреса этого массива, иногда получается дребедень. При оптимизации компилятор небольшие массивы помещает в стек и передать адрес такого массива почему то не всегда выходит. Так что все локальные массивы ( от греха подальше ) объявляю как static char mas[100]. К тому же чревато, что где то, стека может не хватить. А вообще мне тут советовали всегда заводить указатели на массивы чтоб не было проблемм с оптимизатором. К тому же указатели прекрасно индексируются. Я попробывал и мне понравился такой стиль.



Go to the top of the page
 
+Quote Post
KnightIgor
сообщение May 31 2012, 08:50
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725



Цитата(vlad_new @ May 31 2012, 02:42) *
Я вот еще чего вспомнил. Если массив объявлен внутрии фунции как char mas[100], и при попытке вызвать из этой ф-ции другую с передачей адреса этого массива, иногда получается дребедень. [...] Так что все локальные массивы ( от греха подальше ) объявляю как static char mas[100].

Я выше также написал, что у меня есть подозрения на локальные массивы. Однако делать временные внутрифункциональные массивы (и переменные вообще) статическими, а значит - перманентными в памяти, - не выход и не стиль. Более того, о реентерабельности таких функций можно сразу забыть.

Цитата(Albun @ May 30 2012, 20:44) *
Я не сохранял регистр R12, а как оказалось компилятор этот регистр тоже использует как регистр общего назначения,

А что такое "ассемблерный код"? wink.gif.


Сообщение отредактировал KnightIgor - May 31 2012, 08:46
Go to the top of the page
 
+Quote Post
RabidRabbit
сообщение May 31 2012, 10:39
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 397
Регистрация: 3-12-09
Из: Россия, Москва
Пользователь №: 54 040



А оно там при -O0 переменные само не инициализирует?
Go to the top of the page
 
+Quote Post
KnightIgor
сообщение May 31 2012, 11:53
Сообщение #5


Знающий
****

Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725



Цитата(RabidRabbit @ May 31 2012, 12:39) *
А оно там при -O0 переменные само не инициализирует?

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

Как уже говорилось, ошибка (которую я уже и не могу "восстановить") была частой, но не регулярной, чтобы можно было бы ее стабильно репродуцировать и отследить.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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, 03:42) Есл...   May 31 2012, 01:12
- - 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th July 2025 - 22:54
Рейтинг@Mail.ru


Страница сгенерированна за 0.01456 секунд с 7
ELECTRONIX ©2004-2016