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

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> WinAVR-20070122 еще сырой?, ошибки оптимизации
Jat
сообщение Feb 17 2007, 04:29
Сообщение #1





Группа: Участник
Сообщений: 8
Регистрация: 6-03-06
Из: Новосибирск
Пользователь №: 15 027



Вот пример генерации кода. опции -Os

---------------------------------------------------------

int g;

int func(void)
{
int res;
{
uint8_t _SReg;
asm volatile("in %0,__SREG__\n\tcli" : "=r" (_SReg));

res = g;

asm volatile( "out __SREG__,%0" :: "r" (_SReg));
}
return res;
}

--------------------------------------------------------
WinAVR 20060421 (правильно)

28 0000 2FB7 in r18,__SREG__
29 0002 F894 cli
32 0004 8091 0000 lds r24,g
33 0008 9091 0000 lds r25,(g)+1
36 000c 2FBF out __SREG__,r18
40 000e 0895 ret

---------------------------------------------------------
WinAVR 20070122 (неправильно)

32 0006 8FB7 in r24,__SREG__
33 0008 F894 cli
37 000a 8FBF out __SREG__,r24
40 000c 8091 0000 lds r24,g
41 0010 9091 0000 lds r25,(g)+1
46 0014 0895 ret

---------------------------------------------------------
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Feb 17 2007, 12:32
Сообщение #2


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

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



Вчера был на avrfreaks. Там много таких вопросов.
Т.е. судя по всему - таки да, сырой.


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
aesok
сообщение Feb 17 2007, 14:10
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



К сожалению это не компилятор сырой, а ваш код. Правильно писать так:
Код
#include <stdint.h>
int g;

int func(void)
{
  int res;
  {
    uint8_t _SReg;
//  asm volatile("in %0,__SREG__\n\tcli" : "=r" (_SReg));
    asm volatile("in %0,__SREG__\n\tcli" : "=r" (_SReg)::"memory");

    res = g;

//  asm volatile( "out __SREG__,%0" :: "r" (_SReg));
    asm volatile( "out __SREG__,%0" :: "r" (_SReg): "memory");
  }
  return res;
}


Анатолий.
Go to the top of the page
 
+Quote Post
ahulap
сообщение Feb 17 2007, 15:31
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 44
Регистрация: 22-06-06
Из: Kharkiv, UA
Пользователь №: 18 284



Заметил, что по сравнению с WinAVR 20060125 код стал занимать немного больше места.
Например, bootloader занимал 2034 байта, стал 2078 байт (написан на с + макросы из boot.h и pgmspace.h). В 2к boot sector уже не влазит.
В чем отличия, еще еще не разбирался, но, похоже, придется менять "трюки" для уменьшения размера кода.
Go to the top of the page
 
+Quote Post
aesok
сообщение Feb 17 2007, 16:44
Сообщение #5


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(ahulap @ Feb 17 2007, 15:31) *
Заметил, что по сравнению с WinAVR 20060125 код стал занимать немного больше места.
Например, bootloader занимал 2034 байта, стал 2078 байт (написан на с + макросы из boot.h и pgmspace.h). В 2к boot sector уже не влазит.
В чем отличия, еще еще не разбирался, но, похоже, придется менять "трюки" для уменьшения размера кода.

Если у вас есть локальные переменные в 'main()', сделайте их временно глобальными. 40 байт не обещаю, но байт на 20 код должен уменьшиться.

Анатолий.
Go to the top of the page
 
+Quote Post
ahulap
сообщение Feb 17 2007, 19:00
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 44
Регистрация: 22-06-06
Из: Kharkiv, UA
Пользователь №: 18 284



