Перейти к содержанию
    

Странности при оптимизации

Кстати, раз уж о глюках:

 

У меня при включенной оптимизации компилятор думает, что раз тела у while нет, то можно и зациклить сам на себя БЕЗ проверки условия, т.е.

 

MojBit=1;

 

while(MojBit==1) { };

 

в асме выглядит так:

 

Addr: rjmp Addr

 

Если в тело хотя бы вставить _NOP(); т.е. while(MojBit==1) {_NOP();};

 

картина меняется - добавляется загрузка вита в 1 и проверка в теле while. Вопрос знатокам: Почему? Компилятор умнее пользователя?

 

Модератор.

Тема выделена как отдельная из другого топика.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вопрос знатокам: Почему? Компилятор умнее пользователя?
Почему картина поменялась после добавления _NOP(); - не скажу, вроде на условие в цикле не влияет... А, вот, проверять условие цикла - нет необходимости: переменной MojBit присвоено значение 1 и условие MojBit==1 - всегда выполняется!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вопрос знатокам: Почему? Компилятор умнее пользователя?

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Почему картина поменялась после добавления _NOP(); - не скажу, вроде на условие в цикле не влияет... А, вот, проверять условие цикла - нет необходимости: переменной MojBit присвоено значение 1 и условие MojBit==1 - всегда выполняется!

Не согласен. Вы забыли про прерывания? Вот они и меняют этот бит. Может компилёру нужно дополнительно сообщить, что этот бит ещё где-то может модифицироваться? Вопрос, как...

P.S. Я с асмом дружу очень, но большие модули переписываю на С, потому что надоело при смене типа мк в пределах одного изготовителя приходится сильно менять исходник, а при смене Z80<>PIC<>Holtek<>AVR<>msp430<>PC<>mcs48<>mcs51 и т.д. просто волосы дыбом встают...

Поэтому и прошу помощи... Как было указано в начале темы, мож у мя глюки?

2Moderator: Может мне создать отдельную тему? Но я её хотел назвать именно так, как назвал автор:)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы забыли про прерывания? Вот они и меняют этот бит. Может компилёру нужно дополнительно сообщить, что этот бит ещё где-то может модифицироваться?

 

а прочитать тему с самого начала?

при объявлении своей переменной MojBit укажите что она volatile и будет вам счастье

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Просто не устаю поражаться. На нашем форуме про volatile уж было все рассказано, подробнее, чем где-бы то ни было, учитывая специфику программирования железа. Ан нет, есть еще граждане про сие не читавшие, да еще и вопрос задающие не поймешь как. Чудно, все это.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Просто не устаю поражаться. На нашем форуме про volatile уж было все рассказано, подробнее, чем где-бы то ни было, учитывая специфику программирования железа. Ан нет, есть еще граждане про сие не читавшие, да еще и вопрос задающие не поймешь как. Чудно, все это.

 

Прошу простить... Это как допустим чья-то жена получила вчера права, начинает спрашивать мужа: "Как там решить вопрос с ГАИшниками, если..." Муж: "Я ж те говорил, книжки покупал..."

 

На сколько я знаю, volatile говорит компилятору о том, что все связанные с переменной действия ни в коем случае не оптимизировать. Вопрос для многозадачных или "мощных" систем вроде выглядит по другому: требуется ещё лочить переменную на время обработки данных(например в прерывании меняется массив данных и указатели на него а основная прога может вылететь) И если можно про static.

 

Просветите плиз тонкости... Может быть еще раз... Ну "я месяц назад получил права" :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И если можно про static.

 

Просветите плиз тонкости... Может быть еще раз... Ну "я месяц назад получил права" :)

Вот тут не найдется для вас ответа на вопрос про static?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Прошу простить... Это как допустим чья-то жена получила вчера права, начинает спрашивать мужа: "Как там решить вопрос с ГАИшниками, если..." Муж: "Я ж те говорил, книжки покупал..."

 

На сколько я знаю, volatile говорит компилятору о том, что все связанные с переменной действия ни в коем случае не оптимизировать. Вопрос для многозадачных или "мощных" систем вроде выглядит по другому: требуется ещё лочить переменную на время обработки данных(например в прерывании меняется массив данных и указатели на него а основная прога может вылететь) И если можно про static.

 

Просветите плиз тонкости... Может быть еще раз... Ну "я месяц назад получил права" :)

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2rezident: со static (и не тоько) разобрался, спасибо!

 

Ещё вопросик...

 

