|
Виж темите без отговор | Виж активните теми
Дата и час: Вто Юли 28, 2026 1:11 am
|
Страница 1 от 1
|
[ 5 мнения ] |
|
| Автор |
Съобщение |
|
¶
Ранг: Форумен бог
Регистриран на: Пет Фев 25, 2005 1:58 pm Мнения: 4585 Местоположение: US
|
 MCC18 bit manipulation
Отново за MCC18  . Опитвам се, да накарам MCC18 да генерира по-добър код при манипулация с битове.
Направи ми впечатление дългия код, който се генерира при проверка на стойността на даден бит ( потребителски, не служебни битове ), вместо btfsc & btfss се правят andlw с маска за съответния бит, след това се вика някаква подпрограма, всичко това е за около 10-12 такта.
Когато се нулира или сетва стойността на даден потребителски бит всичко е направено както трябва: bsf & bcf .
Пробвам с различно деклариране на бит-променливите, обаче засега няма успех, MCC18 продължава да генерира тромавия си код при проверка за стойността на бит-променливите.
Някой да се е преборвал в тази насока, с това чудо на компилаторите, наречено MCC18  ?
Бях свикнал с краткия код на CCS при проверка на битове и кода на MCC18 ме дразни.
_________________ Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....
|
| Чет Юли 26, 2007 6:10 pm |
|
 |
|
Gogo
Ранг: Форумен бог
Регистриран на: Чет Фев 24, 2005 11:41 pm Мнения: 1049 Местоположение: Pz
|
И при мене прави andlw с маска, но не вика никакви подпрограми. Пусни малко code да пробвам!
|
| Чет Юли 26, 2007 7:36 pm |
|
 |
|
¶
Ранг: Форумен бог
Регистриран на: Пет Фев 25, 2005 1:58 pm Мнения: 4585 Местоположение: US
|
Значи, всичко идва от настройките за Default Storage Class ( auto, static ) and Enable/Disable integer promotion. Ето кодът:
Ето вариациите на генерирания код, в зависимост от горните настройки: 1). Default Storage Class: auto Integer Promotion: Disable  |  |  |  | Код: 11: bits.b = 1; 00D4 D819 RCALL 0x108 00D6 80EF BSF 0xfef, 0, ACCESS 12: bits.b = 0; 00D8 D817 RCALL 0x108 00DA 90EF BCF 0xfef, 0, ACCESS 13: bits.b = ! bits.b; 00DC D81A RCALL 0x112 00DE 0A01 XORLW 0x1 00E0 50E8 MOVF 0xfe8, W, ACCESS 00E2 0B01 ANDLW 0x1 00E4 6EF3 MOVWF 0xff3, ACCESS 00E6 0EFE MOVLW 0xfe 00E8 14EF ANDWF 0xfef, W, ACCESS 00EA 10F3 IORWF 0xff3, W, ACCESS 00EC 6EEF MOVWF 0xfef, ACCESS 14: if( bits.b ) 00EE D811 RCALL 0x112 00F0 E002 BZ 0xf6 15: bits.b = 0; 00F2 D80A RCALL 0x108 00F4 90EF BCF 0xfef, 0, ACCESS 16: if( ! bits.b ) 00F6 D80D RCALL 0x112 00F8 E102 BNZ 0xfe 0112 DFFA RCALL 0x108 0114 50EF MOVF 0xfef, W, ACCESS 0116 0B01 ANDLW 0x1 0118 0012 RETURN 0 17: bits.b = 1; 00FA D806 RCALL 0x108 00FC 80EF BSF 0xfef, 0, ACCESS 0108 CFD9 MOVFF 0xfd9, 0xfe9 010A FFE9 NOP 010C CFDA MOVFF 0xfda, 0xfea 010E FFEA NOP 0110 0012 RETURN 0
|  |  |  |  |
2). Default Storage Class: static Integer Promotion: Disable  |  |  |  | Код: 11: bits.b = 1; 00EA 8002 BSF 0x2, 0, ACCESS 12: bits.b = 0; 00EC 9002 BCF 0x2, 0, ACCESS 13: bits.b = ! bits.b; 00EE 7002 BTG 0x2, 0, ACCESS 14: if( bits.b ) 00F0 B002 BTFSC 0x2, 0, ACCESS 15: bits.b = 0; 00F2 9002 BCF 0x2, 0, ACCESS 16: if( ! bits.b ) 00F4 A002 BTFSS 0x2, 0, ACCESS 17: bits.b = 1; 00F6 8002 BSF 0x2, 0, ACCESS
|  |  |  |  |
3). Default Storage Class: auto Integer Promotion: Enable  |  |  |  | Код: 11: bits.b = 1; 00D4 D837 RCALL 0x144 00D6 80EF BSF 0xfef, 0, ACCESS 12: bits.b = 0; 00D8 D835 RCALL 0x144 00DA 90EF BCF 0xfef, 0, ACCESS 13: bits.b = ! bits.b; 00DC D838 RCALL 0x14e 00DE E001 BZ 0xe2 00E0 0EFF MOVLW 0xff 00E2 6E02 MOVWF 0x2, ACCESS 00E4 6A03 CLRF 0x3, ACCESS 00E6 BE02 BTFSC 0x2, 0x7, ACCESS 00E8 6803 SETF 0x3, ACCESS 00EA 5002 MOVF 0x2, W, ACCESS 00EC 1003 IORWF 0x3, W, ACCESS 00EE E002 BZ 0xf4 00F0 0E00 MOVLW 0 00F2 D001 BRA 0xf6 00F4 0E01 MOVLW 0x1 00F6 6A01 CLRF 0x1, ACCESS 00F8 50E8 MOVF 0xfe8, W, ACCESS 00FA D824 RCALL 0x144 00FC 50E8 MOVF 0xfe8, W, ACCESS 00FE 0B01 ANDLW 0x1 0100 6EF3 MOVWF 0xff3, ACCESS 0102 0EFE MOVLW 0xfe 0104 14EF ANDWF 0xfef, W, ACCESS 0106 10F3 IORWF 0xff3, W, ACCESS 0108 6EEF MOVWF 0xfef, ACCESS 14: if( bits.b ) 010A D821 RCALL 0x14e 010C E001 BZ 0x110 010E 0EFF MOVLW 0xff 0110 6E00 MOVWF 0, ACCESS 0112 6A01 CLRF 0x1, ACCESS 0114 BE00 BTFSC 0, 0x7, ACCESS 0116 6801 SETF 0x1, ACCESS 0118 5000 MOVF 0, W, ACCESS 011A 1001 IORWF 0x1, W, ACCESS 011C E002 BZ 0x122 15: bits.b = 0; 011E D812 RCALL 0x144 0120 90EF BCF 0xfef, 0, ACCESS 16: if( ! bits.b ) 0122 D815 RCALL 0x14e 0124 E001 BZ 0x128 0126 0EFF MOVLW 0xff 0128 6E00 MOVWF 0, ACCESS 012A 6A01 CLRF 0x1, ACCESS 012C BE00 BTFSC 0, 0x7, ACCESS 012E 6801 SETF 0x1, ACCESS 0130 5000 MOVF 0, W, ACCESS 0132 1001 IORWF 0x1, W, ACCESS 0134 E102 BNZ 0x13a 014E DFFA RCALL 0x144 0150 50EF MOVF 0xfef, W, ACCESS 0152 0B01 ANDLW 0x1 0154 0012 RETURN 0 17: bits.b = 1; 0136 D806 RCALL 0x144 0138 80EF BSF 0xfef, 0, ACCESS 0144 CFD9 MOVFF 0xfd9, 0xfe9 0146 FFE9 NOP 0148 CFDA MOVFF 0xfda, 0xfea 014A FFEA NOP 014C 0012 RETURN 0
|  |  |  |  |
4). Default Storage Class: static Integer Promotion: Enable  |  |  |  | Код: 11: bits.b = 1; 00CA 8006 BSF 0x6, 0, ACCESS 12: bits.b = 0; 00CC 9006 BCF 0x6, 0, ACCESS 13: bits.b = ! bits.b; 00CE 5006 MOVF 0x6, W, ACCESS 00D0 0B01 ANDLW 0x1 00D2 E001 BZ 0xd6 00D4 0EFF MOVLW 0xff 00D6 6E02 MOVWF 0x2, ACCESS 00D8 6A03 CLRF 0x3, ACCESS 00DA BE02 BTFSC 0x2, 0x7, ACCESS 00DC 6803 SETF 0x3, ACCESS 00DE 5002 MOVF 0x2, W, ACCESS 00E0 1003 IORWF 0x3, W, ACCESS 00E2 E002 BZ 0xe8 00E4 0E00 MOVLW 0 00E6 D001 BRA 0xea 00E8 0E01 MOVLW 0x1 00EA 50E8 MOVF 0xfe8, W, ACCESS 00EC 9006 BCF 0x6, 0, ACCESS 00EE B0E8 BTFSC 0xfe8, 0, ACCESS 00F0 8006 BSF 0x6, 0, ACCESS 14: if( bits.b ) 00F2 5006 MOVF 0x6, W, ACCESS 00F4 0B01 ANDLW 0x1 00F6 E001 BZ 0xfa 00F8 0EFF MOVLW 0xff 00FA 6E00 MOVWF 0, ACCESS 00FC 6A01 CLRF 0x1, ACCESS 00FE BE00 BTFSC 0, 0x7, ACCESS 0100 6801 SETF 0x1, ACCESS 0102 5000 MOVF 0, W, ACCESS 0104 1001 IORWF 0x1, W, ACCESS 0106 E001 BZ 0x10a 15: bits.b = 0; 0108 9006 BCF 0x6, 0, ACCESS 16: if( ! bits.b ) 010A 5006 MOVF 0x6, W, ACCESS 010C 0B01 ANDLW 0x1 010E E001 BZ 0x112 0110 0EFF MOVLW 0xff 0112 6E00 MOVWF 0, ACCESS 0114 6A01 CLRF 0x1, ACCESS 0116 BE00 BTFSC 0, 0x7, ACCESS 0118 6801 SETF 0x1, ACCESS 011A 5000 MOVF 0, W, ACCESS 011C 1001 IORWF 0x1, W, ACCESS 011E E101 BNZ 0x122 17: bits.b = 1; 0120 8006 BSF 0x6, 0, ACCESS
|  |  |  |  |
Явно Default Storage Class auto не бива да се използва 
_________________ Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....
|
| Чет Юли 26, 2007 8:01 pm |
|
 |