[/quote]
Если у вас есть локальные переменные в 'main()', сделайте их временно глобальными. 40 байт не обещаю, но байт на 20 код должен уменьшиться.
[/quote]
Нет в main() локальных переменных. Из нее в зависимости от джамперов вызываются две static функции (для обновления "себя" или "соседа"). В них несколько локальных переменных (счетчики и байт, принятый по UART), остальные и массивы static.
Я этот загрузчик долго сворачивал, так что думаю, дело в сохранении многобайтовых переменных, принимаемых по UART, идущих старшим байтом вперед. Если записать так:
static unsigned char buf[512];
unsigned int size;
*( (unsigned char *)&size + 1) = buf[0];
*( (unsigned char *)&size + 0) = buf[1];
то компиллятор расположит переменную в памяти, что для счетчика не хорошо. Если записать так:
size = (buf[0] <<8) | buf[1];
то будут лишняя операция ИЛИ 2х-байтных чисел.
Как это все-таки правильно реализовать на С? Или только через ассемблерные вставки?

P.S.: если собрать этот bootloader в IAR 4.12 со средней оптимизацией по размеру, то получится 1940 байт. Есть за чем гнаться smile.gif
Go to the top of the page
 
+Quote Post
ahulap
сообщение Feb 18 2007, 00:16
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 44
Регистрация: 22-06-06
Из: Kharkiv, UA
Пользователь №: 18 284



Провел эксперименты, вот что получил:

unsigned int size;

size = ((unsigned int)mess[1] << 8) | mess[2];
3cd0: 80 91 63 00 lds r24, 0x0063
3cd4: 99 27 eor r25, r25
3cd6: d8 2f mov r29, r24
3cd8: cc 27 eor r28, r28
3cda: 80 91 64 00 lds r24, 0x0064
3cde: 99 27 eor r25, r25
3ce0: c8 2b or r28, r24
3ce2: d9 2b or r29, r25

size = ((unsigned int)mess[1] << 8) + mess[2];
3cd0: 80 91 63 00 lds r24, 0x0063
3cd4: 99 27 eor r25, r25
3cd6: d8 2f mov r29, r24
3cd8: cc 27 eor r28, r28
3cda: 80 91 64 00 lds r24, 0x0064
3cde: c8 0f add r28, r24
3ce0: d1 1d adc r29, r1

typedef union {
unsigned int i;
unssigned char c[2];
} un_int;
un_int size;

size.c[1] = mess[1];
size.c[0] = mess[2];
3cd0: d0 91 63 00 lds r29, 0x0063
3cd4: c0 91 64 00 lds r28, 0x0064

Наилучший результат дают union'ы, но программа теряет в читаемости: if (size.i) {...}, do {...} while (--size.i) ...
Есть еще какие-нибудь способы на С, без ассеблерных вставок?
Go to the top of the page
 
+Quote Post
aesok
сообщение Feb 18 2007, 00:43
Сообщение #8


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



В настоящий момент самый эффективный способ в GCC записывать в многобайтовые переменные побайтно, это использовать union'ы.
Go to the top of the page
 
+Quote Post
ahulap
сообщение Feb 23 2007, 15:55
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 44
Регистрация: 22-06-06
Из: Kharkiv, UA
Пользователь №: 18 284



Нашел отличие:
00003900 <main>:
3900: 2f 92 push r2
3902: 3f 92 push r3
...
3920: cf 93 push r28
3922: df 93 push r29
3924: 88 e0 ldi r24, 0x08 ; 8
3926: 88 bb out 0x18, r24 ; 24
Всего 18 push при входе в main и соотв 18 pop. WinAVR 20060125 такого не делал.
Как указать, что при входе/выходе из функции не надо сохранять/восстанивливать регистры?
(для main в частности)
Go to the top of the page
 
+Quote Post
defunct
сообщение Feb 23 2007, 16:23
Сообщение #10


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(aesok @ Feb 17 2007, 15:44) *
Если у вас есть локальные переменные в 'main()', сделайте их временно глобальными. 40 байт не обещаю, но байт на 20 код должен уменьшиться.

Не проще просто WinAVR 20060125 использовать?
Вообще есть какой-то резон обновлять компилятор, если предыдущая версия нормально работает?
Go to the top of the page
 
