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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Как отключить оптимизацию switch() ?
scifi
сообщение Jan 30 2012, 13:05
Сообщение #16


Гуру
******

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



Ну не знаю... Опускаться до таких извращений, чтобы выжать пару байт из кода? ЯВУ не для этого придуманы. Если так сильно надо оптимизировать в этом месте, то следует использовать ассемблер. А если оптимизировать на самом деле не нужно, но очень хочется, то это проблема уже из области психологии.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jan 30 2012, 13:47
Сообщение #17


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(scifi @ Jan 30 2012, 18:05) *
Ну не знаю... Опускаться до таких извращений, чтобы выжать пару байт из кода? ЯВУ не для этого придуманы. Если так сильно надо оптимизировать в этом месте, то следует использовать ассемблер. А если оптимизировать на самом деле не нужно, но очень хочется, то это проблема уже из области психологии.

А по делу? А конструктивно?

А то ведь дойдёт до того, что и квалификаторы static, __data, __bit, __bdata, __code и ещё туча других будут приравнены к извращениям. Я могу и на асме писать, но не хочу, т.к. править что-то в нём долго. Однако я имею право (и компиляторы дают возможность) управлять оптимизацией на усмотрение программиста. Вот и возник простой вопрос без всякого психоанализа - какой кнопкой отключить оптимизацию свича. Нельзя, так нельзя. Спрашивал у знающих людей.

И вообще, настоящий профи знает инструмент с которым работает до малейшего винтика. Будь то компилятор или даже ЯВУ типа С++. Ну а программер мелкого пошиба будет искать любые отмазки и всё делать тяп-ляп. Так что давайте определяться.

Сообщение отредактировал GetSmart - Jan 30 2012, 14:28


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
xemul
сообщение Jan 30 2012, 14:40
Сообщение #18



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Цитата(GetSmart @ Jan 30 2012, 05:48) *
Делает по-прежнему.

За что Вы так компилятор не любите? (это я про volatile в switch)
имхо, вполне естественное решение:
Код
tmp = uartData.rxPhase;
switch(tmp) {}

А если ещё упростить жисть компилятору, то
Код
/* вместо
tmp = uartData.rxPhase;
switch(tmp)
{
   case A:
   case B:
   case C:
...
}
*/
tmp = uartData.rxPhase ^ A;
if(!tmp) {}
else if(!(tmp ^= A ^ B)) {}
else if(!(tmp ^= B ^ C)) {}
...

(в зависимости от компилятора и архитектуры контроллера) может оказаться короче.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jan 30 2012, 15:01
Сообщение #19


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(xemul @ Jan 30 2012, 19:40) *
За что Вы так компилятор не любите? (это я про volatile в switch)

Ай лов дис компилер sm.gif
Там не было volatile (uartData.rxPhase - обычная переменная) И при этом она постоянно перечитывалась.
Ранее я упоминал волатил касательно работы с битовыми переменными.

Цитата(xemul @ Jan 30 2012, 19:40) *
А если ещё упростить жисть компилятору, то
...
Код
tmp = uartData.rxPhase ^ A;
if(!tmp) {}
else if(!(tmp ^= A ^ B)) {}
else if(!(tmp ^= B ^ C)) {}
...

(в зависимости от компилятора) может оказаться короче.

В зависимости от... Ну Вы же понимаете, когда есть множественный выбор по одной переменной/выражении, то именно для этого придуман свич. Да и с ним грациозней код смотрится sm.gif Ну а до 8051 я сидел на EWARM, который свичи гораздо более навороченные делал через compare-branch. И я до сих пор не понимаю изврата, с которым столкнулся.

Upd.
То, что Вы "сотворили" имхо уже изврат. То есть для ЯВУ некрасиво и менее понятно, чем простые сравнения переменной с тремя-четырьмя константами. Такой экономии мне не надо. Пусть 5 тактов будет лишних. Я за красоту кода и полное и бесприкословное подчинение компилятора sm.gif Но из-за ущербности свича (а он там с полсотни тактов растранжирит и это в прерывании) я всё-таки заменю их на 3 if-а и парочку goto. Остальное в исходнике должно быть красиво. Ваш код должен уметь делать сам компилятор. Это почти элементарно. Но он неумёха в области 8051. А вот в ARM-е он на порядок круче генерит. Там ему большой респект.

Сообщение отредактировал GetSmart - Jan 30 2012, 15:24


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Feb 10 2012, 07:27
Сообщение #20


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Ужжасс.
7.60.1 ещё и глючный.
По адресу 072C надо сдвигать на оригинальное значение bit, а сдвигается на bit-8 (ACC). V1:V0 - что сдвигать, R0 - адрес V1:V0.
Эскизы прикрепленных изображений
Прикрепленное изображение
 


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Feb 11 2012, 00:40
Сообщение #21


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(Xenia @ Jan 29 2012, 13:03) *
Впервые слышу, чтобы switch оптимизировали путем замены на батарею if-ов. Если какие-то компиляторы на это способны, то хотелось бы услышать их названия.

Привожу название: ИАР 8.10.4. Картинка нумбер уан. Причём ни один свич в моей проге больше не делается через то заднее место как раньше.

На картинке нумбер ту исправлен глюк с искажением аккумулятора при сравнении. Но в целом этот кусок стал заметно хуже предыдущего.

Вобщем уровень компиляции ещё очень далек от уровня АРМ-овой версии ИАРа. Грубо говоря в 2 раза компактней можно писать на асме. А в АРМовом грубо раза в 1.2.

Сообщение отредактировал GetSmart - Feb 11 2012, 09:10
Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
 


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Feb 11 2012, 03:29
Сообщение #22


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



А 8.10.4 тоже какие-то приколисты писали. Вобщем видны некоторые улучшения оптимизации. В конце функции вызов другой функции заменяется на LJMP func. Сброс двух битов в одной битовой переменной заменяется на ANL var,mask.

Но есть лишние операции, хоть и не искажающие работу проги. Как буд-то кто-то хотел обмануть, но не срослось sm.gif

До сих пор в отладчике переходы назад отображаются неправильно, на 1 байт ошибается в мнемонике. Хотя команда правильная и исполняется правильно.

Сообщение отредактировал GetSmart - Feb 11 2012, 04:48
Эскизы прикрепленных изображений
Прикрепленное изображение
 


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
Xenia
сообщение Feb 11 2012, 07:26
Сообщение #23


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(GetSmart @ Feb 11 2012, 07:29) *
А 8.10.4 тоже какие-то приколисты писали. Вобщем видны некоторые улучшения оптимизации.

А у вас какая оптимизация включена? По скорости или по размеру?

Кстати, версия 8.10.4 уже не последняя - вчера вышла 8.11.1. Вот только испытывать ее боюсь из-за новой системы лицензирования. Теперь инсталлятор раздают свободно (тута) и он даже пытается что-то инсталлировать, но чтобы компилить стало, надо регистрировать по интернету. Есть предупреждение, что новая и старая система лицензирования несовместимы на одном компе (ОСе?), вот и трушу проверять, опасаясь, что старые лицензии (на другие платформы) у меня слетят. Впрочем, ожидать заметных подвижек в качестве компиляции от новой версии не приходится, т.к., судя по описанию, смена способа лицензирования - единственное, чем она отличается от своей предшественницы.

Сама же тенденция улучшать качество кода с ростом номера версии довольно хорошо прослеживается. Да и со временем ошибки тоже пользователями выявляются и производителем исправляются. Вот только Startup-код постоянно растет...

Но если за собой знаешь ту болезнь, что постоянно лазишь в код, генерируемый компилятором, и переживаешь по всякому поводу (типа "я написала бы лучше"), то лучше на ассемблере так и оставаться, а на С не переходить - целее нервы будут sm.gif. Со мной тоже такое было, но со временем прошло.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Feb 11 2012, 08:06
Сообщение #24


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Оптимизация у меня максимальная по размеру. Причём галку "Common subexpression elimination" даже выключил, без неё ещё компактней.