|
Цецо
Ранг: Форумен бог
Регистриран на: Пон Сеп 27, 2004 9:22 am Мнения: 15501 Местоположение: София
|
Ами гледай сега. По принцип аз също съм го установил това. Затова винаги работя по подразбиране static. Верно че яде по бързо паметта, ама пък кода е много по бърз и компактен. А пък в прекъсвания е просто задължително.... А когато накрая все пак паметта не ми стигне, гледам в кои функции не бързам и ръчно почвам да обявявам auto. Но много рядко ми се налага. Ако ми трябва повече памет сменям архитектурта. На PIC18 определено стека не му е силна страна. То не му е и това идеята де....
_________________ "Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.
|
| Пет Юли 27, 2007 8:00 am |
|
 |
|
¶
Ранг: Форумен бог
Регистриран на: Пет Фев 25, 2005 1:58 pm Мнения: 4585 Местоположение: US
|
 Как смята MCC18 ?
Загубих си почти цял ден да псувам професора PIC18F2580, като си мислех, че има нещо гнило в EUSART модула, оказа се друга причината  :
Изглежда, MCC18 не може да пресмята правилно изрази с цели числа. Или аз бъркам ?
_________________ Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....
|
| Пет Авг 03, 2007 4:23 pm |
|
|
|
Страница 1 от 1
|
[ 5 мнения ] |
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 2 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|