roboforum.ru

Технический форум по робототехнике.


Переход с АVR на PIC, перешедший в холивар AVR vs PIC =)

Все здесь

Re: Переход с АVR на PIC, перешедший в холивар AVR vs PIC =)

Сообщение dccharacter » 28 июн 2011, 09:34

Нам бы на авр-ах хоть одно увидеть...

__Dmitry, взял огонь на себя, выходи из боя! Повторяю, выходи из боя!
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: Переход с АVR на PIC, перешедший в холивар AVR vs PIC =)

Сообщение =DeaD= » 28 июн 2011, 09:51

Кого вам бы увидеть? :)
Проект [[Open Robotics]] - Универсальные модули для построения роботов
Аватара пользователя
=DeaD=
 
Сообщения: 24218
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов

Re: Переход с АVR на PIC, перешедший в холивар AVR vs PIC =)

Сообщение vadinator » 28 июн 2011, 10:06

А что такое - PIC? :) :lol:
Роботы, уже среди нас...
Прошу прощения за аватар, никак схему динамической индикации не могу настроить :)
Аватара пользователя
vadinator
 
Сообщения: 979
Зарегистрирован: 19 янв 2010, 14:51
Откуда: Петрозаводск
прог. языки: C, FBD, Wiring-Processimg,,,LD, SFC, ST...
ФИО: Вадим

Re: Переход с АVR на PIC, перешедший в холивар AVR vs PIC =)

Сообщение Grem » 28 июн 2011, 12:05

В РФ снова леса горят чтоли? :D
"There is nothing better than sliding down snow and flying through the air" (с) Shane McConkey.
Lieber ein Brett am Fuß als eins vorm Kopf, aber lieber ein Brett vorm Kopf als zwei am Fuß.
Аватара пользователя
Grem
 
Сообщения: 1530
Зарегистрирован: 16 май 2009, 12:50
Откуда: Россия
прог. языки: Java, C

Re: Переход с АVR на PIC, перешедший в холивар AVR vs PIC =)

Сообщение Victorovych » 30 июн 2011, 10:41

Поля :ROFL:
Аватара пользователя
Victorovych
 
Сообщения: 491
Зарегистрирован: 20 сен 2007, 11:44
Откуда: Харьков
Skype: Victorovych_FF
прог. языки: ASM
ФИО: Иван ВикторОвич

Re: Переход с АVR на PIC, перешедший в холивар AVR vs PIC =)

Сообщение =DeaD= » 30 июн 2011, 11:04

Торф! :crazy:
Проект [[Open Robotics]] - Универсальные модули для построения роботов
Аватара пользователя
=DeaD=
 
Сообщения: 24218
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов

Re: Переход с АVR на PIC, перешедший в холивар AVR vs PIC =)

Сообщение Dmitry__ » 30 июн 2011, 12:49

ты это написал, чтоб потом: "почистил флуд" ? :D
вечером поиграюсь с тестом:
http://mcu.caxapa.ru/benchmarks/
http://mcu.caxapa.ru/src/9

проверю на ATmega,PIC18,BLACKFIN
на си и асме, все могу проверить в железе

если кто наделает листингов с правильными оптимизациями, будет хорошо...
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

Re: Переход с АVR на PIC, перешедший в холивар AVR vs PIC =)

Сообщение setar » 01 июл 2011, 00:30

если время позволит, потестируй плиз, будет познавательно
Аватара пользователя
setar
Site Admin
 
Сообщения: 10989
Зарегистрирован: 04 окт 2004, 12:58
Откуда: St.Petersburg
Skype: taranenko.sergey
ФИО: Сергей Тараненко

Re: Переход с АVR на PIC, перешедший в холивар AVR vs PIC =)

Сообщение Dmitry__ » 01 июл 2011, 18:31

тест:
http://mcu.caxapa.ru/benchmarks/
http://mcu.caxapa.ru/src/9
Код: Выделить всёРазвернуть
/****************************************
source file containing three math functions. One function performs
addition of two 8-bit numbers, one performs multiplication, and one performs division. The
“main()” function calls each of these functions.
Purpose : Benchmark 8-bit math functions.
****************************************/
typedef unsigned char UInt8;
UInt8 add(UInt8 a, UInt8 b)
{return (a + b);}
UInt8 mul(UInt8 a, UInt8 b)
{return (a * b);}
UInt8 div(UInt8 a, UInt8 b)
{return (a / b);}
void main(void)
{
volatile UInt8 result[4];
result[0] = 12;
result[1] = 3;
result[2] = add(result[0], result[1]);
result[1] = mul(result[0], result[2]);
result[3] = div(result[1], result[2]);
return;
}
AVR Studio 4.18.716 скомпилил код - чистый асм :shock:
всего один глюк - двойной вызов подпрограммы
на add и mul сэкономил на call
Код: Выделить всёРазвернуть
;main
;result[0] = 12;
   ldi   r24, 0x0C
   std   Y+1, r24
;result[1] = 3;
   ldi   r24, 0x03
   std   Y+2, r24
;result[2] = add(result[0], result[1]);
   ldd   r25, Y+1
   ldd   r24, Y+2
;return (a + b);
   add   r24, r25
;result[2] = add(result[0], result[1]);
   std   Y+3, r24
;result[1] = mul(result[0], result[2]);
   ldd   r24, Y+1
   ldd   r25, Y+3
;return (a * b);
   mul   r25, r24
   mov   r24, r0
   eor   r1, r1      ;CLR       R1
;result[1] = mul(result[0], result[2]);
   std   Y+2, r24   ;Store indirect with displacement
;result[3] = div(result[1], result[2]);
   ldd   r24, Y+2
   ldd   r22, Y+3
   rcall   div
   std   Y+4, r24
;end

div:   rcall   div_2
   ret
div_2:
   sub   r25, r25
   ldi   r23, 0x09
   rjmp   a1
   rol   r25      ;Rotate Left Through Carry
   cp   r25,r22      ;Compare
   brcs   pc+0x02      ;Branch if carry set
   sub   r25,r22      ;Subtract without carry
a1:   rol   r24      ;Rotate Left Through Carry
   dec   r23      ;Decrement
   brne   pc-0x06      ;Branch if not equal
   com   r24
   ret         ;Subroutine return

MPLAB IDE v8.70 :%)
весь текст показывать смысла нет, привожу только функцию
;result[2] = add(result[0], result[1]);
в авр это 4 асмовские команды :)
Код: Выделить всёРазвернуть
   movlw   0x1    
   movff   PLUSW2, POSTINC1
   movff   INDF2, POSTINC1
   rcall   add   
   movf   POSTDEC1, F, ACCESS
   movf   POSTDEC1, F, ACCESS
   movwf   INDF1, ACCESS
   movlw   0x2   
   movff   INDF1, PLUSW2

add   movff   FSR2L, POSTINC1
   movff   FSR1L, FSR2L
   movlw   0xfd   
   movff   PLUSW2, POSTINC1
   movlw   0xfe   
   movf   PLUSW2, W, ACCESS
   movf   POSTDEC1, F, ACCESS
   addwf   INDF1, W, ACCESS
   movf   POSTDEC1, F, ACCESS
   movff   INDF1, FSR2L
   return

компилятор честно пытался сохранить все возможности сишной функции
дальше сравнивать компиляторы смысла нет :)
теперь сравниваем камни, т.е. асм
причесанный код авр:
Код: Выделить всёРазвернуть
;110 тактов
;21 такт до деления
;main
   ldi   R28,0xff
   ldi   R29,0x00
;result[0] = 12;
   ldi   r24, 0x0C
   std   Y+1, r24
;result[1] = 3;
   ldi   r24, 0x03
   std   Y+2, r24
;result[2] = add(result[0], result[1]);
   ldd   r25, Y+1
   ldd   r24, Y+2
;return (a + b);
   add   r24, r25
;result[2] = add(result[0], result[1]);
   std   Y+3, r24
;result[1] = mul(result[0], result[2]);
   ldd   r24, Y+1
   ldd   r25, Y+3
;return (a * b);
   mul   r25, r24
   mov   r24, r0
   eor   r1, r1      ;CLR       R1
;result[1] = mul(result[0], result[2]);
   std   Y+2, r24   ;Store indirect with displacement
;result[3] = div(result[1], result[2]);
   ldd   r24, Y+2
   ldd   r22, Y+3
   rcall   div
   std   Y+4, r24
   rjmp   pc+0
;end

div:   sub   r25, r25
   ldi   r23, 0x09
   rjmp   a1
   rol   r25      ;Rotate Left Through Carry
   cp   r25,r22      ;Compare
   brcs   pc+0x02      ;Branch if carry set
   sub   r25,r22      ;Subtract without carry
a1:   rol   r24      ;Rotate Left Through Carry
   dec   r23      ;Decrement
   brne   pc-0x06      ;Branch if not equal
   com   r24
   ret         ;Subroutine return

аналог кода для pic18:
Код: Выделить всёРазвернуть
;94 такта с div2 (авр библиотека)
;98 тактов с div (микрочип библиотека)
;12 тактов до деления

;result_0 0x0C
;result_1 0xB4
;result_2 0x0F
;result_3 0x0C

   LIST   P=PIC18F242
   INCLUDE P18F242.INC
cblock 8
   result_0
   result_1
   result_2
   result_3
   LoopCount
   REMB0
   AARGB0
   BARGB0
endc
   org   0
   bra   main   
div
;***********************************
; 8 bit unsigned fixed point remainder in REMB0
; Result: AARG, REM <-- AARG / BARG
FXD0808U
   clrf   REMB0
   movlw   0x8
   movwf   LoopCount
Fxd_1   rlcf   AARGB0,F
   rlcf   REMB0,F
   movf   BARGB0,W
   subwf   REMB0,W
   bnc   Fxd_0   
   movwf   REMB0
   incf   AARGB0,F
Fxd_0   decfsz   LoopCount, F
   bra   Fxd_1   
   return   
;***********************************
div2   clrf   REMB0
   movlw   0x9
   movwf   LoopCount
   bra   div2_0
div2_1   rlcf   REMB0,f
   movf   BARGB0,W
   cpfslt   REMB0      ;Compare f with WREG, skip <
   subwf   REMB0,f
div2_0   rlcf   AARGB0,f
   decfsz   LoopCount, F
   bra   div2_1
   return
;***********************************

main
;result[0] = 12;
   movlw   0xc   
   movwf   result_0
;result[1] = 3;
   movlw   0x3   
   movwf   result_1
;result[2] = add(result[0], result[1]);
   movf   result_0,w   
   addwf   result_1,w
   movwf   result_2
;result[1] = mul(result[0], result[2]);
   movf   result_0,w
   mulwf   result_2
   movff   PRODL,result_1
;result[3] = div(result[1], result[2]);
   movff   result_1,AARGB0
   movff   result_2,BARGB0
   rcall   div2   
   movff   AARGB0,result_3
   bra   $
end

результат:
до деления, пик добрался за 12 тактов, авр за 21 :)
на делении авр сократил отставание, пик 94, авр 110 :pardon:
ну, и на сладкое, пик24 за 70 рублей (36мипс) 48 тактов :beer:
Код: Выделить всёРазвернуть
;48 тактов
   .equ __24F04KA201, 1
   .include "p24F04KA201.inc"
   .global      __reset         ;The label for the first line of code

   .bss
result_0:   .space 8

   .text
__reset:
;------------------------------------------------------------------------------
;Initialize stack pointer and limit register
   mov   #__SP_init, W15      ;Initalize the Stack Pointer register
   mov   #__SPLIM_init, W0   ;Get address at the end of stack space
   mov   W0, SPLIM      ;Load the Stack Pointer Limit register
   nop            ;Add NOP to follow SPLIM initialization
;------------------------------------------------------------------------------
   mov   #result_0,w14
;result[0] = 12;
   mov.b   #0xc,w0
   mov.b   w0,[w14]
;result[1] = 3;
   mov.b #0x3,w0
   mov.b w0,[w14+1]