+Quote Post
aesok
сообщение Feb 23 2007, 23:43
Сообщение #11


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(ahulap @ Feb 23 2007, 15:55) *
Нашел отличие:
00003900 <main>:
3900: 2f 92 push r2
3902: 3f 92 push r3
...
3920: cf 93 push r28
3922: df 93 push r29
3924: 88 e0 ldi r24, 0x08 ; 8
3926: 88 bb out 0x18, r24 ; 24
Всего 18 push при входе в main и соотв 18 pop. WinAVR 20060125 такого не делал.
Как указать, что при входе/выходе из функции не надо сохранять/восстанивливать регистры?
(для main в частности)


Никак, эта проблемма обсуждалась в 'avr-libc-dev' майллисте и возможно будет решена в следуещей версии WinAVR.

Анатолий.

Сообщение отредактировал aesok - Feb 23 2007, 23:43
Go to the top of the page
 
+Quote Post
gormih
сообщение Feb 23 2007, 23:51
Сообщение #12


nofb
***

Группа: Свой
Сообщений: 430
Регистрация: 18-05-06
Из: Москва, Зеленоград
Пользователь №: 17 218



WinAVR еще долго будет сырым по определению.

Все таки продукт не коммерческий...

Хотите получить оптимизаию - пользуйте IAR или на худой конец CodeVision


--------------------
Это не то что вы подумали ...

Go to the top of the page
 
+Quote Post
aesok
сообщение Feb 23 2007, 23:58
Сообщение #13


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(gormih @ Feb 23 2007, 23:51) *
WinAVR еще долго будет сырым по определению.

Все таки продукт не коммерческий...

Хотите получить оптимизаию - пользуйте IAR или на худой конец CodeVision


Уважаемый gormih, этот топик о проблеммах в WinAVR. Если Вы хотите пообсуждать какой компилятор лучше, пожалуйста начните новую тему.

Анатолий.
Go to the top of the page
 
+Quote Post
gormih
сообщение Feb 24 2007, 00:34
Сообщение #14


nofb
***

Группа: Свой
Сообщений: 430
Регистрация: 18-05-06
Из: Москва, Зеленоград
Пользователь №: 17 218



Цитата(aesok @ Feb 23 2007, 23:58) *
Уважаемый gormih, этот топик о проблеммах в WinAVR. Если Вы хотите пообсуждать какой компилятор лучше, пожалуйста начните новую тему.
Анатолий.


Уважаемый Анатолий!

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


--------------------
Это не то что вы подумали ...

Go to the top of the page
 
+Quote Post
Abakt
сообщение Feb 24 2007, 00:42
Сообщение #15


Участник
*

Группа: Новичок
Сообщений: 73
Регистрация: 10-01-07
Пользователь №: 24 292



Он же не пишет - "лучше-хуже" он именно сообщает свое мнение чего в WinAVR не хватает. Хотя я с этим мнением не согласен.
Go to the top of the page
 
+Quote Post
aesok
сообщение Feb 24 2007, 00:43
Сообщение #16


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(gormih @ Feb 24 2007, 00:34) *
Цитата(aesok @ Feb 23 2007, 23:58) *

Уважаемый gormih, этот топик о проблеммах в WinAVR. Если Вы хотите пообсуждать какой компилятор лучше, пожалуйста начните новую тему.
Анатолий.


Уважаемый Анатолий!

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


Патчи для решения проблеммы с размером main() уже подготовленны.

Анатолий.
Go to the top of the page
 
+Quote Post
singlskv
сообщение Feb 24 2007, 12:38
Сообщение #17


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(gormih @ Feb 23 2007, 23:51) *
WinAVR еще долго будет сырым по определению.
Все таки продукт не коммерческий...
Хотите получить оптимизаию - пользуйте IAR или на худой конец CodeVision

Цитата(gormih @ Feb 24 2007, 00:34) *
Уважаемый Анатолий!

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


