|
Виж темите без отговор | Виж активните теми
Дата и час: Вто Юли 28, 2026 1:38 am
C за PIC18, използващо хардуерното му умножение?
| Автор |
Съобщение |
|
sparkybg
Ранг: Форумен бог
Регистриран на: Вто Авг 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 |
|
 |
|
Cekins
Ранг: Форумен бог
Регистриран на: Сря Апр 20, 2005 12:02 pm Мнения: 9119 Местоположение: Разград
|
 Re: C за PIC18, използващо хардуерното му умножение?
Да... огледай кода и ще видиш защо. Цялата работа идва от рам-а - като минеш 256 байта рам и почва едно лудо MOVLB в 20-30% от кода. Единствено MOVFF ползва пълна адресация - всичко останало е banked или аксес. И изгледжа в C18 това което ползваш като функции е написано с ползване на повечко рам.
|
| Пет Фев 01, 2013 2:33 pm |
|
 |
|
sparkybg
Ранг: Форумен бог
Регистриран на: Вто Авг 23, 2005 12:02 pm Мнения: 3070 Местоположение: София
|
 Re: C за PIC18, използващо хардуерното му умножение?
Компилирам едно и също нещо и на C18, и на XC8. Даже в това под C18 ги няма функциите за писане в ЕЕPROM-а.
|
| Пет Фев 01, 2013 3:06 pm |
|
 |
|
Cekins
Ранг: Форумен бог
Регистриран на: Сря Апр 20, 2005 12:02 pm Мнения: 9119 Местоположение: Разград
|
 Re: C за PIC18, използващо хардуерното му умножение?
Ами именно де - ти все пак компилираш някаква програма. Като компилираш със С18, явно някой функции си заделят твърде много рам. Причината най-вероятно е че са почти изцяло копирани от фукции за 16-ки, без много много да са си играли да ги оптимизират. А с повече от 256 байта рам - почва да превключва между банките - а тва са си 2 байта код. И ако в един израз имаш а=b+c, а ти е в аксес, б ти е в банка 1 и с в банка 2 ще имаш поне 2 превключвания на банки. За това е хубаво променливите да са "подредени" така да се каже. Отделните блокове да ползват променливи които са в една банка, за да се понамали малко банк суич-а... Ама не виждам защо не ползваш 24-ки/дсПик като вече имаш опит с тях - там поне няма такива глупости.
|
| Пет Фев 01, 2013 3:33 pm |
|
 |
|
sparkybg
Ранг: Форумен бог
Регистриран на: Вто Авг 23, 2005 12:02 pm Мнения: 3070 Местоположение: София
|
 Re: C за PIC18, използващо хардуерното му умножение?
Вече май и аз не виждам.  28 краков PIC24F като цена е кажи-речи същия. Ама и периферия, и всичко останало му е на светлинни години. ПП: Бе не е същия като цена. 18F24K22 е 2.30 евра, аналогична 24-ка е 3 евра. Това във Farnell. Трябва ми 5 волтов, та за това.
|
| Пет Фев 01, 2013 3:40 pm |
|
 |
|
¶
Ранг: Форумен бог
Регистриран на: Пет Фев 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 |
|
 |
|
sparkybg
Ранг: Форумен бог
Регистриран на: Вто Авг 23, 2005 12:02 pm Мнения: 3070 Местоположение: София
|
 Re: C за PIC18, използващо хардуерното му умножение?
То умножението в случая е точно в прекъсването, ама и не само там. Съответно за разлика от горния пример, който даде, при мен умножението се компилира във подпрограма, която се вика от ISR-то за прекъсването. И става пълно мазало, съответно. Явно към момента няма читаво решение и ще си остана на XC8, умножавайки байт по байт изкуствено. А друг път като ми трябва повече от 8x8 умножение, просто ще забравя че има 8 битови процесори, и толкоз. То аз все се заричам, ама все взема че залитна, че уж евтини. А в XC8 от версия 1.20 нататък хардуерното умножение вече ще се ползва за всичко. Ама тая версия 1.20 може и да я чакаме с години. 
|
| Пет Фев 01, 2013 7:48 pm |
|
 |
|
¶
Ранг: Форумен бог
Регистриран на: Пет Фев 25, 2005 1:58 pm Мнения: 4585 Местоположение: US
|
 Re: C за PIC18, използващо хардуерното му умножение?
