Отговори на тема  [ 47 мнения ]  Отиди на страница Предишна  1, 2, 3, 4  Следваща
C за PIC18, използващо хардуерното му умножение? 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Авг 23, 2005 12:02 pm
Мнения: 3070
Местоположение: София
Мнение Re: C за PIC18, използващо хардуерното му умножение?
Резултата за C18 спрямо XC8:
- код 6626 байта срещу 4174 байта
- РАМ 389 байта срещу 158 байта

Все очаквах разлика, ама чак толкова - категорично не. И двата са в PRO режим, и двата са с всички пуснати оптимизации. C18-ката дори иска повече RAM, ако не сложа "const rom" пред константите.

Няква идея що така?


Пет Фев 01, 2013 2:11 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 20, 2005 12:02 pm
Мнения: 9119
Местоположение: Разград
Мнение Re: C за PIC18, използващо хардуерното му умножение?
Да... огледай кода и ще видиш защо. Цялата работа идва от рам-а - като минеш 256 байта рам и почва едно лудо MOVLB в 20-30% от кода. Единствено MOVFF ползва пълна адресация - всичко останало е banked или аксес. И изгледжа в C18 това което ползваш като функции е написано с ползване на повечко рам.


Пет Фев 01, 2013 2:33 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Авг 23, 2005 12:02 pm
Мнения: 3070
Местоположение: София
Мнение Re: C за PIC18, използващо хардуерното му умножение?
Cekins написа:
И изгледжа в C18 това което ползваш като функции е написано с ползване на повечко рам.


Компилирам едно и също нещо и на C18, и на XC8. Даже в това под C18 ги няма функциите за писане в ЕЕPROM-а.


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

Регистриран на: Сря Апр 20, 2005 12:02 pm
Мнения: 9119
Местоположение: Разград
Мнение Re: C за PIC18, използващо хардуерното му умножение?
Ами именно де - ти все пак компилираш някаква програма. Като компилираш със С18, явно някой функции си заделят твърде много рам. Причината най-вероятно е че са почти изцяло копирани от фукции за 16-ки, без много много да са си играли да ги оптимизират. А с повече от 256 байта рам - почва да превключва между банките - а тва са си 2 байта код. И ако в един израз имаш а=b+c, а ти е в аксес, б ти е в банка 1 и с в банка 2 ще имаш поне 2 превключвания на банки. За това е хубаво променливите да са "подредени" така да се каже. Отделните блокове да ползват променливи които са в една банка, за да се понамали малко банк суич-а... Ама не виждам защо не ползваш 24-ки/дсПик като вече имаш опит с тях - там поне няма такива глупости.


Пет Фев 01, 2013 3:33 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Авг 23, 2005 12:02 pm
Мнения: 3070
Местоположение: София
Мнение Re: C за PIC18, използващо хардуерното му умножение?
Cekins написа:
...Ама не виждам защо не ползваш 24-ки/дсПик като вече имаш опит с тях - там поне няма такива глупости.


Вече май и аз не виждам. :) 28 краков PIC24F като цена е кажи-речи същия. Ама и периферия, и всичко останало му е на светлинни години.

ПП: Бе не е същия като цена. 18F24K22 е 2.30 евра, аналогична 24-ка е 3 евра. Това във Farnell. Трябва ми 5 волтов, та за това.


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

Регистриран на: Пет Фев 25, 2005 1:58 pm
Мнения: 4585
Местоположение: US
Мнение Re: C за PIC18, използващо хардуерното му умножение?
Имаше една оптимизация, като я махнеш харчеше по-малко flash, мисля беше procedure abstraction

Има и трик за прекъсванията, по подразбиране C18 запазва едни 20-тина байта, които ги използва за математически операции. Обаче ако в прекъсванията нямаш сложна аритметика, компилатора не ги използва и няма смисъл да се запазват. Опцията е:
#pragma interrupt InterruptHandlerHigh nosave=section("MATH_DATA")

_________________
Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....


Пет Фев 01, 2013 4:56 pm
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Авг 23, 2005 12:02 pm
Мнения: 3070
Местоположение: София
Мнение Re: C за PIC18, използващо хардуерното му умножение?
¶ написа:
Имаше една оптимизация, като я махнеш харчеше по-малко flash, мисля беше procedure abstraction