Хотите поговорить про оптимизацию ...
Давайте поговорим...
Вот вам небольшой тестик: Нужно скопировать один массив на 255 байт в два других.
Вот код:
Код
unsigned char sr[255];
unsigned char ds1[255];
unsigned char ds2[255];

int main( void )
{
  unsigned char i=255;
  unsigned char *ps=sr;
  unsigned char *pd1=ds1;
  unsigned char *pd2=ds2;

  do {
    *pd1++=*ps;
    *pd2++=*ps++;
  } while (--i);

  return 0;
}


Предлагаю поступить так, Вы компилируете этот код под IAR а я под WinAVR-20060421
при любом уровне оптимизации
Ну и дальше каждый выкладывает сюда результат - количество тактов на
выполнение цикла.
Готовы ?

P.S. WinAVR-20070122 действительно очень сырой, я попробовал поставить его
в надежде что исчезнут некоторые глюки предыдущей версии, но оказалось
что при компиляции куска проги которая раньше занимала ~2200байт
в новой версии у меня получилось 2600+ байт.
Честно говоря я даже разбираться не стал в чем дело и просто его стер.
Go to the top of the page
 
+Quote Post
ahulap
сообщение Feb 24 2007, 13:12
Сообщение #18


Участник
*

Группа: Участник
Сообщений: 44
Регистрация: 22-06-06
Из: Kharkiv, UA
Пользователь №: 18 284



Цитата(aesok @ Feb 23 2007, 23:43) *
Патчи для решения проблеммы с размером main() уже подготовленны.

Когда эти патчи будут доступны? (и где?)
И, как вы считаете, все-таки какую версию WinAVR стоит сейчас использовать?
Спасибо за Ваши ответы!
Go to the top of the page
 
+Quote Post
aesok
сообщение Feb 24 2007, 13:32
Сообщение #19


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(ahulap @ Feb 24 2007, 13:12) *
Цитата(aesok @ Feb 23 2007, 23:43) *

Патчи для решения проблеммы с размером main() уже подготовленны.

Когда эти патчи будут доступны? (и где?)
И, как вы считаете, все-таки какую версию WinAVR стоит сейчас использовать?
Спасибо за Ваши ответы!


В WinAVR-20070122 есть два существенных изменения:
1. Добавленна поддержка 256КВ-ных мег.
2. WinAVR-2006... + AVRStudio 4.12 позволяет коректно отлаживать не более 64КВ кода. В WinAVR-20070122 + AVRStudio 4.13 эта проблема решена.

Если вы используете 128-е или 256-е меги и ваш проект больше 64КВ то лучше WinAVR-20070122 + AVRStudio 4.13, если нет то на ваш выбор.

Анатолий.

Сообщение отредактировал aesok - Feb 24 2007, 13:33
Go to the top of the page
 
+Quote Post
gormih
сообщение Feb 26 2007, 22:55
Сообщение #20


nofb
***

Группа: Свой
Сообщений: 430
Регистрация: 18-05-06
Из: Москва, Зеленоград
Пользователь №: 17 218



Цитата(singlskv @ Feb 24 2007, 12:38) *
Хотите поговорить про оптимизацию ...
Давайте поговорим...
Вот вам небольшой тестик: Нужно скопировать один массив на 255 байт в два других.
Вот код:
Код
unsigned char sr[255];
unsigned char ds1[255];
unsigned char ds2[255];

int main( void )
{
  unsigned char i=255;
  unsigned char *ps=sr;
  unsigned char *pd1=ds1;
  unsigned char *pd2=ds2;

  do {
    *pd1++=*ps;
    *pd2++=*ps++;
  } while (--i);

  return 0;
}


Предлагаю поступить так, Вы компилируете этот код под IAR а я под WinAVR-20060421
при любом уровне оптимизации
Ну и дальше каждый выкладывает сюда результат - количество тактов на
выполнение цикла.
Готовы ?

P.S. WinAVR-20070122 действительно очень сырой, я попробовал поставить его
в надежде что исчезнут некоторые глюки предыдущей версии, но оказалось
что при компиляции куска проги которая раньше занимала ~2200байт
в новой версии у меня получилось 2600+ байт.
Честно говоря я даже разбираться не стал в чем дело и просто его стер.




Не собираюсь этого делать по двум причинам:

1) Не собираюсь пользовать WinAVR просто потому, что уже неоднократно сравнивал для своих задач уровни оптимальности кода в разных компиляторах. Пользуюсь исключительно codevision как самый простой в понимании, вмеру навороченный компилятор с оптимальным уровнем качества генерируемого кода. Ваша задача явно заточена под winavr, не спорю что именно она будет скомпилироваа в нем самым оптимальным способом.

2) Вообще редко пишу на си, а когда это делаю WinAVR напрягает сложностью вставки ассемблерных вставок. Ни для кого не секрет, что оптимальней связки си+асм нет. WinAVR упорно игнорирует данное обстоятельство, делать ассемблерные вставки по меньшей мере неудобно.



P.S:

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

Сообщение отредактировал gormih - Feb 26 2007, 22:59


--------------------
Это не то что вы подумали ...

Go to the top of the page
 
+Quote Post
singlskv
сообщение Feb 26 2007, 23:28
Сообщение #21


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(gormih @ Feb 26 2007, 22:55) *
Не собираюсь этого делать по двум причинам:

1) Не собираюсь пользовать WinAVR просто потому, что уже неоднократно сравнивал для своих задач уровни оптимальности кода в разных компиляторах. Пользуюсь исключительно codevision как самый простой в понимании, вмеру навороченный компилятор с оптимальным уровнем качества генерируемого кода. Ваша задача явно заточена под winavr, не спорю что именно она будет скомпилироваа в нем самым оптимальным способом.

ну я так понимаю что Вы все-таки попробовали скомпилировать мою задачку под
CV(IAR) и посмотрев на код отказались от попыток сравнивать ?

Кстати, задачка НЕ написана под конкретный компилятор!
Это просто вариант когда есть 3 источника/приемника длинных данных
Выдернуто из реальной программы (с большими упрощениями)
Да и написано на чистом C как в учебниках учат...

А насчет неоптимальности получаемого Вами кода,
так на C нужно тоже не абы как писать
или Вы рассчитываете что за Вас все компилятор сделает ?
Цитата
2) Вообще редко пишу на си, а когда это делаю WinAVR напрягает сложностью вставки ассемблерных вставок. Ни для кого не секрет, что оптимальней связки си+асм нет. WinAVR упорно игнорирует данное обстоятельство, делать ассемблерные вставки по меньшей мере неудобно.

ну это дело привычки
Цитата
P.S:
Вашу задачу я бы вообще написал на асме :-) Си использую только при необходимости сложных вычислений.

попробуйте написать лучше чем сгенерит WinAVR...(в данной конкретной задаче)
Go to the top of the page
 
+Quote Post
gormih
сообщение Feb 27 2007, 12:52
Сообщение #22


nofb
***

Группа: Свой
Сообщений: 430
Регистрация: 18-05-06
Из: Москва, Зеленоград
Пользователь №: 17 218



Цитата(singlskv @ Feb 26 2007, 23:28) *
А насчет неоптимальности получаемого Вами кода,
так на C нужно тоже не абы как писать
или Вы рассчитываете что за Вас все компилятор сделает ?




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


--------------------
Это не то что вы подумали ...

Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Feb 27 2007, 14:52
Сообщение #23


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

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



Цитата
Да и не собираюсь думать, чего он там сделает. Просто возьму и напишу на асме - благо, что для меня это не проблема.

Это говорит об одном - предметом вы не владеете, да и углублятся не собираетесь. Зато апломба поучать других у вас выше крыши.


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
gormih
сообщение Feb 27 2007, 14:57
Сообщение #24


nofb
***

Группа: Свой
Сообщений: 430
Регистрация: 18-05-06
Из: Москва, Зеленоград
Пользователь №: 17 218



Цитата(beer_warrior @ Feb 27 2007, 14:52) *
Цитата
Да и не собираюсь думать, чего он там сделает. Просто возьму и напишу на асме - благо, что для меня это не проблема.

Это говорит об одном - предметом вы не владеете, да и углублятся не собираетесь. Зато апломба поучать других у вас выше крыши.


А Ваше высказывания кроме того, что Вы хам - уж точно ничего не говорит. Я программированием микропроцессоров занялся еще в 9 классе средней школы. Вам уж точно меня не учить.


--------------------
Это не то что вы подумали ...

Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Feb 27 2007, 15:08
Сообщение #25


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

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



Цитата
А Ваше высказывания кроме того, что Вы хам - уж точно ничего не говорит. Я программированием микропроцессоров занялся еще в 9 классе средней школы. Вам уж точно меня не учить.

Судя по горячности сейчас вы в десятом. Вам было предложено провести технический тест. Вы съехали. Зато легко перешли на личности. Это легче, чем разбираться в тонкостях оптимизации.
Впрочем диагноз ясен, продолжать не не буду.


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
gormih
сообщение Feb 27 2007, 16:03
Сообщение #26


nofb
***

Группа: Свой
Сообщений: 430
Регистрация: 18-05-06
Из: Москва, Зеленоград
Пользователь №: 17 218



Цитата(beer_warrior @ Feb 27 2007, 15:08) *
Цитата
А Ваше высказывания кроме того, что Вы хам - уж точно ничего не говорит. Я программированием микропроцессоров занялся еще в 9 классе средней школы. Вам уж точно меня не учить.

Судя по горячности сейчас вы в десятом. Вам было предложено провести технический тест. Вы съехали. Зато легко перешли на личности. Это легче, чем разбираться в тонкостях оптимизации.
Впрочем диагноз ясен, продолжать не не буду.




Тонкости оптимизации я изучал на дургом уровне. Сейчас дам Вам кусок кода, в котором будет не 3 строчки, а 200... Перекомпилируем в разных компиляторе. Вот тогда посмотрим. А то, что приведенный пример заточен под конкретный компилятор - и без того ясно. Говорить об оптимизации, беря за основу 3 строки на си - по меньшей мере не адекватно. Да мне это и не особо интересно. Я всего лишь высказал свое СУБЪЕКТИВНОЕ мнение, подкрепленное некоторыми практическими знаниями, а Вы сразу обвинили меня в некомпетентности, уклонении от темы итд. GNU GPL проекты никогда не отличались качеством выше, чем у всех коммерческих проектов, утверждать обратное опрометчиво, и Вам это должно быть хорошо известно. Основная причина придумана не мной - серьезный зрелый профессионал всегда найдет, как использовать свой талант во благо своего материального благополучия. На GNU GPL же тренируются молодые перспективные программисты, которые в основной своей массе через несколько лет перестают трудится во благо всего мира, и переходят в серьезные коммерческие проекты. Так кто по Вашему лучше напишет код - молодой перспективный, или зрелый зубр? Ответ сам собой напрашивается.


--------------------
Это не то что вы подумали ...

Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Feb 27 2007, 16:32
Сообщение #27


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

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



Цитата
а GNU GPL же тренируются молодые перспективные программисты, которые в основной своей массе через несколько лет перестают трудится во благо всего мира


Линус, Эрик Реймонд безусловно дети малые biggrin.gif biggrin.gif biggrin.gif biggrin.gif biggrin.gif biggrin.gif biggrin.gif biggrin.gif
Да и Йорг Вунш уже лысину нажил.

Впрочем не увидел обещанного кода. Или он специальный невидимый?
Только пожалуйста на чистом платформонезависимом С.


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
gormih
сообщение Feb 27 2007, 16:42
Сообщение #28


nofb
***