Смотреть код это такая же болезнь как смотреться в зеркало. Вы, как представительница женского пола, не болеете? sm.gif Перестать смотреть не желаете?

Залазя на новый компилятор просто нужно смотреть код. Это привычка старого профессионала. Лет 5 сидел на EWARM 4.20 и смотрел код тщательно первые несколько месяцев. Потом уже узнаёшь его как свои 5 пальцев sm.gif Кроме того, это помогает быстро искать ошибки в скомпиленном коде.

Кто бы ещё быстренько подсказал - какой компилер лучше генерит код ИАР 8.10 или какой-нить последний Кейл или ещё какой.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
Xenia
сообщение Feb 11 2012, 08:21
Сообщение #25


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(GetSmart @ Feb 11 2012, 12:06) *
Кто бы ещё быстренько подсказал - какой компилер лучше генерит код ИАР 8.10 или какой-нить последний Кейл или ещё какой.

Этот вопрос широко рассматривался вот в этой теме - "Какой компилятор выбрать IAR или Keil?, а может GCC?", но с тех пор много воды утекло (появились новые версии компиляторов). Было бы целесообразно реанимировать ту тему (в смысле продолжить), а то в теме про switch этот вопрос вряд ли найдет широкий отклик.

Цитата(GetSmart @ Feb 11 2012, 12:06) *
Лет 5 сидел на EWARM 4.20 и смотрел код тщательно первые несколько месяцев. Потом уже узнаёшь его как свои 5 пальцев sm.gif Кроме того, это помогает быстро искать ошибки в скомпиленном коде.

Вот вы бы этим лично и занялись, как лицо заинтересованное и квалифицированное. Тем более что с IAR вы до конца разобрались. Сравнить, на мой взгляд, стоит только с Keil и GCC, остальные не конкуренты.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Feb 11 2012, 08:29
Сообщение #26


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(Xenia @ Feb 11 2012, 13:21) *
Этот вопрос широко рассматривался вот в этой теме - "Какой компилятор выбрать IAR или Keil?, а может GCC?",

2005-2006 годы, платформа ARM. Для 8051 имхо топик должен быть свой.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
Dikoy
сообщение Mar 5 2012, 20:27
Сообщение #27


Местный
***

Группа: Участник
Сообщений: 253
Регистрация: 4-03-09
Из: Богота, Колумбия
Пользователь №: 45 676



Цитата(arttab @ Jan 30 2012, 04:09) *
iar #pragma optimize=none

А как назад вернуть как было?
Эта гадина мне вачдог оптимизирует:
WDTCSR = (1 << WDCE) | (1<<WDE);
WDTCSR = (1 << WDE) | (1 << WDP2) | (1 << WDP1) | (1 << WDP0);
Go to the top of the page
 
+Quote Post
Dikoy
сообщение Mar 5 2012, 22:54
Сообщение #28


Местный
***

Группа: Участник
Сообщений: 253
Регистрация: 4-03-09
Из: Богота, Колумбия
Пользователь №: 45 676



Всё, разобрался.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Mar 5 2012, 22:56
Сообщение #29


Гуру
******

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



Цитата(Dikoy @ Mar 5 2012, 22:27) *
А как назад вернуть как было?
Эта гадина мне вачдог оптимизирует:
WDTCSR = (1 << WDCE) | (1<<WDE);
WDTCSR = (1 << WDE) | (1 << WDP2) | (1 << WDP1) | (1 << WDP0);

Цитата
Use this pragma directive to decrease the optimization level, or to turn off some specific
optimizations. This pragma directive only affects the function that follows immediately
after the directive.


Разве надо возвращать?
Какой у вас уровень оптимизации установлен?



Go to the top of the page
 
+Quote Post

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

 


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


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