Easyelectronics.ru

Электроника для всех
Текущее время: 17 сен 2019, 01:38

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 29 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Небольшой эксперимент в написании кода на си. Avr
СообщениеДобавлено: 25 авг 2014, 06:40 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3534
Откуда: Новосибирск
Show


IAR.

Optimization.
High:
Разница в размере кода: нижний пример меньше на 2 байта. Но выполняется почти в 2 раза медленнее.

Low, None:
Разница в размере кода: с нижним примером код становится больше на 100 с лишним байт. При Low разницы в скорости почти нет. При None нижний пример выполняется дольше на 20 мкс.

Резюме. В верхнем примере работают указатели. Изменение адреса указателей при итерациях идет изменением на размеры структуры и данных. В нижнем примере прямая установка адреса при всех операциях. Отсюда и накладные расходы.

Есть одно но. Я недавно разговаривал с коллегой, речь шла об указателях. Я работаю с AVR, тот с другими МК. И он сразу задал вопрос. Разве в моем МК аппаратные указатели?

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Небольшой эксперимент в написании кода на си. Avr
СообщениеДобавлено: 25 авг 2014, 09:22 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 3929
Откуда: КЧР, поселок Нижний Архыз
Просто компилятор дерьмовый — вот и все!
Нормальный компилятор не будет видеть разницы между верхним и нижним кодом и сделает практически одинаковый выхлоп. Оптимальный.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Небольшой эксперимент в написании кода на си. Avr
СообщениеДобавлено: 25 авг 2014, 09:35 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3534
Откуда: Новосибирск
Так, раз вы обкакали IAR, типа компилятор дерьмовый (а для меня это как раз не так, GCC очень проигрывает IAR (ATMEL при создании AVR очень тесно сотрудничали с IAR, и система команд заточена под си)).
То что, давайте сделаем эксперимент. Вы сделаете это на своем компиляторе. Только не нужно мне говорить, зачем мне это надо и так далее. Сказали, отвечайте. Заодно сверим результаты. И участникам форума думаю тоже будет интересно.
Show


Заданные значения для проверки: от 77 77 до 07 07


Вложения:
dhdeh.jpg
dhdeh.jpg [ 207.8 Кб | Просмотров: 5507 ]


Последний раз редактировалось demiurg1978 25 авг 2014, 12:44, всего редактировалось 2 раз(а).
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Небольшой эксперимент в написании кода на си. Avr
СообщениеДобавлено: 25 авг 2014, 09:56 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 3929
Откуда: КЧР, поселок Нижний Архыз
Вы бы уж тогда выложили все необходимые файлы.
Что за "messages.h"? Что за avrlibtypes.h? Что за функции wdt_enable init_sys_timer — откуда берутся?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Небольшой эксперимент в написании кода на си. Avr
СообщениеДобавлено: 25 авг 2014, 12:43 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3534
Откуда: Новосибирск
Eddy_Em писал(а):
Вы бы уж тогда выложили все необходимые файлы.
Что за "messages.h"? Что за avrlibtypes.h? Что за функции wdt_enable init_sys_timer — откуда берутся?

Выше я поправил. avrlibtypes.h:
u08 - unsigned char

Больше ничего не нужно. Проверка идет двумя функциями. Сначала подготовка буфера забиванием 0xFF. Но нам, в принципе, в данный момент это не нужно. Инициализируем буфер как на скриншоте. Хоть вручную, хоть в лоб, хоть функцией, таблицей из флеша. Функцией get_message проверяем объем кода на вариантах и в симуляторе время выполнения.

Msg_Queue [0]. num_fsm = 0x77;
Msg_Queue [0]. msg_fsm = 0x77;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Небольшой эксперимент в написании кода на си. Avr
СообщениеДобавлено: 25 авг 2014, 13:24 
Старожил