Насколько я понимаю, у меня эти проблемы с оптимизацией начались после того, как у меня образовалось более одного модуля, т.е. каждый модуль независим для компилятора и компилёр оптимизирует не проект, а данный модуль и если я в одном модуле только читаю а в другом только пишу переменную, то в обоих случаях если я не допишу volatile компилёр просто выкинет эти строки (просто примет за константу данные при компиляции), а с линкера не спросишь-он просто склеит готовые блоки.

 

Опять же, если будет это всё в одном файле/модуле, то даже при макс. оптимизации компилёр может понять, что переменная юзается внутри в разных функциях (в т.ч и в прерываниях) и не будет оптимизировать до упора?

 

Т.е. в данном случае не нужен тип global/static/volatile ? (модуль-то один, global итак будет автоматом, вопрос только про оптимизатор)

 

Да, самое интересное: Я объявляю в модуле main глобальные переменные, в остальных модулях их же, но через extern, т.е. получается, что глобально в пределах проекта, но вот эта заноза-оптимизатор видит только в пределах модуля переменную (в смысле её использования), а не в пределах проекта? Или есть тонкости? Объясните плиз, где грабли... Крыша уже течёт...

 

Просто я не умею их готовить... (с) какая-то реклама

 

Чем-то чувствую, что и прав и нет. Хотелось бы понять, где. Я понимаю, RTFM, но всё же... F1 !

То, что люди задают глупые вопросы не означает, что они глупы, просто иногда не хватает опыта...

Сорри, если чуть оффтоп... ;)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я все не пойму, что за проблемы "с этой оптимизацией"? Где конкретно, с чем проблемы? Что компилятор делает не так, как вы хотите?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я все не пойму, что за проблемы "с этой оптимизацией"? Где конкретно, с чем проблемы? Что компилятор делает не так, как вы хотите?

Каждый модуль независим для компилятора и компилёр оптимизирует не проект, а данный модуль и если я в одном модуле только читаю а в другом только пишу переменную, то в обоих случаях если я не допишу volatile компилёр просто выкинет эти строки (просто примет за константу данные при компиляции)

Вот в этом и грабли. Всё могло быть хорошо, если модуль один. (Вроде бы)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Каждый модуль независим для компилятора и компилёр оптимизирует не проект, а данный модуль и если я в одном модуле только читаю а в другом только пишу переменную, то в обоих случаях если я не допишу volatile компилёр просто выкинет эти строки (просто примет за константу данные при компиляции)
Нет. Компилятор ОБЯЗАН обеспечить состояние переменных, видимое с точки зрения программиста, в любой точке программы. volatile всего лишь заставляет компилятор считать, что состояние переменной может быть изменено не только тем, что написанно в программе. Т.е. компилятор не имеет права выкидывать любые записи и чтения этой переменной. Но он не обязан каким либо другим способом синхронизировать доступ к ней - это обязанность программиста.

 

Например, если мы имеем код

 

a=1;

...

a=2;

...

a=3;

то для не volatile переменной компилятор может оставить только последнее присваивание (если в промежутке не было вызовов других функций), для volatile все присваивания останутся

 

 

 

Вот в этом и грабли. Всё могло быть хорошо, если модуль один. (Вроде бы)
От количества модулей это не зависит. А вот качество оптимизации может зависеть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нет. Компилятор ОБЯЗАН обеспечить состояние переменных, видимое с точки зрения программиста, в любой точке программы. volatile всего лишь заставляет компилятор считать, что состояние переменной может быть изменено не только тем, что написанно в программе. Т.е. компилятор не имеет права выкидывать любые записи и чтения этой переменной. Но он не обязан каким либо другим способом синхронизировать доступ к ней - это обязанность программиста.

 

Например, если мы имеем код

 

a=1;
...
a=2;
...
a=3;

то для не volatile переменной компилятор может оставить только последнее присваивание (если в промежутке не было вызовов других функций), для volatile все присваивания останутся

 

От количества модулей это не зависит. А вот качество оптимизации может зависеть.

Согласен. А есть ли возможность указать компилятору в данном конкретном примере какой-нибудь командой #cmdxxx НЕ ОПТИМИЗИРОВАТЬ например именно строчку где a=2; ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Уважаемый DenisIV!

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

 

Я уже раньше отмечал, что современные компиляторы занимаются оптимизацией совместно с линкером. Об этом и Александреску в своих книгах пишет. Да и сами можете убедиться, сравнив ассемблерный листинг, генерируемый компилятором и дизассемблированный код. Так что замечания насчет оптимизации на уровне модуля тоже не совсем правомочны.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...