Ако имаш сметки в прекъсване не е добре работата.
_________________ Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....
|
| Пет Фев 01, 2013 9:08 pm |
|
 |
|
sparkybg
Ранг: Форумен бог
Регистриран на: Вто Авг 23, 2005 12:02 pm Мнения: 3070 Местоположение: София
|
 Re: C за PIC18, използващо хардуерното му умножение?
Очевидно. Ама работата не е добре само под C18, защото вика подпрограма за умножение, а не слага кода директно в прекъсването. Под XC8 ц умножението на парче, проблема е никакъв. А то е PID алгоритъм - там му е мястото.
|
| Пет Фев 01, 2013 10:12 pm |
|
 |
|
¶
Ранг: Форумен бог
Регистриран на: Пет Фев 25, 2005 1:58 pm Мнения: 4585 Местоположение: US
|
 Re: C за PIC18, използващо хардуерното му умножение?
Листинга дето ти го пратих е от C18, очевидно работи, и в прекъсване, и отвън, си използва хардуерното умножение. Реших да проверя твърдението ти:  |  |  |  | Цитат: 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 |
|
 |
|
relsys
Ранг: Форумен бог
Регистриран на: Пет Ное 25, 2005 11:41 am Мнения: 1680
|
 Re: C за PIC18, използващо хардуерното му умножение?
Цъ... в прекъсване само елементарни логически неща, set, clear.... ама всеки си знае де....
|
| Съб Фев 02, 2013 10:07 pm |
|
 |
|
sparkybg
Ранг: Форумен бог
Регистриран на: Вто Авг 23, 2005 12:02 pm Мнения: 3070 Местоположение: София
|
 Re: C за PIC18, използващо хардуерното му умножение?
|
| Съб Фев 02, 2013 10:11 pm |
|
 |
|
relsys
Ранг: Форумен бог
Регистриран на: Пет Ное 25, 2005 11:41 am Мнения: 1680
|
 Re: C за PIC18, използващо хардуерното му умножение?
Защото.... надявам се, да обяснявам за последен път...: Та, в прекъсването е мястото, където се губи процесорна мощ. Или иначе казано: ако приемем, че имаме някакава сметка, която отнема 200 us... то това на пръв поглед е никакво време. Ако обаче сметката се изпълнява в прекъсване, което е на 1 ms... е, вече имаме зает 20% от ресурса на процесора. Сметките на PID регулатора определено нямат никакво място в прекъсване. Прекъсванията, колкото са хубаво нещо - толкова са и лошо, особено когато човек не знае как точно да ги ползва. В повечето случаи са предпоставка за бъгове, разсинхронизиране... и тнт, неща с които съм се сблъсквал в практиката с сорсове писани от други и за съжаление наложило ми се на мен да ги поправям.... Аз също съм писал неща с по 8-9 прекъсвания, но всички са само за синхронизиране - за пример: фазово управление на шестфазен Ларионов изправител... и тнт... надявам се да съм бил полезен 
|
| Съб Фев 02, 2013 10:31 pm |
|
 |
|
sparkybg
Ранг: Форумен бог
Регистриран на: Вто Авг 23, 2005 12:02 pm Мнения: 3070 Местоположение: София
|
 Re: C за PIC18, използващо хардуерното му умножение?
Че къде да се правят? Сметките обикновено се правят синхронно я с таймер, я с някой вход на процесора. Например входа казва на ADC-то да прочете нещо, ADC-то като приключи изпляква прекъсването, в което правиш квото правиш с прочетеното, и толкоз. Великите сметки са 3 умножения и 3 събирания + някоя и друга проверка. Нормален процесор прави всяко за по 2 цикъла. Ако не може - взимаш такъв, дето може. Ако имаш нещо друго покрай PID-а, дето е критично по време - дори въпросния PIC18 има приоритети на прекъсванията. PID-а където и да го сложиш, щом трябва да се смята примерно 1000 пъти в секунда, той така или иначе си иска определен ресурс.
|
| Съб Фев 02, 2013 11:56 pm |
|
 |
|
sparkybg
Ранг: Форумен бог
Регистриран на: Вто Авг 23, 2005 12:02 pm Мнения: 3070 Местоположение: София
|
 Re: C за PIC18, използващо хардуерното му умножение?
Ама то нали от това тръгна темата. 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 |
|
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 2 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|