Отговори на тема  [ 33 мнения ]  Отиди на страница 1, 2, 3  Следваща
dsPIC33F - оптимизация на for loop 
Автор Съобщение
Ранг: Популярен
Ранг: Популярен
Аватар

Регистриран на: Сря Фев 20, 2013 5:18 pm
Мнения: 381
Местоположение: България
Мнение 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. Ако някой има подобно примерче - да пише.

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


Пон Фев 01, 2021 10:20 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 27, 2005 12:48 pm
Мнения: 6094
Мнение Re: dsPIC33F - оптимизация на for loop
пробвай while(i--)
или си го оптимизирай на ASM, дсПИКа има нативен опер за loop мисля че беше DO

_________________
main[-1u]={1};


Пон Фев 01, 2021 10:29 am
Профил ICQ
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Вто Окт 25, 2005 10:54 am
Мнения: 896
Мнение Re: dsPIC33F - оптимизация на for loop
Е па махни дилей-а! Той ти е половината от загубата на време ако коментара му е правилен.
Закачи осцилоскоп и така подреди кода, че да получих хубав клок и данни без дилей.


Пон Фев 01, 2021 10:34 am
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Съб Окт 30, 2004 5:18 am
Мнения: 691
Мнение Re: dsPIC33F - оптимизация на for loop
Е той кода ти се изпълнява по-бързо от това изчакване от 2us. Там гледай дали може да направиш нещо.

_________________
Не мога да знам всичко,а и не искам.Тогава би било прекалено лесно и скучно!


Пон Фев 01, 2021 10:36 am
Профил
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Съб Окт 30, 2004 11:19 pm
Мнения: 609
Мнение Re: dsPIC33F - оптимизация на for loop
do..while цикъла ще е най оптималния за контрол на цикъла на С, на асемблер ще се спестят и инструкциите за въртене на цикъла.
Както каза tito оптимизиране на кода да се получи изравнен клок., и може да стигнеш около 1-1.5МХз.


Пон Фев 01, 2021 11:42 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 26, 2005 2:01 pm
Мнения: 1952
Местоположение: Варна
Мнение Re: dsPIC33F - оптимизация на for loop
А бре не се хващайте за заглавието буквално. Не му е проблема да рендоса малко тактове от оптимизиране на инструкциите които завъртат цикъла ами... има нужда от оптимизиране на това, че шифтва 64 битови променливи вътре в тялото му.
За dsPIC33F пише че има 40 битов барел шифтър, дали компилатора е генерирал код който го ползва?
Явно с този сорс който е постнал, on build time няма как компилатора да знае дали фрейма ще е само до 40 бита и ще върти и суче да прави шифтване на 64 битови променливи.
По-скоро за това му дайте съвет на човека. Delay-а вероятно търпи настройка ако може да вдигне скоростта на тялото на цикъла.

_________________
Най-опасният враг на истината и свободата е мнозинството.


Пон Фев 01, 2021 12:44 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Фев 07, 2012 11:22 pm
Мнения: 3084
Мнение Re: dsPIC33F - оптимизация на for loop
Е той иска 40+ бита, а едва ли ползва платените оптимизации.
По-скоро трябва да модифицира цикъла и да ползва инструкции съобразно архитектурата.


Пон Фев 01, 2021 1:14 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 26, 2005 2:01 pm
Мнения: 1952
Местоположение: Варна
Мнение Re: dsPIC33F - оптимизация на for loop
Мда, това плюсче ми е убягнало.
Но пък се сетих, че ако се опре до оптимизиране на самото завъртане на цикъла, една от стратегиите е loop unrolling. На цената на раздуване на размера на програмчето разбира се.
Ето един пример за ръчно(т.е. не се ползва оптимизатора на компилатора) loop unrolling:
https://en.wikipedia.org/wiki/Duff%27s_device

_________________
Най-опасният враг на истината и свободата е мнозинството.


Пон Фев 01, 2021 1:22 pm
Профил
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Съб Окт 30, 2004 11:19 pm
Мнения: 609
Мнение Re: dsPIC33F - оптимизация на for loop
Съмнявам се компилатора да ползва барел-шифт регистъра.
Шифтването ще стане с три последователни инструкции RLC, четвъртата е излишна, другата част от кода зависи от SET_DATA, MASK и DATA_STATE.


Пон Фев 01, 2021 1:28 pm
Профил
Ранг: Популярен
Ранг: Популярен
Аватар

Регистриран на: Сря Фев 20, 2013 5:18 pm
Мнения: 381
Местоположение: България
Мнение Re: dsPIC33F - оптимизация на for loop
Пробвах с while(i--) и махнах delay32().

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

Изображение


Пон Фев 01, 2021 3:02 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 27, 2005 12:48 pm
Мнения: 6094
Мнение Re: dsPIC33F - оптимизация на for loop
мързи ме да мисля - виж тва
https://microchipdeveloper.com/dsp0201:barrel-shifter

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

_________________
main[-1u]={1};


Пон Фев 01, 2021 3:19 pm
Профил ICQ
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Съб Окт 30, 2004 5:18 am
Мнения: 691
Мнение Re: dsPIC33F - оптимизация на for loop
Е клока що го правиш софтуерно? Сложи си го на някакъв брояч. Прекъсвания, дма ползвай желязото.. :roll:

_________________
Не мога да знам всичко,а и не искам.Тогава би било прекалено лесно и скучно!


Пон Фев 01, 2021 5:16 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30684
Местоположение: София
Мнение Re: dsPIC33F - оптимизация на for loop
мм това нема да му помогне, клока ще му е хардуерен но данните пак ще ги върти на ръка, то там отива времето. Защо не използваш някоя от перифериите, конкретно SPI ?


Пон Фев 01, 2021 5:52 pm
Профил
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Вто Окт 25, 2005 10:54 am
Мнения: 896
Мнение Re: dsPIC33F - оптимизация на for loop
Както казва Тони, опитай да използваш SPI за 16-те бита, а за 17тия - софтуерно клати данните и клока. Така само 1/17 ще правиш софтуерно, другите 16/17 хардуера ще ги клати, даже софтуера ще ти се опрости, щото няма да шифтваш битове...


Пон Фев 01, 2021 6:28 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30684
Местоположение: София
Мнение Re: dsPIC33F - оптимизация на for loop
Аз не знам как е реализирано при dspica, при някои процесори има начин да го прекъснеш на произволен бит, вярно със заобиколки ама работи, та виж няма ли такава възможност.


Вто Фев 02, 2021 10:16 am
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 33 мнения ]  Отиди на страница 1, 2, 3  Следваща

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 3 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни