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

Hello, All!

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

SREG_Bit7 = 0; SREG_Bit7 = 1;

а функции

__disable_interrupt(); __enable_interrupt();

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

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

Reply to
Vladimir Ivanov
Loading thread data ...

Всем привет!

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

Reply to
Askold Volkov

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)

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

Reply to
Ilja Vlaskin

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

Reply to
Vladimir Ivanov

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.