Группа: Свой
Сообщений: 430
Регистрация: 18-05-06
Из: Москва, Зеленоград
Пользователь №: 17 218



Цитата(beer_warrior @ Feb 27 2007, 16:32) *
Цитата
а GNU GPL же тренируются молодые перспективные программисты, которые в основной своей массе через несколько лет перестают трудится во благо всего мира


Линус, Эрик Реймонд безусловно дети малые biggrin.gif biggrin.gif biggrin.gif biggrin.gif biggrin.gif biggrin.gif biggrin.gif biggrin.gif
Да и Йорг Вунш уже лысину нажил.


Читайте внимательнее. Никто не оспаривает уникальности личностей пары десятков зубров линуксостроения, однако эта пара десятков далеко не все те, кто является основным двигателем по развитию GNU GPL. Именно поэтому я написал ОСНОВНАЯ МАССА.



Цитата(beer_warrior @ Feb 27 2007, 16:32) *
Впрочем не увидел обещанного кода. Или он специальный невидимый?
Только пожалуйста на чистом платформонезависимом С.




Под рукой не нашел примера, который можно было бы так легко выложить.
А по памяти - возьмите любой универсальный драйвер под индикатор на основе hd44780, и потренеруйтесь :-)

Например вот это:

Сообщение отредактировал gormih - Feb 27 2007, 16:51
Прикрепленные файлы
Прикрепленный файл  4bitlcdscroll_20050602.zip ( 29.86 килобайт ) Кол-во скачиваний: 34
 


--------------------
Это не то что вы подумали ...

Go to the top of the page
 
+Quote Post
gormih
сообщение Mar 1 2007, 23:53
Сообщение #29


nofb
***

Группа: Свой
Сообщений: 430
Регистрация: 18-05-06
Из: Москва, Зеленоград
Пользователь №: 17 218



на сколько понимаю на этом всё


--------------------
Это не то что вы подумали ...

Go to the top of the page
 
+Quote Post
ahulap
сообщение Mar 5 2007, 16:19
Сообщение #30


Участник
*

Группа: Участник
Сообщений: 44
Регистрация: 22-06-06
Из: Kharkiv, UA
Пользователь №: 18 284



Вот еще что обнаружил:

есть маленнькая функция
static void putc(unsigned char c)
{
while ( !(UCSRA & _BV(UDRE)) ) ;
UDR = c;
}
и вызывается из очень многих мест. Но компиллятор ее везде делает инлайном, что съедает довольно много кода:
3fba: 5d 9b sbis 0x0b, 5 ; 11
3fbc: fe cf rjmp .-4 ; 0x3fba <main+0x6cc>
3fbe: 9c b9 out 0x0c, r25 ; 12

PS: оптимизация -Os. Стоит в нее добавить хотя бы один NOP - реализуется как функция и call'ы.
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Mar 5 2007, 17:22
Сообщение #31


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

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



Цитата
на сколько понимаю на этом всё

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


Впрочем почитав ваши опусы в других ветках - нет желаня тратить время на беседы с вами вообще.


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
aesok
сообщение Mar 5 2007, 18:11
Сообщение #32


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(ahulap @ Mar 5 2007, 16:19) *
Вот еще что обнаружил:

есть маленнькая функция
static void putc(unsigned char c)
{
while ( !(UCSRA & _BV(UDRE)) ) ;
UDR = c;
}
и вызывается из очень многих мест. Но компиллятор ее везде делает инлайном, что съедает довольно много кода:
3fba: 5d 9b sbis 0x0b, 5 ; 11
3fbc: fe cf rjmp .-4 ; 0x3fba <main+0x6cc>
3fbe: 9c b9 out 0x0c, r25 ; 12

PS: оптимизация -Os. Стоит в нее добавить хотя бы один NOP - реализуется как функция и call'ы.


Это нормальное поведение компилятора, попытаться оптимизировать маленькие функции. Если вы не хотите чтобы функция бала инлайновой, объявите ее с атрибутом "noinline":

