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

 
 
9 страниц V  « < 6 7 8 9 >  
Reply to this topicStart new topic
> WinAVR-20100110, Пишем отзывы сюда
Genadi Zawidowsk...
сообщение Aug 13 2012, 13:13
Сообщение #106


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Странно, мало.

Мой проект выложен в теме, в нём нет ассемблера вообще. Может, у Вас что-то мешает оптимизатору? У меня только ключ -Os.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Aug 13 2012, 13:50
Сообщение #107


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Линкеру нужны ещё такие ключи как оказалось...
Цитата
-nodefaultlibs -lm -lgcc -lc

С ними правильные либы подключаются.
Да и кстати с lto у меня небольшие проекты (до 16К) собираются нормально.
Наконец-то lto полноценно заменил combine. А то блин я уже было отчаялся ждать этого радостного моментаsm.gif
Вот пример похвальной оптимизации:
CODE
//fifo.tx.cnt - волатильная переменная uint16_t;
//было:
if (!(--rs->fifo.tx.cnt))
624c: 80 91 15 06 lds r24, 0x0615
6250: 90 91 16 06 lds r25, 0x0616
6254: 01 97 sbiw r24, 0x01 ; 1
6256: 90 93 16 06 sts 0x0616, r25
625a: 80 93 15 06 sts 0x0615, r24
625e: 80 91 15 06 lds r24, 0x0615
6262: 90 91 16 06 lds r25, 0x0616
6266: 89 2b or r24, r25
6268: 29 f4 brne .+10 ; 0x6274

//стало:
if (!(--rs->fifo.tx.cnt))
613c: 80 91 15 06 lds r24, 0x0615
6140: 90 91 16 06 lds r25, 0x0616
6144: 01 97 sbiw r24, 0x01 ; 1
6146: 90 93 16 06 sts 0x0616, r25
614a: 80 93 15 06 sts 0x0615, r24
614e: 89 2b or r24, r25
6150: 29 f4 brne .+10 ; 0x615c


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Aug 13 2012, 14:25
Сообщение #108


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Ну -nodefaultlibs немного не в тему...
А в результате (-flto -Os) теперь вместо 27 килобайт 26 стало... И это всё от изначального объёма 32 килобайта... Я тоже давно ждал этого!
(-flto -Os добавил в ключи линкера).

Сообщение отредактировал Genadi Zawidowski - Aug 13 2012, 14:30
Go to the top of the page
 
+Quote Post
halfdoom
сообщение Aug 13 2012, 14:29
Сообщение #109


Профессионал
*****

Группа: Свой
Сообщений: 1 003
Регистрация: 20-01-05
Пользователь №: 2 072



Цитата(Genadi Zawidowski @ Aug 13 2012, 16:13) *
Может, у Вас что-то мешает оптимизатору? У меня только ключ -Os.

Тоже Os, просто код написан в стиле "здесь оптимизатору делать нечего". Компилятору остается только грамотно разложить переменные по регистрам.
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Aug 13 2012, 14:33
Сообщение #110


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Я как раз писал в стиле "оптимизируйте пожалуйста", но это оптимизировалось уже несколько последних лет одинаково.
Например, я проверял - нет смысла внутри выражения делать присваивания, что снижает читаемость - оптимизатор gcc это давным-давно реорганизовывал. Но -flto порадовало!
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Aug 13 2012, 14:53
Сообщение #111


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(demiurg_spb @ Aug 13 2012, 16:50) *
Вот пример похвальной оптимизации

Что-то такая трактовка volatile начинает напрягать. Они, получается, неявно сделали винегрет из атомарной операции преддекремента и принципиальных неатомарностей доступа к переменной. Получается, что преддекремент живет своей жизнью... правда, хорошо бы примерчик придумать, где это вредно, но фантазии пока не хватает. Наверное, пока ни у кого не хватило.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Aug 14 2012, 05:21
Сообщение #112


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(Genadi Zawidowski @ Aug 13 2012, 18:25) *
Ну -nodefaultlibs немного не в тему...
Кому как... У меня без этого на одном из проектов было +2К в сравнении с WinAVR, и это с lto.


Цитата(_Pasha @ Aug 13 2012, 18:53) *
Что-то такая трактовка volatile начинает напрягать.
Ну не знаю... Я специально старался писать код так чтобы получить именно то, что наконец получилось. Ничего вредного пока в этом не усматриваю.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Aug 14 2012, 11:27
Сообщение #113


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(demiurg_spb @ Aug 14 2012, 08:21) *
Ну не знаю... Я специально старался писать код так чтобы получить именно то, что наконец получилось. Ничего вредного пока в этом не усматриваю.

