EWAVR v3.20A вопрос по компилятору

Do you have a question? Post it now! No Registration Necessary

Threaded View
Hello, All!

Не смог разобраться, почему в данной версии не работают макросы

SREG_Bit7 = 0;
SREG_Bit7 = 1;

а функции

__disable_interrupt();
__enable_interrupt();

работают корректно...

Другие регистры обрабатываются вышеуказанными макросами правильно. Проблемы
только с SREG.

---
Best regards,
Vladimir Ivanov



Re: EWAVR v3.20A вопрос по компилятору
    Всем привет!

Vladimir Ivanov писал к All 27.07.2004:

 VI> Не смог разобраться, почему в данной версии не работают макросы

 VI> SREG_Bit7 = 0;
 VI> SREG_Bit7 = 1;

 VI> а функции

 VI> __disable_interrupt();
 VI> __enable_interrupt();

 VI> работают корректно...

 VI> Другие регистры обрабатываются вышеуказанными макросами правильно.
 VI> Проблемы только с SREG.

А в чем проблема-то? У меня эти макросы компилируются в команды CLI и SEI
соответственно. Чего тебе еще-то для счастья надо?

--
Аскольд Волков, Новосибирск. http://www.inp.nsk.su/~volkov /


Re: EWAVR v3.20A вопрос по компилятору
Добрый день, Askold!
You wrote to Vladimir Ivanov on Wed, 28 Jul 2004 02:26:39 +0000 (UTC):

 AV> Vladimir Ivanov писал к All 27.07.2004:

 VI>> Не смог разобраться, почему в данной версии не работают макросы

 VI>> SREG_Bit7 = 0;
 VI>> SREG_Bit7 = 1;

 VI>> а функции

 VI>> __disable_interrupt();
 VI>> __enable_interrupt();

 VI>> работают корректно...

 VI>> Другие регистры обрабатываются вышеуказанными макросами правильно.
 VI>> Проблемы только с SREG.

 AV> А в чем проблема-то? У меня эти макросы компилируются в команды CLI и
 AV> SEI соответственно. Чего тебе еще-то для счастья надо?


ВОТ КУСОК ПРОГРАММЫ:
********************
********************

__C_task void main (void)
{
   SREG_Bit7 = 0;           //iauaa cai?auaiea i?a?uaaiee
 PORTB = 0x08;                   //eieoeaeecaoey ii?oia aaiaa/auaiaa
 DDRB = 0xFF;
 PORTD = 0xBF;
 DDRD = 0x40;
 MCUCR = 0x0E;       //i?a?uaaiey INT0,INT1 ii o?iioo
 GIFR = ((1<<INTF1)+(1<<INTF0));//na?ineou ei?iua oeaae i?a?uaaiee INT0,INT1
 TIFR = 0xEA;       //na?ineou ei?iua oeaae i?a?uaaiee io oaeia?ia
 GIMSK = (1<<INT0)+(1<<INT1);  //?ac?aoeou INT0,INT1
 TIMSK = ((1<<TOIE1)+(1<<TOIE0)); //?ac?aoeou i?a?uaaiey ii ia?aiieiaie?
oaeia?ia
 TCCR0 = T0PredDividerT;   //ione oaeia?a 0
 SREG_Bit7 = 1;    //iauaa ?ac?aoaiea i?a?uaaiee
/***************************************************************************
******/
#ifndef DEBUG
 {
 }
#endif

#ifdef DEBUG
 {
 }
#endif
/***************************************************************************
******/
//iniiaiie ?aai÷ee oeee
Work:
 CLRBIT(PORTB,HL);
 SETBIT(PORTD,LED);
 Delay(1000);
 SETBIT(PORTB,HL);
 CLRBIT(PORTD,LED);
 Delay(1000);
 goto Work;
}
/***************************************************************************
******/

А ВОТ ЛИСТИНГ КОМПИЛЯТОРА:
**************************
**************************

   \                                 In segment CODE, align 2,
keep-with-next
     14          __C_task void main (void)
   \                     main:
     15          {
     16             SREG_Bit7 = 0;           //iauaa cai?auaiea i?a?uaaiee
     17           PORTB = 0x08;                   //eieoeaeecaoey ii?oia
aaiaa/auaiaa
   \   00000000   E008                       LDI     R16,8
   \   00000002   BB08                       OUT     0x18,R16
     18           DDRB = 0xFF;
   \   00000004   EF0F                       LDI     R16,255
   \   00000006   BB07                       OUT     0x17,R16
     19           PORTD = 0xBF;
   \   00000008   EB0F                       LDI     R16,191
   \   0000000A   BB02                       OUT     0x12,R16
     20           DDRD = 0x40;
   \   0000000C   E400                       LDI     R16,64
   \   0000000E   BB01                       OUT     0x11,R16
     21           MCUCR = 0x0E;       //i?a?uaaiey INT0,INT1 ii o?iioo
   \   00000010   E00E                       LDI     R16,14
   \   00000012   BF05                       OUT     0x35,R16
     22           GIFR = ((1<<INTF1)+(1<<INTF0));//na?ineou ei?iua oeaae
i?a?uaaiee INT0,INT1
   \   00000014   EC00                       LDI     R16,192
   \   00000016   BF0A                       OUT     0x3A,R16
     23           TIFR = 0xEA;       //na?ineou ei?iua oeaae i?a?uaaiee io
oaeia?ia
   \   00000018   EE0A                       LDI     R16,234
   \   0000001A   BF08                       OUT     0x38,R16
     24           GIMSK = (1<<INT0)+(1<<INT1);  //?ac?aoeou INT0,INT1
   \   0000001C   EC00                       LDI     R16,192
   \   0000001E   BF0B                       OUT     0x3B,R16
     25           TIMSK = ((1<<TOIE1)+(1<<TOIE0)); //?ac?aoeou i?a?uaaiey ii
ia?aiieiaie? oaeia?ia
   \   00000020   E802                       LDI     R16,130
   \   00000022   BF09                       OUT     0x39,R16
     26           TCCR0 = T0PredDividerT;   //ione oaeia?a 0
   \   00000024   E002                       LDI     R16,2
   \   00000026   BF03                       OUT     0x33,R16
     27           SREG_Bit7 = 1;    //iauaa ?ac?aoaiea i?a?uaaiee
     28
/***************************************************************************
******/
     29          #ifndef DEBUG
     30           {
     31           }
     32          #endif
     33
     34          #ifdef DEBUG
     35           {
     36           }
     37          #endif
     38
/***************************************************************************
******/
     39          //iniiaiie ?aai÷ee oeee
     40          Work:
     41           CLRBIT(PORTB,HL);
   \                     ??main_0:
   \   00000028   98C3                       CBI     0x18,0x03
     42           SETBIT(PORTD,LED);
   \   0000002A   9A96                       SBI     0x12,0x06
     43           Delay(1000);
   \   0000002C   E308                       LDI     R16,56
   \   0000002E   E010                       LDI     R17,0
   \   00000030   ....                       LDI     R30,DelayReg
   \   00000032   8300                       ST      Z,R16
   \   00000034   8311                       STD     Z+1,R17
   \   00000036   ....                       RCALL   WaitTmr
     44           SETBIT(PORTB,HL);
   \   00000038   9AC3                       SBI     0x18,0x03
     45           CLRBIT(PORTD,LED);
   \   0000003A   9896                       CBI     0x12,0x06
     46           Delay(1000);
   \   0000003C   E308                       LDI     R16,56
   \   0000003E   E010                       LDI     R17,0
   \   00000040   ....                       LDI     R30,DelayReg
   \   00000042   8300                       ST      Z,R16
   \   00000044   8311                       STD     Z+1,R17
   \   00000046   ....                       RCALL   WaitTmr
     47           goto Work;
   \   00000048   CFEF                       RJMP    ??main_0
     48          }

   \                                 In segment ABSOLUTE, at 0x31
   \   union <unnamed> volatile __io _A_DDRD
   \                     _A_DDRD:
   \   00000000                              DS 1

   \                                 In segment ABSOLUTE, at 0x32
   \   union <unnamed> volatile __io _A_PORTD
   \                     _A_PORTD:
   \   00000000                              DS 1

   \                                 In segment ABSOLUTE, at 0x37
   \   union <unnamed> volatile __io _A_DDRB
   \                     _A_DDRB:
   \   00000000                              DS 1

   \                                 In segment ABSOLUTE, at 0x38
   \   union <unnamed> volatile __io _A_PORTB
   \                     _A_PORTB:
   \   00000000                              DS 1

   \                                 In segment ABSOLUTE, at 0x53
   \   union <unnamed> volatile __io _A_TCCR0
   \                     _A_TCCR0:
   \   00000000                              DS 1

   \                                 In segment ABSOLUTE, at 0x55
   \   union <unnamed> volatile __io _A_MCUCR
   \                     _A_MCUCR:
   \   00000000                              DS 1

   \                                 In segment ABSOLUTE, at 0x58
   \   union <unnamed> volatile __io _A_TIFR
   \                     _A_TIFR:
   \   00000000                              DS 1

   \                                 In segment ABSOLUTE, at 0x59
   \   union <unnamed> volatile __io _A_TIMSK
   \                     _A_TIMSK:
   \   00000000                              DS 1

   \                                 In segment ABSOLUTE, at 0x5a
   \   union <unnamed> volatile __io _A_GIFR
   \                     _A_GIFR:
   \   00000000                              DS 1

   \                                 In segment ABSOLUTE, at 0x5b
   \   union <unnamed> volatile __io _A_GIMSK
   \                     _A_GIMSK:
   \   00000000                              DS 1

   \                                 In segment ABSOLUTE, at 0x5f
   \   union <unnamed> volatile __io _A_SREG
   \                     _A_SREG:
   \   00000000                              DS 1
     49