;result[2] = add(result[0], result[1]);
   mov.b [w14+1],w1
   add.b w0,[w14],w0   
   mov.b w0,[w14+2]
;result[1] = mul(result[0], result[2]);
   mov.b [w14+2],w1
   mov.b [w14],w0
   mul.ss w1,w0,w0
;   ze w0,w0
   mov.b w0,[w14+1]
;result[3] = div(result[1], result[2]);
   mov.b [w14+1],w1
   mov.b [w14+2],w2
   rcall div
   mov.b w0,[w14+3]

   bra   $

div:   ze w1,w1
   ze w2,w2
   repeat #17
   div.uw w1,w2
   ze w0,w0
   return

   .end
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

Re: Переход с АVR на PIC, перешедший в холивар AVR vs PIC =)

Сообщение AndreiSk » 01 июл 2011, 18:35

То есть пики лучше? ... Я так и знал :roll:
Аватара пользователя
AndreiSk
 
Сообщения: 2639
Зарегистрирован: 23 апр 2009, 17:03
Откуда: Москва, Самара
прог. языки: C#

Re: Переход с АVR на PIC, перешедший в холивар AVR vs PIC =)

Сообщение =DeaD= » 01 июл 2011, 18:51

Что быстрее то в итоге в абсолютных цифрах и при каких условиях? Такты какие-то... у них частоты одинаковые или нет?
Проект [[Open Robotics]] - Универсальные модули для построения роботов
Аватара пользователя
=DeaD=
 
Сообщения: 24218
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов

Re: Переход с АVR на PIC, перешедший в холивар AVR vs PIC =)

Сообщение Dmitry__ » 01 июл 2011, 19:19

1 / мипсы * такты = мкс. :)
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

Re: Переход с АVR на PIC, перешедший в холивар AVR vs PIC =)

Сообщение Michael_K » 01 июл 2011, 19:35

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

Вероятно нужно было бы сначала поставить формальную задачу, а потом ее запрограммировать. Задача поставлена НЕ БЫЛА.

Напротив, тест компиляторов считаю показательными, так как компиляторы поставлены как раз в одинаковые условия - скомпилировать один и тот же код.

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

Например, непонятно, с какого перепуга в AVR на асме используются одни и те же регистры для аргументов-результатов, которые зачем-то загружаются-выгружаются из памяти в память - туда-сюда. В АВР-ке много аккумуляторов и совершенно нет необходимости использовать только один из них, как это принято в ПИКе.

Непонятно также зачем вообще на такой задаче использовать ОЗУ. Это ПИК без ОЗУ работать на практике не может. АВР-ки в отличии от пика на мелких задачках без ОЗУ прекрасно обходятся (серия Тини, например, широко применяется в реальной жизни).

Впрочем, даже этот , по-моему некорректный, тест показал, что ПИК18 на 40 мегагерцах работает примерно вдвое медленнее, чем AVR на двадцати.

Добавлено спустя 2 минуты 37 секунд:
Dmitry__ писал(а):на делении авр сократил отставание, пик 94, авр 110

Это в микросекундах сколько?
Аватара пользователя
Michael_K
 
Сообщения: 6028
Зарегистрирован: 07 окт 2009, 00:29
Откуда: СПб

Re: Переход с АVR на PIC, перешедший в холивар AVR vs PIC =)

Сообщение Dmitry__ » 01 июл 2011, 20:02

я же говорю, что ты трольщик, за тебя не грех и бан получить, иди плакаться админу :)
сам думай зачем авр туда сюда память выгружает :lol:
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

Re: Переход с АVR на PIC, перешедший в холивар AVR vs PIC =)

Сообщение Michael_K » 01 июл 2011, 20:04

Не надо личных оценок и демагогии.
Дайте конкретный ответ на конкретные вопросы:

=DeaD= писал(а):Что быстрее то в итоге в абсолютных цифрах и при каких условиях?

Michael_K писал(а):Это в микросекундах сколько?
Аватара пользователя
Michael_K
 
Сообщения: 6028
Зарегистрирован: 07 окт 2009, 00:29
Откуда: СПб

Пред.След.

Вернуться в Свободное общение

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

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