static void putc(unsigned char c) __attribute__((noinline));

Анатолий.
Go to the top of the page
 
+Quote Post
ahulap
сообщение Mar 5 2007, 18:57
Сообщение #33


Участник
*

Группа: Участник
Сообщений: 44
Регистрация: 22-06-06
Из: Kharkiv, UA
Пользователь №: 18 284



Цитата(aesok @ Mar 5 2007, 17:11) *
Цитата(ahulap @ Mar 5 2007, 16:19) *

Вот еще что обнаружил:

есть маленнькая функция
static void putc(unsigned char c)
{
while ( !(UCSRA & _BV(UDRE)) ) ;
UDR = c;
}
и вызывается из очень многих мест. Но компиллятор ее везде делает инлайном, что съедает довольно много кода:
3fba: 5d 9b sbis 0x0b, 5 ; 11
3fbc: fe cf rjmp .-4 ; 0x3fba <main+0x6cc>
3fbe: 9c b9 out 0x0c, r25 ; 12

PS: оптимизация -Os. Стоит в нее добавить хотя бы один NOP - реализуется как функция и call'ы.


Это нормальное поведение компилятора, попытаться оптимизировать маленькие функции. Если вы не хотите чтобы функция бала инлайновой, объявите ее с атрибутом "noinline":

static void putc(unsigned char c) __attribute__((noinline));

Анатолий.


Спасибо! Освободил 78 байт кода.
Дело в том, что WinAVR20060125 этого не делал. Там, мне показалось, было так: если тело функции и все N-call'ов занимают больше места, чем инлайн N-раз, то функция делалась инлайном?
Go to the top of the page
 
+Quote Post
gormih
сообщение Mar 6 2007, 01:12
Сообщение #34


nofb
***

Группа: Свой
Сообщений: 430
Регистрация: 18-05-06
Из: Москва, Зеленоград
Пользователь №: 17 218



Цитата(beer_warrior @ Mar 5 2007, 17:22) *
Цитата
на сколько понимаю на этом всё

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


blink.gif

Да если честно мне платформонезависимый си грубо говоря "по барабану". Есть конкретные задачи, решать которые без привязки к платформе по меньшей мере безграмотно. Код, который не привязан к конкретной платформе это как минимум математическая задача, которая после своего решения должна быть связана интерфейсной частью с основной прогррамой. С огромной долей сомнения выскажу предположение, что математические задачи WinAVR решает лучше, чем остальные компиляторы ( smile3046.gif ) , просто потому, что таковых задач на AVR мне решать не приходилось, да как то и не приходило в голову пока что. А вот то, что касается внешних интерфейсов - то тут Вы меня точно не переубедите - проверено мной на практике - код, генерируемый WinAVR при компиляции драйверов внешних устройств (как пример LCD контроллер выше) неадекватен. Я просто даже разбираться не стал, почему это hex после winavr весит 2 кб, а в других компиляторах на порядок меньше. Мне это, как разработчику НЕ ИНТЕРЕСНО, мне важен хороший результат в кратчайшие сроки, который я с легкостью получил в другом компиляторе. Уж извините, что Вас не спросил... возможно, уважаемый beer_warrior Вы настолько круто знакомы с WinAVR, что у Вас будут другие результаты, чего Вам искренне желаю.



Цитата(beer_warrior @ Mar 5 2007, 17:22) *
Впрочем почитав ваши опусы в других ветках - нет желаня тратить время на беседы с вами вообще




Вот с этого места поподробнее.


--------------------
Это не то что вы подумали ...

Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Mar 6 2007, 10:46
Сообщение #35


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Поумерьте свой пыд, господа.
Тема уже давно себя исчерпала и нечего огонь раздувать.
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Mar 7 2007, 18:15
Сообщение #36


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



gormin довыступался до предупреждения из-за грубости и провокации религиозного спора.
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 Текстовая версия Сейчас: 18th August 2025 - 22:39
Рейтинг@Mail.ru


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