WinAvr в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
Avarges
Вымогатель припоя
Сообщения: 512
Зарегистрирован: Вт дек 22, 2009 02:24:50
Контактная информация:

Re: WinAvr в вопросах и ответах

Сообщение Avarges »

У меня откомпилировалось так (с ключом -Os):

Код: Выделить всё

void f1(char val)
{
   a += val;
  6e:   80 91 68 00    lds   r24, 0x0068
  72:   8d 5f          subi   r24, 0xFD   ; 253
  74:   80 93 68 00    sts   0x0068, r24
   b -= val;
  78:   80 91 60 00    lds   r24, 0x0060
  7c:   83 50          subi   r24, 0x03   ; 3
  7e:   80 93 60 00    sts   0x0060, r24
   c++;
  82:   80 91 62 00    lds   r24, 0x0062
  86:   8f 5f          subi   r24, 0xFF   ; 255
  88:   80 93 62 00    sts   0x0062, r24


Код: Выделить всё

void f2(char val)
{
   struc *ptr;

   ptr->a += val;
  6e:   e0 e0          ldi   r30, 0x00   ; 0
  70:   f0 e0          ldi   r31, 0x00   ; 0
  72:   80 81          ld   r24, Z
  74:   8d 5f          subi   r24, 0xFD   ; 253
  76:   80 83          st   Z, r24
   ptr->b -= val;
  78:   81 81          ldd   r24, Z+1   ; 0x01
  7a:   83 50          subi   r24, 0x03   ; 3
  7c:   81 83          std   Z+1, r24   ; 0x01
   ptr->c++;
  7e:   82 81          ldd   r24, Z+2   ; 0x02
  80:   8f 5f          subi   r24, 0xFF   ; 255
  82:   82 83          std   Z+2, r24   ; 0x02


Код: Выделить всё

void f3(char val)
{
   str.a += val;
  6e:   80 91 65 00    lds   r24, 0x0065
  72:   8d 5f          subi   r24, 0xFD   ; 253
  74:   80 93 65 00    sts   0x0065, r24
   str.b -= val;
  78:   80 91 66 00    lds   r24, 0x0066
  7c:   83 50          subi   r24, 0x03   ; 3
  7e:   80 93 66 00    sts   0x0066, r24
   str.c++;
  82:   80 91 67 00    lds   r24, 0x0067
  86:   8f 5f          subi   r24, 0xFF   ; 255
  88:   80 93 67 00    sts   0x0067, r24


То есть:

f1 - 30 байт
f2 - 22
f3 - 30

Уж не знаю кого это порадует, лень 2 страницы флуда разбирать :)
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: WinAvr в вопросах и ответах

Сообщение Мастер Ломастер »

Avarges писал(а):У меня откомпилировалось так (с ключом -Os):
версию компилятора огласите и тип МК под который проект собран. для чистоты эксперимента :)

а порадовать это может меня, т.к. я с самой первой своей фразы говорил, что выгода от использования структур далеко не очевидна, как и проигрыш. в том и убедились: 4 экспериментатора и 2 качественно разных результата :) безаппеляционность утверждений, даже со ссылками на "авторитетов" никого не возвышает :)
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
BCluster
Собутыльник Кота
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев
Контактная информация:

Re: WinAvr в вопросах и ответах

Сообщение BCluster »

О ща в 5 студии проверю ) По 170 байт каждая. На таком фуфле тенденцию отследить нифига не получится. Я хз как в авр студии 5 глянуть ассемблер, не работаю я с авр уже давным давно, если кто подскажет как я скину листинги

На самом деле механизм позволяющий при помощи структур экономить память программ понятен. Но это далеко не первая причина для их использования. ХЗ, в нашем текущем проекте, если бы не было структур, было бы невозможно разобраться. Однако я не знаю как в АВР, а вот gcc для msp430 выравнивает структуры, что жрет ОЗУ :) Можно много болтать кароче ) Факт есть факт - структуры все равно будут использовать, потому что это удобно. А еще есть юнионы, которыми можно тоже хорошо экономить в некоторых условиях, но меня они немного выводят потому что брр, ну не об этом речь сейчас
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Re: WinAvr в вопросах и ответах

