Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

dsPIC33F - оптимизация на for loop
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=17742
Страница 1 от 3

Автор:  stewie [ Пон Фев 01, 2021 10:20 am ]
Заглавие:  dsPIC33F - оптимизация на for loop

Здравейте,

Имам един dsPIC33F, който се ползва за серийна комуникация с периферно устройство, Протоколът е подобен на SPI, но няма CS и дължината на трансферите не е фиксирана - варира между 10 и 40+ бита. За момента ползвам следния код:
Код:
       
        uint64_t frame = 0x0;
        // Create frame here
        uint64_t response = 0x0;

        // Shift out the n bits of the frame
        for (; i < n; i++)
        {
            SET_DATA((frame & MASK) ? 1 : 0);         // Set serial bit - this macro sets/resets LATx bit
            frame <<= 1;                                       // Left shift data
            CLK_HIGH;                                          // Clock
            __delay32(80);                                    // Gives 2us delay to make clock state times roughly equal
            response|= DATA_STATE;                      // Copy data on input pin to response
            response<<= 1;
            CLK_LOW;
        }


Кодът работи, но for цикълът бави доста и максималната честота, която постигам, е около 250 kHz. Искам да го оптимизирам малко, че да стане по-бърз, и мисля да позлвам inline assembly. Ако някой има подобно примерче - да пише.

Иначе по какъв друг начин мога да оптимизирам кода?

Автор:  TheWizard [ Пон Фев 01, 2021 10:29 am ]
Заглавие:  Re: dsPIC33F - оптимизация на for loop

пробвай while(i--)
или си го оптимизирай на ASM, дсПИКа има нативен опер за loop мисля че беше DO

Автор:  t_i_t_o [ Пон Фев 01, 2021 10:34 am ]
Заглавие:  Re: dsPIC33F - оптимизация на for loop

Е па махни дилей-а! Той ти е половината от загубата на време ако коментара му е правилен.
Закачи осцилоскоп и така подреди кода, че да получих хубав клок и данни без дилей.

Автор:  nobodyshadow [ Пон Фев 01, 2021 10:36 am ]
Заглавие:  Re: dsPIC33F - оптимизация на for loop

Е той кода ти се изпълнява по-бързо от това изчакване от 2us. Там гледай дали може да направиш нещо.

Автор:  Ники [ Пон Фев 01, 2021 11:42 am ]
Заглавие:  Re: dsPIC33F - оптимизация на for loop

do..while цикъла ще е най оптималния за контрол на цикъла на С, на асемблер ще се спестят и инструкциите за въртене на цикъла.
Както каза tito оптимизиране на кода да се получи изравнен клок., и може да стигнеш около 1-1.5МХз.

Автор:  Zdrav [ Пон Фев 01, 2021 12:44 pm ]
Заглавие:  Re: dsPIC33F - оптимизация на for loop

А бре не се хващайте за заглавието буквално. Не му е проблема да рендоса малко тактове от оптимизиране на инструкциите които завъртат цикъла ами... има нужда от оптимизиране на това, че шифтва 64 битови променливи вътре в тялото му.
За dsPIC33F пише че има 40 битов барел шифтър, дали компилатора е генерирал код който го ползва?
Явно с този сорс който е постнал, on build time няма как компилатора да знае дали фрейма ще е само до 40 бита и ще върти и суче да прави шифтване на 64 битови променливи.
По-скоро за това му дайте съвет на човека. Delay-а вероятно търпи настройка ако може да вдигне скоростта на тялото на цикъла.

Автор:  stefan63 [ Пон Фев 01, 2021 1:14 pm ]
Заглавие:  Re: dsPIC33F - оптимизация на for loop

Е той иска 40+ бита, а едва ли ползва платените оптимизации.
По-скоро трябва да модифицира цикъла и да ползва инструкции съобразно архитектурата.

Автор:  Zdrav [ Пон Фев 01, 2021 1:22 pm ]
Заглавие:  Re: dsPIC33F - оптимизация на for loop

Мда, това плюсче ми е убягнало.
Но пък се сетих, че ако се опре до оптимизиране на самото завъртане на цикъла, една от стратегиите е loop unrolling. На цената на раздуване на размера на програмчето разбира се.
Ето един пример за ръчно(т.е. не се ползва оптимизатора на компилатора) loop unrolling:
https://en.wikipedia.org/wiki/Duff%27s_device

Автор:  Ники [ Пон Фев 01, 2021 1:28 pm ]
Заглавие:  Re: dsPIC33F - оптимизация на for loop

Съмнявам се компилатора да ползва барел-шифт регистъра.
Шифтването ще стане с три последователни инструкции RLC, четвъртата е излишна, другата част от кода зависи от SET_DATA, MASK и DATA_STATE.

Автор:  stewie [ Пон Фев 01, 2021 3:02 pm ]
Заглавие:  Re: dsPIC33F - оптимизация на for loop

Пробвах с while(i--) и махнах delay32().

Честотата се покачи почти двойно и все още работи, но все още има място за работа - clock low фазата е почти два пъти по-дълга от clock high. Затова мисля да пробвам с асембли и left shift through carry. Не си спомням много добре как ставаше, останал ми е само спомен, че може - затова питам.

Изображение

Автор:  TheWizard [ Пон Фев 01, 2021 3:19 pm ]
Заглавие:  Re: dsPIC33F - оптимизация на for loop

мързи ме да мисля - виж тва
https://microchipdeveloper.com/dsp0201:barrel-shifter

http://ww1.microchip.com/downloads/en/d ... 05158b.pdf стр 31

Автор:  nobodyshadow [ Пон Фев 01, 2021 5:16 pm ]
Заглавие:  Re: dsPIC33F - оптимизация на for loop

Е клока що го правиш софтуерно? Сложи си го на някакъв брояч. Прекъсвания, дма ползвай желязото.. :roll:

Автор:  ToHu [ Пон Фев 01, 2021 5:52 pm ]
Заглавие:  Re: dsPIC33F - оптимизация на for loop

мм това нема да му помогне, клока ще му е хардуерен но данните пак ще ги върти на ръка, то там отива времето. Защо не използваш някоя от перифериите, конкретно SPI ?

Автор:  t_i_t_o [ Пон Фев 01, 2021 6:28 pm ]
Заглавие:  Re: dsPIC33F - оптимизация на for loop

Както казва Тони, опитай да използваш SPI за 16-те бита, а за 17тия - софтуерно клати данните и клока. Така само 1/17 ще правиш софтуерно, другите 16/17 хардуера ще ги клати, даже софтуера ще ти се опрости, щото няма да шифтваш битове...

Автор:  ToHu [ Вто Фев 02, 2021 10:16 am ]
Заглавие:  Re: dsPIC33F - оптимизация на for loop

Аз не знам как е реализирано при dspica, при някои процесори има начин да го прекъснеш на произволен бит, вярно със заобиколки ама работи, та виж няма ли такава възможност.

Страница 1 от 3 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/