Зарегистрирован: 11 мар 2013, 17:50
Сообщения: 229
А чем 2 варианта принципиально отличаются? В том что в первом варианте обращение к структуре идет по указателю?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Небольшой эксперимент в написании кода на си. Avr
СообщениеДобавлено: 25 авг 2014, 13:36 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 3929
Откуда: КЧР, поселок Нижний Архыз
Код:
void main (void)
{
   long i;
   for(i = 0; i < 100000000L; i++)
   {
      clear_msg_queue ();
   
      get_message (0);
   }
}

Без оптимизаций, вариант "54 ien":
Код:
gcc 1.c && time ./a.out

real   0m7.837s
user   0m7.840s
sys   0m0.000s

Вариант "32 ien":
Код:
gcc 1.c && time ./a.out

real   0m7.605s
user   0m7.610s
sys   0m0.000s

С оптимизацией (-O3 не делаю, т.к. придется явно указывать компилятору не убивать основной цикл).
54:
Код:
gcc -O2 1.c && time ./a.out

real   0m3.888s
user   0m3.890s
sys   0m0.000s

32:
Код:
gcc -O2 1.c && time ./a.out

real   0m3.718s
user   0m3.723s
sys   0m0.000s


(компилировал обычным gcc, т.к. avr-gcc устанавливать лень, да и проверить негде будет — нет у меня под рукой атмеловских микроконтроллеров)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Небольшой эксперимент в написании кода на си. Avr
СообщениеДобавлено: 25 авг 2014, 13:37 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 3929
Откуда: КЧР, поселок Нижний Архыз
А вообще, отчасти я согласен: в некоторых спорных моментах лучше явно оптимизацию указать, если ты не уверен, что компилятор все правильно сделает. Но вот обращение к членам массива зачастую "автоматом" нормально оптимизируется.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Небольшой эксперимент в написании кода на си. Avr
СообщениеДобавлено: 25 авг 2014, 14:24 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3534
Откуда: Новосибирск
Eddy_Em писал(а):
(компилировал обычным gcc, т.к. avr-gcc устанавливать лень, да и проверить негде будет — нет у меня под рукой атмеловских микроконтроллеров)

Я пока только на симуляторе AVR-Studio гонял. Здесь только такты, а в этом случае симулятор не соврет.
Попробую сегодня позже в GCC собрать проект и прогнать.

Eddy_Em писал(а):
А вообще, отчасти я согласен: в некоторых спорных моментах лучше явно оптимизацию указать, если ты не уверен, что компилятор все правильно сделает. Но вот обращение к членам массива зачастую "автоматом" нормально оптимизируется.

Вот как раз из-за этого с GCC убежал на IAR. Отвратительная реализация работы с flash. Дизассемблер получается ужасный. IAR компилировал почти как я на асме писал. EEPROM я уже не проверял, но учитывая костыли с flash, допускаю что не лучше...
Ну а как с ОЗУ в GCC дела обстоят, сегодня проверю.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Небольшой эксперимент в написании кода на си. Avr
СообщениеДобавлено: 25 авг 2014, 16:43 
Заглядывает иногда

Зарегистрирован: 27 янв 2014, 22:32
Сообщения: 113
Как IAR стал родным для AVR если студия юзает AVR-GCC? Для корректности надо приводить не относительную разницу в размере кекса а абсолютные величины - 2 байта с 2 кб погоды не сделают, а оптимизация по скорости склонна разворачивать циклы, например. Под костылями понимать библиотеки для работы с флэшом? Чет сомневаюсь я в качестве вашего асемблера по сравнению с gcc шными конструкциями.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Небольшой эксперимент в написании кода на си. Avr
СообщениеДобавлено: 25 авг 2014, 17:52 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3534
Откуда: Новосибирск
celeron366 писал(а):
Как IAR стал родным для AVR если студия юзает AVR-GCC?

Уважаемый, не оправдывайте ваш ник. Прежде чем что-то утверждать, пробейте вопрос. Яндекс, "AVR история появления".

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

Дело не в 2 байтах. Это результат High optimization. А в том, насколько различаются результаты вариантов. Хотя казалось бы, и та и другая функция выполняют идентичную задачу. Этот подход с укзателями и прямой адресацией я выхватил еще когда изучал массивы и структуры.