Сообщение BerZerK-ku »

BCluster писал(а):Неа Совсем По крайней мере с вашими настройками - 166 байт (O1). Во всех трех случаях.

Мастер Ломастер писал(а):абсолютно аналогичные результаты!
просто любопытно, что будет сказано болтуном теперь? независимый тестер появился
:)) Попались.
А теперь , если не поленитесь, закомментируйте не только вызовы, но и сами лишние функции.
Результаты такие:
Если в программе находятся все 3 функции (вызывается только одна из них) , код 166 байт.
Если только f1: 114
Если только f2: 106
Если только f3: 110.
При этом листинг кода явно показывает, что с момента написания рекомендаций действия компилятора в данной области не изменились.
Данные результаты идут в подтверждение отстаиваемой мной точки зрения?
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: WinAvr в вопросах и ответах

Сообщение Мастер Ломастер »

вы наредкость утомительный болтун.
1. я нигде не утверждал, что использование структур НЕ ПОЗВОЛЯЕТ достичь экономии памяти программ.
2. я нигде не утверждал, что использование структур ПРИВЕДЕТ К РОСТУ расходов памяти программ
3. я постоянно требовал подтверждения или опровержения вашего тезиса об экономии реальными фактами
4. тот код, который вы прислали, есть профанация чистой воды, пример вне реального контекста, БРЕД, иначе говоря. об этом вам даже другие люди говорят. ваш пример НИЧЕГО не доказывает.
5. что касается вашего якобы каверзного вопроса из последнего поста, то он в свете ранее сказанного просто смешон. ВАШ КОД НИЧЕГО НЕ ДОКАЗЫВАЕТ (повторюсь). точнее, он подтверждает следующее утверждение:
в некоторых случаях при определенных усилиях программиста по написанию определенного кода применение структур может дать незначительный выигрыш в объеме кода. ровно такое же утверждение можно дать по поводу сотни программистских приемов - иногда, в некоторых случаях и т.д. и т.п. все это лишь варианты, но никак не однозначность. если вы приведете пример программы, в которой не 2 функции по три строки, а 500 функций по 200 строк, то еще очень большой вопрос, будет ли экономия благодаря структурам или нет, ведь на передачу параметров и сохранение контекста в стеке требуются так же усилия компилятора, т.е. обращение через указатель к структуре может дать экономию в 4 байта, а сохранение его в стеке и присвоение начального его значения даст накладные в 6 байт... это еще надо выяснять.

в частности, вы так и не прокомментировали тот факт, что ранее я приводил: в коде нет обращения к вашим функциям, т.к. они не делают ничего, и выбрасываются компилятором вообще :)

а если сделать все три функции static, то результат будет совершенно противоположный (компилировал по вашей рекомендации - путем исключения "лишних" функций из кода вообще ):
f1 - 78 байт (тупо переменные)
f2 - 100 байт (структура через указатель)
f3 - 112 байт (структура через поля напрямую)
листинги приводить? ;) и что это доказывает? что вы упертый болтун? это уже было доказано совсем другим способом :) это не доказывает ничего на самом деле. тем более с учетом того, что код для примера дурацкий.

вывод только один: нельзя утверждать однозначно, что использование ЛЮБОГО отдельно взятого метода оптимизации кода программы дает БЕЗУСЛОВНЫЙ эффект по уменьшению объема результирующего кода. из данной фразы нельзя убрать какое-то слово или заменить неопределенное "любого" на конкретное "структуры", "указатели" или что-то еще - утверждение сразу станет не истинным.
битва с дураками проиграна, победители торжествуют. слава победителям!
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: WinAvr в вопросах и ответах

Сообщение Мастер Ломастер »

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

Код: Выделить всё

#include <avr\io.h>
#include <util\delay.h>