/***************************************************************************
******/

   Maximum stack usage in bytes:

     Function     CSTACK RSTACK
     --------     ------ ------
     main             0      2
       -> WaitTmr     0      2
       -> WaitTmr     0      2


   Segment part sizes:

     Function/Label Bytes
     -------------- -----
     main             74
     _A_DDRD           1
     _A_PORTD          1
     _A_DDRB           1
     _A_PORTB          1
     _A_TCCR0          1
     _A_MCUCR          1
     _A_TIFR           1
     _A_TIMSK          1
     _A_GIFR           1
     _A_GIMSK          1
     _A_SREG           1


 11 bytes in segment ABSOLUTE
 74 bytes in segment CODE

 74 bytes of CODE memory
  0 bytes of DATA memory (+ 11 bytes shared)

Errors: none
Warnings: none
***********************************************************************
***********************************************************************


Как видно общее разрешение прерываний не установлено (оба макроса не
компилируются).
Программа в реальном девайсе поэтому не работает.

Стоит макросы заменить на intrinsic функции и все проходит на ура и девайс
работает.
Причем заметил - если дописать несколько строчек С предложений то это
приводит иногда к корректной компиляции макросов. Мистика?...












---
Best regards,
Vladimir Ivanov



Re: EWAVR v3.20A вопрос по компилятору
     Greetings, Vladimir!

 Посмотрел я мессагу, посланную Vladimir Ivanov к All, и решил ответить:

 VI> Hе смог разобраться, почему в данной версии не работают макросы

 VI> SREG_Bit7 = 0;
 VI> SREG_Bit7 = 1;

Я пользую 3.10A и заметил такую стpанность - подобное пpоисходит пpи уpовне
оптимизации HIGH
К пpимеpу:

struct byte3 { int loword; char hibyte };

byte3 Add_byte3_byte3(byte3 a, byte3 b)
 {
 a.loword+=b.loword;
 if (SREG_Bit0) ++a.hibyte;
 a.hibyte+=b.hibyte;
 return(a)
 }

Пpиходится пеpед функцией ставить #pragma optimize=3, иначе стpока с пpовеpкой
SREG игноpиpуется, как будто бы это условие всегда ложно.

 C наилучшими пожеланиями
                    Ilja aka ИЛ-2  (ilja_vlaskin$mail.ru)

... Сижу, никого не трогаю, примус починяю :)

Site Timeline