Има и трик за прекъсванията, по подразбиране C18 запазва едни 20-тина байта, които ги използва за математически операции. Обаче ако в прекъсванията нямаш сложна аритметика, компилатора не ги използва и няма смисъл да се запазват. Опцията е:
#pragma interrupt InterruptHandlerHigh nosave=section("MATH_DATA")


То умножението в случая е точно в прекъсването, ама и не само там. Съответно за разлика от горния пример, който даде, при мен умножението се компилира във подпрограма, която се вика от ISR-то за прекъсването. И става пълно мазало, съответно.

Явно към момента няма читаво решение и ще си остана на XC8, умножавайки байт по байт изкуствено. А друг път като ми трябва повече от 8x8 умножение, просто ще забравя че има 8 битови процесори, и толкоз. То аз все се заричам, ама все взема че залитна, че уж евтини. А в XC8 от версия 1.20 нататък хардуерното умножение вече ще се ползва за всичко. Ама тая версия 1.20 може и да я чакаме с години. :)


Пет Фев 01, 2013 7:48 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Фев 25, 2005 1:58 pm
Мнения: 4585
Местоположение: US
Мнение Re: C за PIC18, използващо хардуерното му умножение?
sparkybg написа:
То умножението в случая е точно в прекъсването, ама и не само там.

Ако имаш сметки в прекъсване не е добре работата.

_________________
Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....


Пет Фев 01, 2013 9:08 pm
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Авг 23, 2005 12:02 pm
Мнения: 3070
Местоположение: София
Мнение Re: C за PIC18, използващо хардуерното му умножение?
¶ написа:
sparkybg написа:
То умножението в случая е точно в прекъсването, ама и не само там.

Ако имаш сметки в прекъсване не е добре работата.


Очевидно. Ама работата не е добре само под C18, защото вика подпрограма за умножение, а не слага кода директно в прекъсването. Под XC8 ц умножението на парче, проблема е никакъв.

А то е PID алгоритъм - там му е мястото.


Пет Фев 01, 2013 10:12 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Фев 25, 2005 1:58 pm
Мнения: 4585
Местоположение: US
Мнение Re: C за PIC18, използващо хардуерното му умножение?
sparkybg написа:
Ама работата не е добре само под C18

Листинга дето ти го пратих е от C18, очевидно работи, и в прекъсване, и отвън, си използва хардуерното умножение.

sparkybg написа:
Под XC8 ц умножението на парче, проблема е никакъв.

Реших да проверя твърдението ти:
Цитат:
Linux DesktopPC 2.6.32-45-generic #102-Ubuntu SMP Wed Jan 2 21:53:06 UTC 2013 i686 GNU/Linux
Disassembly Listing for v2
Generated From:
/home/../temp/mcc18_mul_example/dist/debug/production/mcc18_mul_example.production.cof
Feb 1, 2013 11:16:12 PM