char a, b, c, a1, b1, c1, a2, b2, c2, a3, b3, c3;

typedef struct
{
   char a;
   char b;
   char c;
} struc;

struc str, str1, str2, str3;


void f1(char val)
{
   a1 += val + c2 - a + a3;
   b -= val * b1 + c + b3;
   c = b2 / b1 + a * c2 + c3;
}


void f2(char val)
{
   struc *ptr = &str, *ptr1 = &str1, *ptr2 = &str2, *ptr3 = & str3;

   ptr1->a += val + ptr2->c - ptr->a + ptr3->a;
   ptr->b -= val * ptr1->b + ptr->c + ptr3->b;
   ptr->c = ptr2->b / ptr1->b + ptr->a * ptr2->c + ptr3->c;
}


void f3(char val)
{
   str1.a += val + str2.c - str.a + str3.a;
   str.b -= val * str1.b + str.c + str3.b;
   str.c = str2.b / str1.b + str.a * str2.c + str3.c;
}


int main(void)
{
   while(1)
   {
      f1(3);
      f2(3);
      f3(3);
   }
}


как видите, всего лишь увеличил количество задействованных переменных/структур. разница видна по листингку - желающие могут сами посмотреть, но поверьте, она есть, и она явно В ПОЛЬЗУ простых переменных. а если число структур сделать равным ТРЕМ - разница в объеме кода снова исчезает. зато может появиться при ДВУХ структурах - на этот раз в пользу "теории" :)

разумеется, в упомянутом "документе" об этом тоже упомянуто... но сути вещей это не меняет - структуры нельзя считать гарантированным средством экономии памяти программ!
битва с дураками проиграна, победители торжествуют. слава победителям!
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Re: WinAvr в вопросах и ответах

Сообщение BerZerK-ku »

:)) и опять не прокатило. Уже и приведенный пример не является реальным фактом. Хотя когда своими бездарными действиями вы получали одинаковый размер кода для всех случаев, тыкали этим в лицо.
А теперь вопрос: а разве я говорил что применение структуры дает выигрыш всегда? А вот ваши слова:
Мастер Ломастер писал(а):структуры не экономят абсолютно ни одного байта - это лишь способ УПОРЯДОЧИВАНИЯ ПЕРЕМЕННЫХ
См. пример выше.

P.S. Если руки из жопы, то только на оптимизацию компилятора и можно надеяться.
Последний раз редактировалось BerZerK-ku Пт дек 30, 2011 08:17:35, всего редактировалось 1 раз.
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: WinAvr в вопросах и ответах

Сообщение Мастер Ломастер »

опасаюсь прослыть болтуном, как и мой "оппонент", но деваться некуда - обнаружил очереднюу ЛАЖУ в коде, который нам всем предоставил человек, усомнившийся в моей компетенции. посмотрите внимательно на ЕГО код в example.rar, а именно функцию f2 - ту самую, которая призвана доказать ЭФФЕКТИВНОСТЬ МЕТОДА. вот ее код:

Код: Выделить всё

void f2(char val)
{
   struc *ptr;

   ptr->a += val;
   ptr->b -= val;
   ptr->c++;
}
где здесь присваивание значения указателю?! нету его! разумеется, это ПОЛНОСТЬЮ нерабочий код, но после небольшой коррекции

Код: Выделить всё

void f2(char val)
{
   struc *ptr = &str;

   ptr->a += val;
   ptr->b -= val;
   ptr->c++;
}


ну что, BerZerK-ku, и дальше будете сомневаться в моей компетенции? или мне еще поискать ошибок в ваших "примерах"? ;) а в моих-то кодах вы не нашли ошибок, и даже свои туманные заявления о том, что мой код работает как-то не так, ничем не доказали...
битва с дураками проиграна, победители торжествуют. слава победителям!
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: WinAvr в вопросах и ответах

Сообщение Мастер Ломастер »

BerZerK-ku писал(а):А теперь вопрос: а разве я говорил что применение структуры дает выигрыш всегда?
если цитируете, цитируйте полностью:
BerZerK-ku писал(а):
Мастер Ломастер писал(а):структуры не экономят абсолютно ни одного байта - это лишь способ УПОРЯДОЧИВАНИЯ ПЕРЕМЕННЫХ
Память данных нет, а вот сэкономить память программ поможет.

я говорил о памяти данных, и тут вы со мной согласились, тут же добавив УТВЕРЖДЕНИЕ ОБ ЭКОНОМИИ ПАМЯТИ ПРОГРАММ.

по поводу "руки из жопы" - пока что в вашем коде найдено несколько ЛЯПОВ, а не в моем. и моя "перчатка" брошена вам давно - хотите доказать, что ваши руки не из того же места, которым вы думаете, выросли? давайте соревноваться. а иначе можете оставить свой "сарказм" при себе.
битва с дураками проиграна, победители торжествуют. слава победителям!
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Re: WinAvr в вопросах и ответах

Сообщение BerZerK-ku »

Я говорил что поможет сэкономить, при имении рук описанных выше это не работает.
Ну ляп то был, но сути не поменяло. Разница же в коде осталась?
Перчатку бросили давно а ТЗ не вижу :dont_know:
Последний раз редактировалось BerZerK-ku Пт дек 30, 2011 08:27:34, всего редактировалось 1 раз.
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: WinAvr в вопросах и ответах

Сообщение Мастер Ломастер »

BerZerK-ku писал(а):Хотя когда своими бездарными действиями вы получали одинаковый размер кода для всех случаев
какими же именно "бездарными"? просто тупо нажимая на кнопки Build? не знгал, что тут требуется какая-то одаренность... видимо, в вашем случае это на самом деле так, но в моем тыкнуть мышкой в кнопку на самом деле наредкость рутинная операция, совершенно не затрагивающая мой интеллект...
битва с дураками проиграна, победители торжествуют. слава победителям!
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: WinAvr в вопросах и ответах

Сообщение Мастер Ломастер »

BerZerK-ku писал(а):Ну ляп то был, но сути не поменяло. Разница же в коде осталась?
Перчатку бросили давно а ТЗ не вижу :dont_know:

про разницу в коде я вам писал давеча: она то есть, то ее нет, то есть, но не в вашу пользу... в среднем - нет ее.

а по поводу перчатки - где это было видано, чтобы право выбора оружия было за тем, кто бросил вызов?! сударь, вы меня оскорбляете таким предложением! :))) ТЗ за вами
битва с дураками проиграна, победители торжествуют. слава победителям!
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Re: WinAvr в вопросах и ответах

Сообщение BerZerK-ku »

:)) к сожалению с правилами хорошего тона не знаком. ваша идея - работайте
Эм-м-м, то вы хотели увидеть разницу в коде? Пример привел. А веры в работоспособность так и не появилось :dont_know:
Мастер Ломастер писал(а):
BerZerK-ku писал(а):Хотя когда своими бездарными действиями вы получали одинаковый размер кода для всех случаев
какими же именно "бездарными"? просто тупо нажимая на кнопки Build? не знгал, что тут требуется какая-то одаренность... видимо, в вашем случае это на самом деле так, но в моем тыкнуть мышкой в кнопку на самом деле наредкость рутинная операция, совершенно не затрагивающая мой интеллект...
А это и есть бездумность. Выставить оптимизацию на максимум и надеяться что компилятор реализует вашу идею в лучшем виде. И при этом еще удивляться, а куда же делся код ?!
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: WinAvr в вопросах и ответах

Сообщение Мастер Ломастер »

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

