Отговори на тема  [ 5 мнения ] 
MCC18 bit manipulation 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Фев 25, 2005 1:58 pm
Мнения: 4585
Местоположение: US
Мнение MCC18 bit manipulation
Отново за MCC18 :-) . Опитвам се, да накарам MCC18 да генерира по-добър код при манипулация с битове.

Направи ми впечатление дългия код, който се генерира при проверка на стойността на даден бит ( потребителски, не служебни битове ), вместо btfsc & btfss се правят andlw с маска за съответния бит, след това се вика някаква подпрограма, всичко това е за около 10-12 такта.

Когато се нулира или сетва стойността на даден потребителски бит всичко е направено както трябва: bsf & bcf .

Пробвам с различно деклариране на бит-променливите, обаче засега няма успех, MCC18 продължава да генерира тромавия си код при проверка за стойността на бит-променливите.

Някой да се е преборвал в тази насока, с това чудо на компилаторите, наречено MCC18 :D ?
Бях свикнал с краткия код на CCS при проверка на битове и кода на MCC18 ме дразни.

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


Чет Юли 26, 2007 6:10 pm
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Фев 24, 2005 11:41 pm
Мнения: 1049
Местоположение: Pz
Мнение 
И при мене прави andlw с маска, но не вика никакви подпрограми. Пусни малко code да пробвам!


Чет Юли 26, 2007 7:36 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Фев 25, 2005 1:58 pm
Мнения: 4585
Местоположение: US
Мнение 
Значи, всичко идва от настройките за Default Storage Class ( auto, static ) and Enable/Disable integer promotion. Ето кодът:
Код:
struct {
   char b:1;
   char unised:7;
}bits;

   bits.b = 1;
   bits.b = 0;
   bits.b = ! bits.b;
   if( bits.b )
      bits.b = 0;
   if( ! bits.b )
      bits.b = 1;


Ето вариациите на генерирания код, в зависимост от горните настройки:

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
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пон Сеп 27, 2004 9:22 am
Мнения: 15501
Местоположение: София
Мнение 
Ами гледай сега. По принцип аз също съм го установил това. Затова винаги работя по подразбиране static. Верно че яде по бързо паметта, ама пък кода е много по бърз и компактен. А пък в прекъсвания е просто задължително.... А когато накрая все пак паметта не ми стигне, гледам в кои функции не бързам и ръчно почвам да обявявам auto. Но много рядко ми се налага. Ако ми трябва повече памет сменям архитектурта. На PIC18 определено стека не му е силна страна. То не му е и това идеята де....

_________________
"Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.


Пет Юли 27, 2007 8:00 am
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Фев 25, 2005 1:58 pm
Мнения: 4585
Местоположение: US
Мнение Как смята MCC18 ?
Загубих си почти цял ден да псувам професора PIC18F2580, като си мислех, че има нещо гнило в EUSART модула, оказа се друга причината :oops: :

Код:
#include <p18f2580.h>

typedef unsigned char uint8;

#define CBR_19200_1   (uint8)( 10000000.0 / ( 16.0 * 19200.0 ) ) - 1.0
#define CBR_19200_2   (uint8)(( 10000000 / ( 16 * 19200 ) ) - 1)

uint8   spbrg;

void main(void) {

   while( 1 ) {
      spbrg = CBR_19200_1;   // Ok, result is 0x1F
      spbrg = CBR_19200_2;   // Falgs, result is 0x17 ???
      spbrg = (uint8)( 10000000.0 / ( 16.0 * 19200.0 ) ) - 1.0; // Ok, result is 0x1F
      spbrg = (uint8)( (10000000/(16*19200))-1 ); // Falgs, result is 0x17 ???
   }
}


Изглежда, MCC18 не може да пресмята правилно изрази с цели числа. Или аз бъркам ?

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


Пет Авг 03, 2007 4:23 pm
Профил WWW
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 5 мнения ] 

Кой е на линия

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


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

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