| Автор |
Съобщение |
|
stewie
Ранг: Популярен
Регистриран на: Сря Фев 20, 2013 5:18 pm Мнения: 381 Местоположение: България
|
 dsPIC33F - оптимизация на for loop
Здравейте, Имам един dsPIC33F, който се ползва за серийна комуникация с периферно устройство, Протоколът е подобен на SPI, но няма CS и дължината на трансферите не е фиксирана - варира между 10 и 40+ бита. За момента ползвам следния код: Кодът работи, но for цикълът бави доста и максималната честота, която постигам, е около 250 kHz. Искам да го оптимизирам малко, че да стане по-бърз, и мисля да позлвам inline assembly. Ако някой има подобно примерче - да пише. Иначе по какъв друг начин мога да оптимизирам кода?
|
| Пон Фев 01, 2021 10:20 am |
|
 |
|
TheWizard
Ранг: Форумен бог
Регистриран на: Сря Апр 27, 2005 12:48 pm Мнения: 6094
|
 Re: dsPIC33F - оптимизация на for loop
пробвай while(i--) или си го оптимизирай на ASM, дсПИКа има нативен опер за loop мисля че беше DO
_________________ main[-1u]={1};
|
| Пон Фев 01, 2021 10:29 am |
|
 |
|
t_i_t_o
Ранг: Почетен член
Регистриран на: Вто Окт 25, 2005 10:54 am Мнения: 896
|
 Re: dsPIC33F - оптимизация на for loop
Е па махни дилей-а! Той ти е половината от загубата на време ако коментара му е правилен. Закачи осцилоскоп и така подреди кода, че да получих хубав клок и данни без дилей.
|
| Пон Фев 01, 2021 10:34 am |
|
 |
|
nobodyshadow
Ранг: Почетен член
Регистриран на: Съб Окт 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 |
|
 |
|
Zdrav
Ранг: Форумен бог
Регистриран на: Сря Яну 26, 2005 2:01 pm Мнения: 1952 Местоположение: Варна
|
 Re: dsPIC33F - оптимизация на for loop
А бре не се хващайте за заглавието буквално. Не му е проблема да рендоса малко тактове от оптимизиране на инструкциите които завъртат цикъла ами... има нужда от оптимизиране на това, че шифтва 64 битови променливи вътре в тялото му. За dsPIC33F пише че има 40 битов барел шифтър, дали компилатора е генерирал код който го ползва? Явно с този сорс който е постнал, on build time няма как компилатора да знае дали фрейма ще е само до 40 бита и ще върти и суче да прави шифтване на 64 битови променливи. По-скоро за това му дайте съвет на човека. Delay-а вероятно търпи настройка ако може да вдигне скоростта на тялото на цикъла.
_________________ Най-опасният враг на истината и свободата е мнозинството.
|
| Пон Фев 01, 2021 12:44 pm |
|
 |
|
stefan63
Ранг: Форумен бог
Регистриран на: Вто Фев 07, 2012 11:22 pm Мнения: 3084
|
 Re: dsPIC33F - оптимизация на for loop
Е той иска 40+ бита, а едва ли ползва платените оптимизации. По-скоро трябва да модифицира цикъла и да ползва инструкции съобразно архитектурата.
|
| Пон Фев 01, 2021 1:14 pm |
|
 |
|
Zdrav
Ранг: Форумен бог
Регистриран на: Сря Яну 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 |
|
 |
|
stewie
Ранг: Популярен
Регистриран на: Сря Фев 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 |
|
 |
|
TheWizard
Ранг: Форумен бог
Регистриран на: Сря Апр 27, 2005 12:48 pm Мнения: 6094
|
 Re: dsPIC33F - оптимизация на for loop
_________________ main[-1u]={1};
|
| Пон Фев 01, 2021 3:19 pm |
|
 |
|
nobodyshadow
Ранг: Почетен член
Регистриран на: Съб Окт 30, 2004 5:18 am Мнения: 691
|
 Re: dsPIC33F - оптимизация на for loop
Е клока що го правиш софтуерно? Сложи си го на някакъв брояч. Прекъсвания, дма ползвай желязото.. 
_________________ Не мога да знам всичко,а и не искам.Тогава би било прекалено лесно и скучно!
|
| Пон Фев 01, 2021 5:16 pm |
|
 |
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 9:21 pm Мнения: 30685 Местоположение: София
|
 Re: dsPIC33F - оптимизация на for loop
мм това нема да му помогне, клока ще му е хардуерен но данните пак ще ги върти на ръка, то там отива времето. Защо не използваш някоя от перифериите, конкретно SPI ?
|
| Пон Фев 01, 2021 5:52 pm |
|
 |
|
t_i_t_o
Ранг: Почетен член
Регистриран на: Вто Окт 25, 2005 10:54 am Мнения: 896
|
 Re: dsPIC33F - оптимизация на for loop
Както казва Тони, опитай да използваш SPI за 16-те бита, а за 17тия - софтуерно клати данните и клока. Така само 1/17 ще правиш софтуерно, другите 16/17 хардуера ще ги клати, даже софтуера ще ти се опрости, щото няма да шифтваш битове...
|
| Пон Фев 01, 2021 6:28 pm |
|
 |
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 9:21 pm Мнения: 30685 Местоположение: София
|
 Re: dsPIC33F - оптимизация на for loop
Аз не знам как е реализирано при dspica, при някои процесори има начин да го прекъснеш на произволен бит, вярно със заобиколки ама работи, та виж няма ли такава възможност.
|
| Вто Фев 02, 2021 10:16 am |
|
|