оптимизация для того и существует, чтобы пользоваться максимумом возможностей компилятора. не бездумно, а осознанно. а вот тупо следовать советам древнего документа - это и есть бездумный подход: надеяться, что метод дедушки сработает и сегодня. а он срабатывает далеко не всегда, как я и другие вам доказали. если число используемых для работы со структурами указателей превышает три - генерируемый код получается весьма неоптимальным, и, очень вероятно, будет более громоздким, нежели прямое обращение к переменным. если указателей меньше - результат сильно зависит от контекста - т.е. неоднозначен. и только в случае единственного указателя и функции с единственным параметром можно почти быть уверенным, что код будет меньше. но все равно - ПОЧТИ уверенным, а не уверенным абсолютно.
битва с дураками проиграна, победители торжествуют. слава победителям!
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Re: WinAvr в вопросах и ответах

Сообщение BerZerK-ku »

:facepalm: меня оказывается еще и бьют тут
Повторение, мать учения: если "бездумно" писать программу, то и оптимизация не поможет. Если пользоваться по месту нехитрыми советами, то и оптимизация не даст большого выигрыша ( хотя тут надо заметить, что опция О0 это тихий ужас)

О каком "максимуме возможностей" вы говорите, если при богатом опыте программирования и использования WinAVR не в курсе элементарного факта: компилятор включает в код неиспользуемые функции :shock:
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: WinAvr в вопросах и ответах

Сообщение Мастер Ломастер »

BerZerK-ku писал(а):О каком "максимуме возможностей" вы говорите, если при богатом опыте программирования и использования WinAVR не в курсе элементарного факта: компилятор включает в код неиспользуемые функции :shock:

обнять и плакать, как говорил один форумчанин :)))

не знаю, смогу ли вас удивить... но тот факт, что компилятор включает в код неиспользуемые функции, я знаю так же хорошо, как и тот метод, при помощи которого можно оттуда их убрать (неиспользуемые функции из кода я имею ввиду - не подумайте чего иного). да и опыт программирования у меня всего лишь приличный, а не богатый... :)))
битва с дураками проиграна, победители торжествуют. слава победителям!
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Re: WinAvr в вопросах и ответах

Сообщение BerZerK-ku »

:)) Странно, если вы об этом знаете, то почему тогда получали одинаковый код для моего примера?
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: WinAvr в вопросах и ответах

Сообщение Мастер Ломастер »

Мастер Ломастер писал(а):а если сделать все три функции static, то результат будет совершенно противоположный (компилировал по вашей рекомендации - путем исключения "лишних" функций из кода вообще ):
f1 - 78 байт (тупо переменные)
f2 - 100 байт (структура через указатель)
f3 - 112 байт (структура через поля напрямую)
листинги приводить? ;)
почему же одинаковый? вы читать не умеете?
битва с дураками проиграна, победители торжествуют. слава победителям!
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Re: WinAvr в вопросах и ответах

Сообщение BerZerK-ku »

Мастер Ломастер писал(а):
BCluster писал(а):По крайней мере с вашими настройками - 166 байт (O1).

абсолютно аналогичные результаты! :)))
А это враги написали?
А ваши познания в С еще хуже чем я подозревал. Вы так походя, не глядя, превратили глобальные функции в локальные и считаете что от этого ничего не изменилось :facepalm:
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: WinAvr в вопросах и ответах

Сообщение Мастер Ломастер »

BerZerK-ku писал(а):
Мастер Ломастер писал(а):
BCluster писал(а):По крайней мере с вашими настройками - 166 байт (O1).

абсолютно аналогичные результаты! :)))
А это враги написали?
А ваши познания в С еще хуже чем я подозревал. Вы так походя, не глядя, превратили глобальные функции в локальные и считаете что от этого ничего не изменилось :facepalm:

писали это люди, которые ВАШ КОД компилировали - без отсебятины. мои посты вы отлично можете отделить от не моих.

а по поводу последнего высказывания прошу ответить и мне, "плохо знающему Си": что именно В ВАШЕМ ПРИМЕРЕ поменялось от того, что функции стали static? изменилась его функциональность? он стал иначе работать? или что-то еще случилось? только конкретно В ВАШЕМ КОДЕ, а не абстрактно вообще теоретически.
битва с дураками проиграна, победители торжествуют. слава победителям!
Ответить

Вернуться в «AVR»