--- /opt/microchip/xc8/v1.12/sources/wmul.c -----------------------------------------------------------
1: unsigned int
2: __wmul(unsigned int multiplier, unsigned int multiplicand)
3: {
4: unsigned int product = 0;
FF9C 6A05 CLRF product, ACCESS
FF9E 6A06 CLRF 0x6, ACCESS
5:
6: do {
7: if(multiplier & 1)
FFA0 A001 BTFSS multiplier, 0, ACCESS
FFA2 D004 BRA 0xFFAC
8: product += multiplicand;
FFA4 5003 MOVF multiplicand, W, ACCESS
FFA6 2605 ADDWF product, F, ACCESS
FFA8 5004 MOVF 0x4, W, ACCESS
FFAA 2206 ADDWFC 0x6, F, ACCESS
9: multiplicand <<= 1;
FFAC 90D8 BCF STATUS, 0, ACCESS
FFAE 3603 RLCF multiplicand, F, ACCESS
FFB0 3604 RLCF 0x4, F, ACCESS
10: multiplier >>= 1;
FFB2 90D8 BCF STATUS, 0, ACCESS
FFB4 3202 RRCF 0x2, F, ACCESS
FFB6 3201 RRCF multiplier, F, ACCESS
11: } while(multiplier != 0);
FFB8 5002 MOVF 0x2, W, ACCESS
FFBA 1001 IORWF multiplier, W, ACCESS
FFBC E1F1 BNZ 0xFFA0
12: return product;
FFBE C005 MOVFF product, multiplier
FFC0 F001 NOP
FFC2 C006 MOVFF 0x6, 0x2
FFC4 F002 NOP
13: }
FFC6 0012 RETURN 0
--- /home/../temp/mcc18_mul_example/src/main.c ----------------------------------------------------
1: #include <p18cxxx.h>
2: #include "Integers.h"
3: #include "fuses.h"
4:
5: void main(void) {
6: volatile int a,b;
7: volatile long c;
8: a = 38342;
FFC8 0E95 MOVLW 0x95
FFCA 6E0C MOVWF 0xC, ACCESS
FFCC 0EC6 MOVLW 0xC6
FFCE 6E0B MOVWF a, ACCESS
9: b = -30342;
FFD0 0E89 MOVLW 0x89
FFD2 6E0E MOVWF 0xE, ACCESS
FFD4 0E7A MOVLW 0x7A
FFD6 6E0D MOVWF b, ACCESS
10: c = a * b;
FFD8 C00B MOVFF a, multiplier
FFDA F001 NOP
FFDC C00C MOVFF 0xC, 0x2
FFDE F002 NOP
FFE0 C00D MOVFF b, multiplicand
FFE2 F003 NOP
FFE4 C00E MOVFF 0xE, 0x4
FFE6 F004 NOP
FFE8 ECCE CALL 0xFF9C, 0
FFEA F07F NOP
FFEC C001 MOVFF multiplier, c
FFEE F007 NOP
FFF0 C002 MOVFF 0x2, 0x8
FFF2 F008 NOP
FFF4 0E00 MOVLW 0x0
FFF6 BE08 BTFSC 0x8, 7, ACCESS
FFF8 0EFF MOVLW 0xFF
FFFA 6E09 MOVWF 0x9, ACCESS
FFFC 6E0A MOVWF 0xA, ACCESS
11: while(1);
12: }



Kодът от примерa за C18 го компилирах с XC8 v1.12 PRO и се оказа, че XC8 генерира софтуерно умножение.
Всички отпимизации са включени. По всичко изглежда, че поне още 1-2г. няма и да помисля за XC8.
На един по-голям проект за PIC18F26K80 ми изкара хиляди грешки, пък уж можел да работи в режим C18 компилация.
XC8 изглежда ще да е нито риба, нито рак, смесица от концепциите на Hi-Tech PICC18 с Microchip C18. Почти съм убеден, че ако с XC8 компилирам код за PICC18 и там ще ми избълва хиляди грешки.

_________________
Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....


Съб Фев 02, 2013 12:44 am
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Ное 25, 2005 11:41 am
Мнения: 1680
Мнение Re: C за PIC18, използващо хардуерното му умножение?
sparkybg написа:
¶ написа:
sparkybg написа:
То умножението в случая е точно в прекъсването, ама и не само там.

Ако имаш сметки в прекъсване не е добре работата.


Очевидно. Ама работата не е добре само под C18, защото вика подпрограма за умножение, а не слага кода директно в прекъсването. Под XC8 ц умножението на парче, проблема е никакъв.

А то е PID алгоритъм - там му е мястото.



Цъ... в прекъсване само елементарни логически неща, set, clear.... ама всеки си знае де....


Съб Фев 02, 2013 10:07 pm
Профил ICQ WWW
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Авг 23, 2005 12:02 pm
Мнения: 3070
Местоположение: София
Мнение Re: C за PIC18, използващо хардуерното му умножение?
relsys написа:
Цъ... в прекъсване само елементарни логически неща, set, clear....


Защото?


Съб Фев 02, 2013 10:11 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Ное 25, 2005 11:41 am
Мнения: 1680
Мнение Re: C за PIC18, използващо хардуерното му умножение?
sparkybg написа:
relsys написа:
Цъ... в прекъсване само елементарни логически неща, set, clear....


Защото?


Защото.... надявам се, да обяснявам за последен път...:

