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

 
 
3 страниц V  < 1 2 3  
Reply to this topicStart new topic
> Лучшее - враг хорошего?, Глюки при оптимизации компилятора KEIL
KnightIgor
сообщение May 31 2012, 14:16
Сообщение #31


Знающий
****

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



Цитата(vlad_new @ May 31 2012, 15:41) *
А Вы его и спросите. К примеру sprintf(mas,"бла...бла", tmp); при объявленном локальном массиве char mas[10] и включенном оптимизаторе O1 просто не заработал. И передача адреса массива в другую функцию send(char *mas) то же не работало. Помог static.

А может это самое "бла...бла" было такое длиное, что не влезало в 10 байт? А когда разместилось как static, может sprintf и залезало на верхнего соседа массива, но тот был того же толка, - временная переменная (что заявленый стиль программирования позволяет предположить), - которая стерпела вторжение. Даже с пониманием того, что компилятор не безгрешен по определению, следовало бы поискать ошибки сначала у себя, прежде чем бросаться в крайности. Конечно, каждый пишет, как хочет, и окончательным критерием истины является только одно - работает программа как надо, или нет, - но я бы позволил себе дать дружеский совет пересмотреть стиль программирования.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение May 31 2012, 14:21
Сообщение #32


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(aaarrr @ May 31 2012, 17:11) *
А почему у меня все работает на любых уровнях, интересно?

Ну понятно почему: что-то не так делаете. Неправильно их готовите...
Go to the top of the page
 
+Quote Post
vlad_new
сообщение May 31 2012, 14:44
Сообщение #33


Местный
***

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



На счет ошибок - я уже показывал этот пример другим. Никто ошибок не обнаружил. Так что вряд ли. Хотя опять же такое было в ранних версиях.
За это время и библиотеки могли поминяться и и еще что то. У меня щас времени нет перепроверять. Хочеш сам попробуй. А потом сообщиш о результатах.


Цитата(KnightIgor @ May 31 2012, 18:16) *
А может это самое "бла...бла" было такое длиное, что не влезало в 10 байт?

Ну не 10 может 20 яж так к примеру. То что 32 бита занимают 10 символов+0+(возможно)знак я вроде как считать умею.
Мы здесь чего обсуждаем то? Разве не то кто с какими проблеммами сталкивался при оптимизации?
И от ошибок никто не застрахован. Все может быть.

Короче я все рассказал что вспомнил. Всем пока.

Сообщение отредактировал vlad_new - May 31 2012, 14:47
Go to the top of the page
 
+Quote Post
zuy
сообщение Jun 1 2012, 05:58
Сообщение #34


Частый гость
**

Группа: Свой
Сообщений: 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 довольно точно описывает причину происходящего.
Go to the top of the page
 
+Quote Post
Lotor
сообщение Jun 1 2012, 12:32
Сообщение #35


Местный
***

Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866



Цитата(zuy @ Jun 1 2012, 09:58) *
Уверен, что косяк у вас в коде.

С Кейлом знаком еще по 51 семейству, еще тогда были проблемы с локальными переменными, если их передавать в функции (при чем в свои, а не в sprintf) и не обозвать static. Для arm аналогично, будет время покопаю этот момент.


--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 1 2012, 12:39
Сообщение #36


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Lotor @ Jun 1 2012, 16:32) *
С Кейлом знаком еще по 51 семейству...

А ничего так, что это два совершенно разных компилятора от разных производителей?

99.9% "ошибок компилятора" и "багов оптимизатора" - это косяки в коде. Обратному можно верить только при наличии примера в виде код + дизассемблер.
Go to the top of the page
 
+Quote Post
Lotor
сообщение Jun 1 2012, 12:42
Сообщение #37


Местный
***

Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866



Цитата(aaarrr @ Jun 1 2012, 16:39) *
А ничего так, что это два совершенно разных компилятора от разных производителей?

Я это к тому, что еще с тех пор взял за правило ставить static у локальных переменных в функциях, если они идут дальше.
Цитата(aaarrr)
99.9% "ошибок компилятора" и "багов оптимизатора" - это косяки в коде. Обратному можно верить только при наличии примера в виде код + дизассемблер.

Я к этому мнению пришел недавно, намного позже, чем стал ставить static у локальных переменных. =) Поэтому и хочу при наличии времени поиграться именно с дизассемблером.


--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jun 1 2012, 13:31
Сообщение #38


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Lotor @ Jun 1 2012, 15:42) *
ставить static у локальных переменных в функциях

Очень странная идея.
Зачем оно надо?

P.S. volatile не пробовали для локальных? Это хоть не так нелогично.
Go to the top of the page
 
+Quote Post
scifi
сообщение Jun 1 2012, 13:38
Сообщение #39


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(_Артём_ @ Jun 1 2012, 17:31) *
P.S. volatile не пробовали для локальных? Это хоть не так нелогично.

Это танцы с бубном. Так не интересно. Лучше докопаться до сути проблемы.
Go to the top of the page
 
+Quote Post
Lotor
сообщение Jun 2 2012, 18:36
Сообщение #40


Местный
***

Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866



Цитата(_Артём_ @ Jun 1 2012, 17:31) *
Очень странная идея.
Зачем оно надо?

P.S. volatile не пробовали для локальных? Это хоть не так нелогично.

Вы заблуждаетесь, логика присутствует. sm.gif
При static локальная переменная будет жить в глобальной области памяти, а не на стеке. И именно поэтому проблемы исчезали.

PS: На работе попробовал по памяти набросать код, который вызывал когда-то проблемы (чтобы осмысленно глянуть в дизассемблер) - в функции локальный массив или указатель передается дальше. Но увы, всё работает, как надо при любой оптимизации. =) Помню, когда в последний раз такое случалось, я перенес аналогичный код в iar'овский компилятор - там без static работало. И т.к. это был не первый случай, то старался больше не рисковать и ставил static у локальных указателей и массивов, если они идут дальше (реентерабельность не требовалась). Прочитав эту тему по диагонали и заметив знакомую проблему, удивился что уважаемый aaarrr очень уверенно говорит, что дело не в компиляторе. Может оно и так, но помимо меня как минимум еще двое испытывают похожие проблемы.


--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jun 2 2012, 19:53
Сообщение #41


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Lotor @ Jun 2 2012, 21:36) *
Вы заблуждаетесь, логика присутствует. sm.gif


Ну какая-то логика конечно присутствует, если программа всё-таки работает.


Цитата(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% что виноват программист, ну и может доли процента можно оставить на глюки компилятора.
Go to the top of the page
 
+Quote Post
Lotor
сообщение Jun 4 2012, 12:21
Сообщение #42


Местный
***

Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866



Цитата(_Артём_ @ Jun 2 2012, 23:53) *
Зачем переменной "жить в глобальной области памяти"? Локальная переменная должна жить в стеке (за исключением особых случаев).

Речь шла о том, что помогло решить проблему и что дает static у локальных переменных. Другое дело, что это костыль.

Цитата(_Артём_ @ Jun 2 2012, 23:53) *
Вообще за последние несколько лет не встречал чтобы дело было в компиляторе (правда я с iar работаю), 99% что виноват программист, ну и может доли процента можно оставить на глюки компилятора.

Так вроде мы и не из этих, которые свои косяки валят на компилятор, кристалл или фазу луны. sm.gif Увы, воспроизвести "по заказу" не могу, поэтому добавляю тему в закладки - и как только, так сразу.


--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 4 2012, 13:07
Сообщение #43


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Чтобы поддержать тему, расскажу о реальном замеченном глюке оптимизации:
Компилятор игнорировал #pragma arm section при автоинлайне. То есть встраивал функцию, для которой была определена конкретная секция, в тело другой, расположенной по умолчанию.
Go to the top of the page
 
+Quote Post

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

 


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


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