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

Jul 27, 2004 3 Replies

Hello, All!



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



SREG_Bit7 = 0; SREG_Bit7 = 1;



а функции



__disable_interrupt(); __enable_interrupt();



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



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


Всем привет!

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 соответственно. Чего тебе еще-то для счастья надо?

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)

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

Добрый день, 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 функции и все проходит на ура и девайс работает. Причем заметил - если дописать несколько строчек С предложений то это приводит иногда к корректной компиляции макросов. Мистика?...

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required