Та, в прекъсването е мястото, където се губи процесорна мощ. Или иначе казано: ако приемем, че имаме някакава сметка, която отнема 200 us... то това на пръв поглед е никакво време. Ако обаче сметката се изпълнява в прекъсване, което е на 1 ms... е, вече имаме зает 20% от ресурса на процесора. Сметките на PID регулатора определено нямат никакво място в прекъсване. Прекъсванията, колкото са хубаво нещо - толкова са и лошо, особено когато човек не знае как точно да ги ползва. В повечето случаи са предпоставка за бъгове, разсинхронизиране... и тнт, неща с които съм се сблъсквал в практиката с сорсове писани от други и за съжаление наложило ми се на мен да ги поправям.... Аз също съм писал неща с по 8-9 прекъсвания, но всички са само за синхронизиране - за пример: фазово управление на шестфазен Ларионов изправител... и тнт... надявам се да съм бил полезен :)


Съб Фев 02, 2013 10:31 pm
Профил ICQ WWW
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Авг 23, 2005 12:02 pm
Мнения: 3070
Местоположение: София
Мнение Re: C за PIC18, използващо хардуерното му умножение?
relsys написа:
Сметките на PID регулатора определено нямат никакво място в прекъсване.


Че къде да се правят? Сметките обикновено се правят синхронно я с таймер, я с някой вход на процесора. Например входа казва на ADC-то да прочете нещо, ADC-то като приключи изпляква прекъсването, в което правиш квото правиш с прочетеното, и толкоз. Великите сметки са 3 умножения и 3 събирания + някоя и друга проверка. Нормален процесор прави всяко за по 2 цикъла. Ако не може - взимаш такъв, дето може. Ако имаш нещо друго покрай PID-а, дето е критично по време - дори въпросния PIC18 има приоритети на прекъсванията. PID-а където и да го сложиш, щом трябва да се смята примерно 1000 пъти в секунда, той така или иначе си иска определен ресурс.


Съб Фев 02, 2013 11:56 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Авг 23, 2005 12:02 pm
Мнения: 3070
Местоположение: София
Мнение Re: C за PIC18, използващо хардуерното му умножение?
¶ написа:
Реших да проверя твърдението ти:
...
Kодът от примерa за C18 го компилирах с XC8 v1.12 PRO и се оказа, че XC8 генерира софтуерно умножение.
Всички отпимизации са включени. По всичко изглежда, че поне още 1-2г. няма и да помисля за XC8.
На един по-голям проект за PIC18F26K80 ми изкара хиляди грешки, пък уж можел да работи в режим C18 компилация.
XC8 изглежда ще да е нито риба, нито рак, смесица от концепциите на Hi-Tech PICC18 с Microchip C18. Почти съм убеден, че ако с XC8 компилирам код за PICC18 и там ще ми избълва хиляди грешки.


Ама то нали от това тръгна темата. XC8 не ползва хардуерното умножение за нищо друго освен за 8 битови променливи без знак. И в ръководството му си пише че не ги ползва. Пише че във версия 1.20 ще ги ползва, ама чакай от умрял писмо.. Опитах и с HI-TECH - същото. После си обявих въпросните променливи като INT16_VAL, резултата като INT32_VAL, умножих си ги байт по байт, и толкоз. При това компилатора сложи умноженията inline, а не викаше подпрограма. 16*16->32 успях да оптимизирам до към 32 цикъла. Подпрограмата която, компилатора вика ако не направя това, се изпълнява за 200 - берекет версим. Исках само ако е възможно в кода да не стоят 6-7 реда, а просто да напиша c+=a*b, а компилатора да свърши останалото. Е, не се намери читаво решение, значи остава така. Следващия път за такова ще рия в PIC24-ка, което е в пъти по-читаво, включително и компилатора.

ПП: Впрочем, при мен на програма правена за XC8 ми даде сума грешки на C18. Това дори и да изключим разликите в някой и друг h файл. Например, XC8 поддръжа anonymous мембъри и в union, и в struct. C18 само в union. И все разни от сорта. HI-TECH-а пък така и не искаше да ми прочете сетингите на конфигурационните регистри, въпреки че нярочно ги написах и по негов тертип. C18-ката си ги прочете. И все прочие дреболии, но пък доволно много като количество.


Нед Фев 03, 2013 12:14 am
Профил ICQ
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 47 мнения ]  Отиди на страница Предишна  1, 2, 3, 4  Следваща

Кой е на линия

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


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

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