Вы имеете в виду одним выражением? Дык тут - никаких возражений, вопросы именно по поводу того что CSE(вспомнил, как оно называется), имеет более высокий приоритет, чем безусловная по определению отмена оптимизации у volatile. Оно-то симпатичнее выглядит, но, с виду, конфликтует со стандартами.
Полезши в гугль, нашел, откуда ножки. Вкратце - поскольку имеется сильная заточенность под х86, инкремент волатайла при работе CSE, происходит через косвенное обращение к памяти, и за одну команду, что load/store архитектурах невозможно. Где-то там и вычитал такой пример.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Aug 15 2012, 10:46
Сообщение #114


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(_Pasha @ Aug 14 2012, 15:27) *
Вы имеете в виду одним выражением?
Да.
Цитата
Дык тут - никаких возражений, вопросы именно по поводу того что CSE(вспомнил, как оно называется), имеет более высокий приоритет, чем безусловная по определению отмена оптимизации у volatile. Оно-то симпатичнее выглядит, но, с виду, конфликтует со стандартами.
Да и шут с ним с конфликтом, главное чтобы программы работали так как от них ожидаешь. Или даже немного лучше:-)

Возвращаясь к avr-gcc-4.7.1...
Обнаружился один неприятный и один непонятный момент.
1) Все переменные в EEPROM секции располагаются в обратном порядке, т.е. было раньше x1 x2 x3, стало x3 x2 x1.
Такая фигня была уже как-то раз на одной из версий WinAVR её быстро тогда пофиксили.
2) При включении lto все неиспользуемые переменные из EEPROM выкидываются нафиг.

Мне пока видится только один выход: засунуть все EEPROM переменные в одну структуру.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Aug 15 2012, 10:55
Сообщение #115


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(demiurg_spb @ Aug 15 2012, 16:46) *
Мне пока видится только один выход: засунуть все EEPROM переменные в одну структуру.

Есть ещё
__attribute__((used))


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Aug 15 2012, 11:06
Сообщение #116


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Цитата(demiurg_spb @ Aug 15 2012, 14:46) *
Мне пока видится только один выход: засунуть все EEPROM переменные в одну структуру.


А совместно с offsetof это решение позволит ещё и независящие от типа используемой памяти писать программы.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Aug 15 2012, 16:05
Сообщение #117


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(demiurg_spb @ Aug 15 2012, 13:46) *
Мне пока видится только один выход: засунуть все EEPROM переменные в одну структуру.

Я никогда по другому и не делал sm.gif
В любой момент может возникнуть желание сделать резервный набор параметров.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Aug 15 2012, 18:40
Сообщение #118


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(Genadi Zawidowski @ Aug 15 2012, 17:06) *
А совместно с offsetof это решение позволит ещё и независящие от типа используемой памяти писать программы.

Это как? Методы чтения-то всё равно зависят от типа используемой памяти.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Aug 15 2012, 20:36
Сообщение #119


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Цитата(AHTOXA @ Aug 15 2012, 22:40) *
Это как? Методы чтения-то всё равно зависят от типа используемой памяти.


Именно. А пользоваться тем, что эта память ещё одно адресное пространство на атмеге - всё равно, надо перед обращениями дожидаться заверщения циклов записи, ранее (возможно) иницииорваных...
Go to the top of the page
 
+Quote Post
ReAl
сообщение Aug 16 2012, 12:48
Сообщение #120


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(_Pasha @ Aug 13 2012, 17:53) *
Что-то такая трактовка volatile начинает напрягать.
...
правда, хорошо бы примерчик придумать, где это вредно, но фантазии пока не хватает.


С примерчиком нет проблем, хоть и, возможно, слегка натянутым. Нужно просто придумывать на периферии, а не в ОЗУ.
Пусть у нас есть регистр периферийного устройства (нет проблем описать его так, что компилятор как таковой не сможет его отличить от переменной в памяти).
Пусть младший бит всегда читается нулевым а запись единички в него запускает какую-то операцию. Специально так аппаратуру сделали под INC для запуска операции, остальные управляющие биты при этом не меняются (во времена PDP-11 такое встречалось).
Все нули в регистре тоже что-то означают (скажем, отсутствие ошибок).
Ну вот читаем оттуда все нули, инкрементиреуем, записываем назад с 1 в младшем бите.
Вместо того, чтобы опять зачитать регистр и увидеть, что там все нули -- всегда в этой опреации видим регистр ненулевым.

А по поводу напряга… Ой, вредные они все. Я бы тоже считал, что после записи в volatile его нужно перезачитать. Но…
Там, кажется, и в С++ что-то слегка менялось.
Боюсь, что это где-то вблизи того, что --i эквивалентно «присваивающему выражению» i = i - 1.
А оно имеет «значение правой части приведенное к типу левой части со снятыми cv-квалификаторами»
Близкая проблема
Код
volatile int va;
int a;
  a = va = 5; // надо ли перезачитывать va??? говорят, что таки не надо...


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post

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

 


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


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