celeron366 писал(а):
Под костылями понимать библиотеки для работы с флэшом? Чет сомневаюсь я в качестве вашего асемблера по сравнению с gcc шными конструкциями.

Я не собираюсь тратить свое время, доказывать. Просто приведу пример кодом. Попробуйте написать это в AVR Toolchain или WinAVR.
Show


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Небольшой эксперимент в написании кода на си. Avr
СообщениеДобавлено: 26 авг 2014, 05:02 
Заглядывает иногда

Зарегистрирован: 27 янв 2014, 22:32
Сообщения: 113
demiurg1978 писал(а):
велосипед

"я не собираюсь тратить свое время", доказывая что ваш код не компилится.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Небольшой эксперимент в написании кода на си. Avr
СообщениеДобавлено: 26 авг 2014, 06:38 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3534
Откуда: Новосибирск
celeron366 писал(а):
demiurg1978 писал(а):
велосипед
"я не собираюсь тратить свое время", доказывая что ваш код не компилится.

???


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Небольшой эксперимент в написании кода на си. Avr
СообщениеДобавлено: 26 авг 2014, 10:40 
Старожил

Зарегистрирован: 30 апр 2010, 22:56
Сообщения: 1578
Откуда: Киев
Код:
memmove(&Msg_Queue[cnt], &Msg_Queue[cnt+1], sizeof(msg_queue)*(MSG_QUEUE_SIZE-cnt-1));


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Небольшой эксперимент в написании кода на си. Avr
СообщениеДобавлено: 26 авг 2014, 11:32 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3534
Откуда: Новосибирск
Steel.ne писал(а):
Код:
memmove(&Msg_Queue[cnt], &Msg_Queue[cnt+1], sizeof(msg_queue)*(MSG_QUEUE_SIZE-cnt-1));

Йо-о-опт....


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Небольшой эксперимент в написании кода на си. Avr
СообщениеДобавлено: 26 авг 2014, 11:38 
Старожил

Зарегистрирован: 30 апр 2010, 22:56
Сообщения: 1578
Откуда: Киев
demiurg1978 писал(а):
Steel.ne писал(а):
Код:
memmove(&Msg_Queue[cnt], &Msg_Queue[cnt+1], sizeof(msg_queue)*(MSG_QUEUE_SIZE-cnt-1));

Йо-о-опт....

Чо не так? Раз разговор о скорости выполнения - вот основной цикл memmove:
Код:
  cc:   02 90           ld      r0, -Z
  ce:   0e 92           st      -X, r0
  d0:   41 50           subi    r20, 0x01       ; 1
  d2:   50 40           sbci    r21, 0x00       ; 0
  d4:   d8 f7           brcc    .-10            ; 0xcc <memmove+0x14>


быстрее ни указателями и массивом не будет. Да, будут накладные расходы на вызов функции, но они разовые, а не в цикле


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Небольшой эксперимент в написании кода на си. Avr
СообщениеДобавлено: 26 авг 2014, 13:05 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3534
Откуда: Новосибирск
Steel.ne писал(а):
demiurg1978 писал(а):
Йо-о-опт....

Чо не так?

Все так. Как все просто можно было сделать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Небольшой эксперимент в написании кода на си. Avr
СообщениеДобавлено: 26 авг 2014, 20:41 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3534
Откуда: Новосибирск
Steel.ne писал(а):
memmove

Речи нет. Запись в одну строку. Но!...
И вы не выложили весь дизассемблер memmove...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Небольшой эксперимент в написании кода на си. Avr
СообщениеДобавлено: 26 авг 2014, 20:48 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3534
Откуда: Новосибирск
Steel.ne писал(а):
memmove
Нафик ваш memmove в данном случае. Поправки на размеры элементов структуры сводит на нет всю эту одну строку.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Небольшой эксперимент в написании кода на си. Avr
СообщениеДобавлено: 26 авг 2014, 20:50 
Старожил

Зарегистрирован: 30 апр 2010, 22:56
Сообщения: 1578
Откуда: Киев
не выложил. Но упомянул, что накладные расходы есть. 25 команд, библиотечная функция. Если надо оптимизацию - то можно использовать memcpy, добавится всего девять команд, из них четыре вне цикла.

Что мы оптимизируем?

ps. И что ж там страшного в поправках-то?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Небольшой эксперимент в написании кода на си. Avr
СообщениеДобавлено: 26 авг 2014, 21:12 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3534
Откуда: Новосибирск
Steel.ne писал(а):
Что мы оптимизируем?

Как бы специально ничего не оптимизирую. Смотрю, что получается при разных вариантах. И выбираю оптимальный.
Этот эксперимент я пока заканчиваю. Я пока отказался от такого способа.
Буду делать следующее:
Общий кольцевой буфер сообщений. Для всех модулей. В некоторых модулях, КА будет свой буфер сообщений.
При каждой итерации модули забирают из общего кольцевого буфера свои сообщения в свои локальные буферы. И там разбираются, что с ними делать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Небольшой эксперимент в написании кода на си. Avr
СообщениеДобавлено: 23 сен 2014, 10:05 
Старожил

Зарегистрирован: 06 фев 2011, 15:16
Сообщения: 617
Откуда: Челябинск
Steel.ne писал(а):
Чо не так? Раз разговор о скорости выполнения - вот основной цикл memmove:
Код:
  cc:   02 90           ld      r0, -Z
  ce:   0e 92           st      -X, r0
  d0:   41 50           subi    r20, 0x01       ; 1
  d2:   50 40           sbci    r21, 0x00       ; 0
  d4:   d8 f7           brcc    .-10            ; 0xcc <memmove+0x14>

быстрее ни указателями и массивом не будет. Да, будут накладные расходы на вызов функции, но они разовые, а не в цикле

Между прочим, эту функцию можно сделать побыстрее, если вместо пары команд subi-sbci использовть одну инструкцию sbiw. Или нет?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Небольшой эксперимент в написании кода на си. Avr
СообщениеДобавлено: 23 сен 2014, 12:01 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3534
Откуда: Новосибирск
Bill писал(а):
Steel.ne писал(а):
Чо не так? Раз разговор о скорости выполнения - вот основной цикл memmove:
Код:
  cc:   02 90           ld      r0, -Z
  ce:   0e 92           st      -X, r0
  d0:   41 50           subi    r20, 0x01       ; 1
  d2:   50 40           sbci    r21, 0x00       ; 0
  d4:   d8 f7           brcc    .-10            ; 0xcc <memmove+0x14>

быстрее ни указателями и массивом не будет. Да, будут накладные расходы на вызов функции, но они разовые, а не в цикле

Между прочим, эту функцию можно сделать побыстрее, если вместо пары команд subi-sbci использовть одну инструкцию sbiw. Или нет?

Как заставить компилятор применить эту команду? Я пересел на си, и как бы уже забил на подсчет тактов и байтов. Но порой бывают моменты, хотелось бы соптимизировать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Небольшой эксперимент в написании кода на си. Avr
СообщениеДобавлено: 23 сен 2014, 12:17 
Старожил

Зарегистрирован: 17 сен 2013, 13:53
Сообщения: 3302
По идее вклинить ассемблерный код в тело Сишной функции с помощью inline assembler.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Небольшой эксперимент в написании кода на си. Avr
СообщениеДобавлено: 23 сен 2014, 14:48 
Старожил
Аватара пользователя

Зарегистрирован: 23 янв 2012, 00:31
Сообщения: 1797
Откуда: Новокузнецк
fr0ster писал(а):
По идее вклинить ассемблерный код в тело Сишной функции с помощью inline assembler.

Если это повредит читаемости кода, то лучше ничего не делать. Меньше проблем будет. На крайний случай оставить пометку что в этом месте возможна оптимизация на 1 такт. И забыть об этом, потому что это никогда не понадобится.

_________________
elisey.su


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 29 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB