Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR...

 
Опции темы
Непрочитано 10.08.2013, 00:35  
Chudilo
Временная регистрация
 
Регистрация: 18.05.2007
Сообщений: 60
Сказал спасибо: 14
Сказали Спасибо 18 раз(а) в 14 сообщении(ях)
Chudilo на пути к лучшему
По умолчанию Глюк оптимизатора?

Здравствуйте, господа форумчане. Помогите разобраться.
Я работаю в AVRStudio 4.18. Есть простой код для mega8, который только и делает, что бегает в цикле, смотрит по флагу сканирования кнопок на состояние портов, на которых сидят кнопки. И если была нажата кнопка, зажигает или гасит светодиод. В прерывании таймера Т0 этот флаг взводится раз в 100мс, а в основном цикле сбрасывается.
Всё работает на ура, пока стоит уровень оптимизации О0, т.е. без оптимизации кода. Стоит включить любой другой уровень оптимизации, как код перестаёт работать. А если подробнее, то программа проходит основной цикл один раз, и куда-то улетает. Потом только ходит в прерывание и раз в 100мс выставляет флаг сканирования кнопок.

Код:
#include ‹avr/io.h›      // Определяет имена для портов ввода-вывода   
#include ‹stdio.h›       // подключение модуля ввода-вывода
#include ‹avr/interrupt.h›
//==================================================  =================
// Fclk = 4MHz
//==================================================  =======================
char couScanKeys; // счётчик для сканирования кнопок
char fScanKey;
//==================================================  =======================

//==================================================  =======================
ISR(TIMER0_OVF_vect)
{
	TCNT0 = 0xc1; // 1ms for 4MHz & prescaller = 64
	if(couScanKeys)
		couScanKeys--;
	else
	{
		couScanKeys = 100; // t = 0.1 s
		fScanKey = 1;
	}
}

void initProc()
{
	// T0
	TIMSK = (1‹‹TOIE0); // разрешаю прерывание по переполнению Т0
	TCNT0 = 0xc1; //(0x82 - 2 ms) (0xc1 - 1ms)
	TCCR0 = (1‹‹CS01)|(1‹‹CS00);    // включаю Т0 с прескаллером 64

	DDRB = 0xff; // out
	DDRB &= ~(1‹‹0); // in
	DDRD = 0; // in
	asm("sei");
}

void initVars()
{
	couScanKeys = 100;
}
int main()
{
	initProc();
	initVars();
	
	while(1)
	{
		if(fScanKey)
		{
			fScanKey = 0;
			if(!(PIND & (1‹‹7)))PORTB ^= 1‹‹5;//left
			if(!(PIND & (1‹‹6)))PORTB ^= 1‹‹3;//right
			if(!(PINB & (1‹‹0)))PORTB |= 1‹‹4;//up
			if(!(PIND & (1‹‹5)))PORTB &= ~(1‹‹4);//down
		}
	}
	
	return 0;
}
Если открыть дизасемблер, то можно увидеть следующее

Код:
54:       			if(!(PIND & (1‹‹5)))PORTB &= ~(1‹‹4);//down
+00000068:   98C4        CBI       0x18,4         Clear bit in I/O register
+00000069:   CFEA        RJMP      PC-0x0015      Relative jump
+0000006A:   CFFF        RJMP      PC-0x0000      Relative jump
54:       			if(!(PIND & (1‹‹5)))PORTB &= ~(1‹‹4);//down
+0000006B:   94F8        CLI                      Global Interrupt Disable
+0000006C:   CFFF        RJMP      PC-0x0000      Relative jump
+0000006D:   E3FF        LDI       R31,0x3F       Load immediate
+0000006E:   E030        LDI       R19,0x00       Load immediate
После выхода из функции прерывания РС попадает на строку 006А и там находится, пока не придёт следующее прерывание.

Кто-нибудь скажет, что происходит и как с этим бороться? Выкладываю проект в архиве
Вложения:
Тип файла: rar C project.rar (12.2 Кб, 29 просмотров)
Реклама:
Chudilo вне форума  
Непрочитано 10.08.2013, 00:45  
wss60
Временная регистрация
 
Аватар для wss60
 
Регистрация: 21.02.2007
Адрес: Minsk
Сообщений: 71
Сказал спасибо: 26
Сказали Спасибо 16 раз(а) в 15 сообщении(ях)
wss60 на пути к лучшему
По умолчанию Re: Глюк оптимизатора?

Если так:
Код:
volatile char couScanKeys; // счётчик для сканирования кнопок
volatile char fScanKey;
wss60 вне форума  
Сказали "Спасибо" wss60
Chudilo (10.08.2013)
Непрочитано 10.08.2013, 00:47  
Flopix
Гражданин KAZUS.RU
 
Регистрация: 31.12.2010
Сообщений: 837
Сказал спасибо: 371
Сказали Спасибо 153 раз(а) в 113 сообщении(ях)
Flopix на пути к лучшему
По умолчанию Re: Глюк оптимизатора?

Компилятор при оптимизации какое то из условий считает никогда не выполняемым и выбрасывает оттуда код. Чтобы узнать где добавляйте вывод куда нибудь отладочной информации. Когда найдете проблемное место постарайтесь построить условие по другому.
Сам натыкался на эти грабли в AtmelStudio 6.

Последний раз редактировалось Flopix; 10.08.2013 в 00:54.
Flopix вне форума  
Непрочитано 10.08.2013, 00:51  
Chudilo
Временная регистрация
 
Регистрация: 18.05.2007
Сообщений: 60
Сказал спасибо: 14
Сказали Спасибо 18 раз(а) в 14 сообщении(ях)
Chudilo на пути к лучшему
По умолчанию Re: Глюк оптимизатора?

Сообщение от wss60 Посмотреть сообщение
Если так:
Код:
volatile char couScanKeys; // счётчик для сканирования кнопок
volatile char fScanKey;
Спасибо, свершилось! Совсем забыл про volatile. А я уже хотел AVR Studio в урну выбрасывать
Chudilo вне форума  
Непрочитано 10.08.2013, 00:59  
Chudilo
Временная регистрация
 
Регистрация: 18.05.2007
Сообщений: 60
Сказал спасибо: 14
Сказали Спасибо 18 раз(а) в 14 сообщении(ях)
Chudilo на пути к лучшему
По умолчанию Re: Глюк оптимизатора?

Сообщение от Flopix Посмотреть сообщение
Где вы это видите? В дизассемблированном листинге из вашего поста я не вижу ни одной строки из подпрограммы прерывания.
Листинг большой, я не стал его полностью показывать.
Chudilo вне форума  
Непрочитано 10.08.2013, 00:59  
Flopix
Гражданин KAZUS.RU
 
Регистрация: 31.12.2010
Сообщений: 837
Сказал спасибо: 371
Сказали Спасибо 153 раз(а) в 113 сообщении(ях)
Flopix на пути к лучшему
По умолчанию Re: Глюк оптимизатора?

Получается что компилятор не считает процедуру прерывания частью программы раз она не вызывается явно и решает что значит эти 2 переменные никогда не изменяются?
Flopix вне форума  
Непрочитано 10.08.2013, 01:03  
wss60
Временная регистрация
 
Аватар для wss60
 
Регистрация: 21.02.2007
Адрес: Minsk
Сообщений: 71
Сказал спасибо: 26
Сказали Спасибо 16 раз(а) в 15 сообщении(ях)
wss60 на пути к лучшему
По умолчанию Re: Глюк оптимизатора?

спецификатор volatile
wss60 вне форума  
Эти 2 пользователя(ей) сказали Спасибо wss60 за это сообщение:
akegor (10.08.2013), Flopix (10.08.2013)
Непрочитано 10.08.2013, 01:12  
Chudilo
Временная регистрация
 
Регистрация: 18.05.2007
Сообщений: 60
Сказал спасибо: 14
Сказали Спасибо 18 раз(а) в 14 сообщении(ях)
Chudilo на пути к лучшему
По умолчанию Re: Глюк оптимизатора?

Flopix, для Вас листинг, если интересно

Код:
---- UNKNOWN_FILE ---------------------------------------------------------------------------------
0: File not found
+00000000:   C012        RJMP      PC+0x0013      Relative jump
+00000001:   C021        RJMP      PC+0x0022      Relative jump
+00000002:   C020        RJMP      PC+0x0021      Relative jump
+00000003:   C01F        RJMP      PC+0x0020      Relative jump
+00000004:   C01E        RJMP      PC+0x001F      Relative jump
+00000005:   C01D        RJMP      PC+0x001E      Relative jump
+00000006:   C01C        RJMP      PC+0x001D      Relative jump
+00000007:   C01B        RJMP      PC+0x001C      Relative jump
+00000008:   C01A        RJMP      PC+0x001B      Relative jump
+00000009:   C01A        RJMP      PC+0x001B      Relative jump
+0000000A:   C018        RJMP      PC+0x0019      Relative jump
+0000000B:   C017        RJMP      PC+0x0018      Relative jump
+0000000C:   C016        RJMP      PC+0x0017      Relative jump
+0000000D:   C015        RJMP      PC+0x0016      Relative jump
+0000000E:   C014        RJMP      PC+0x0015      Relative jump
+0000000F:   C013        RJMP      PC+0x0014      Relative jump
+00000010:   C012        RJMP      PC+0x0013      Relative jump
+00000011:   C011        RJMP      PC+0x0012      Relative jump
+00000012:   C010        RJMP      PC+0x0011      Relative jump
+00000013:   2411        CLR       R1             Clear Register
+00000014:   BE1F        OUT       0x3F,R1        Out to I/O location
+00000015:   E5CF        LDI       R28,0x5F       Load immediate
+00000016:   E0D4        LDI       R29,0x04       Load immediate
+00000017:   BFDE        OUT       0x3E,R29       Out to I/O location
+00000018:   BFCD        OUT       0x3D,R28       Out to I/O location
+00000019:   E010        LDI       R17,0x00       Load immediate
+0000001A:   E6A0        LDI       R26,0x60       Load immediate
+0000001B:   E0B0        LDI       R27,0x00       Load immediate
+0000001C:   C001        RJMP      PC+0x0002      Relative jump
+0000001D:   921D        ST        X+,R1          Store indirect and postincrement
+0000001E:   36A2        CPI       R26,0x62       Compare with immediate
+0000001F:   07B1        CPC       R27,R17        Compare with carry
+00000020:   F7E1        BRNE      PC-0x03        Branch if not equal
+00000021:   D02E        RCALL     PC+0x002F      Relative call subroutine
+00000022:   C048        RJMP      PC+0x0049      Relative jump
+00000023:   CFDC        RJMP      PC-0x0023      Relative jump
@00000024: __vector_9
---- main.c ---------------------------------------------------------------------------------------
13:       {
+00000024:   921F        PUSH      R1             Push register on stack
+00000025:   920F        PUSH      R0             Push register on stack
+00000026:   B60F        IN        R0,0x3F        In from I/O location
+00000027:   920F        PUSH      R0             Push register on stack
+00000028:   2411        CLR       R1             Clear Register
+00000029:   938F        PUSH      R24            Push register on stack
14:       	TCNT0 = 0xc1; // 1ms for 4MHz & prescaller = 64
+0000002A:   EC81        LDI       R24,0xC1       Load immediate
+0000002B:   BF82        OUT       0x32,R24       Out to I/O location
15:       	if(couScanKeys)
+0000002C:   91800060    LDS       R24,0x0060     Load direct from data space
+0000002E:   2388        TST       R24            Test for Zero or Minus
+0000002F:   F021        BREQ      PC+0x05        Branch if equal
16:       		couScanKeys--;
+00000030:   5081        SUBI      R24,0x01       Subtract immediate
+00000031:   93800060    STS       0x0060,R24     Store direct to data space
+00000033:   C006        RJMP      PC+0x0007      Relative jump
19:       		couScanKeys = 100; // t = 0.1 s
+00000034:   E684        LDI       R24,0x64       Load immediate
+00000035:   93800060    STS       0x0060,R24     Store direct to data space
20:       		fScanKey = 1;
+00000037:   E081        LDI       R24,0x01       Load immediate
+00000038:   93800061    STS       0x0061,R24     Store direct to data space
22:       }
+0000003A:   918F        POP       R24            Pop register from stack
+0000003B:   900F        POP       R0             Pop register from stack
+0000003C:   BE0F        OUT       0x3F,R0        Out to I/O location
+0000003D:   900F        POP       R0             Pop register from stack
+0000003E:   901F        POP       R1             Pop register from stack
+0000003F:   9518        RETI                     Interrupt return
@00000040: initProc
27:       	TIMSK = (1‹‹TOIE0); // ðàçðåøàþ ïðåðûâàíèå ïî ïåðåïîëíåíèþ Ò0
+00000040:   E081        LDI       R24,0x01       Load immediate
+00000041:   BF89        OUT       0x39,R24       Out to I/O location
28:       	TCNT0 = 0xc1; //(0x82 - 2 ms) (0xc1 - 1ms)
+00000042:   EC81        LDI       R24,0xC1       Load immediate
+00000043:   BF82        OUT       0x32,R24       Out to I/O location
29:       	TCCR0 = (1‹‹CS01)|(1‹‹CS00);    // âêëþ÷àþ Ò0 ñ ïðåñêàëëåðîì 64
+00000044:   E083        LDI       R24,0x03       Load immediate
+00000045:   BF83        OUT       0x33,R24       Out to I/O location
31:       	DDRB = 0xff; // out
+00000046:   EF8F        SER       R24            Set Register
+00000047:   BB87        OUT       0x17,R24       Out to I/O location
32:       	DDRB &= ~(1‹‹0); // in
+00000048:   98B8        CBI       0x17,0         Clear bit in I/O register
33:       	DDRD = 0; // in
+00000049:   BA11        OUT       0x11,R1        Out to I/O location
34:       	asm("sei");
+0000004A:   9478        SEI                      Global Interrupt Enable
35:       }
+0000004B:   9508        RET                      Subroutine return
@0000004C: initVars
39:       	couScanKeys = 100;
+0000004C:   E684        LDI       R24,0x64       Load immediate
+0000004D:   93800060    STS       0x0060,R24     Store direct to data space
40:       }
+0000004F:   9508        RET                      Subroutine return
@00000050: main
43:       	initProc();
+00000050:   DFEF        RCALL     PC-0x0010      Relative call subroutine
44:       	initVars();
+00000051:   DFFA        RCALL     PC-0x0005      Relative call subroutine
51:       			if(!(PIND & (1‹‹7)))PORTB ^= 1‹‹5;//left
+00000052:   E290        LDI       R25,0x20       Load immediate
52:       			if(!(PIND & (1‹‹6)))PORTB ^= 1‹‹3;//right
+00000053:   E028        LDI       R18,0x08       Load immediate
48:       		if(fScanKey)
+00000054:   91800061    LDS       R24,0x0061     Load direct from data space
+00000056:   2388        TST       R24            Test for Zero or Minus
+00000057:   F091        BREQ      PC+0x13        Branch if equal
50:       			fScanKey = 0;
+00000058:   92100061    STS       0x0061,R1      Store direct to data space
51:       			if(!(PIND & (1‹‹7)))PORTB ^= 1‹‹5;//left
+0000005A:   9987        SBIC      0x10,7         Skip if bit in I/O register cleared
+0000005B:   C003        RJMP      PC+0x0004      Relative jump
51:       			if(!(PIND & (1‹‹7)))PORTB ^= 1‹‹5;//left
+0000005C:   B388        IN        R24,0x18       In from I/O location
+0000005D:   2789        EOR       R24,R25        Exclusive OR
+0000005E:   BB88        OUT       0x18,R24       Out to I/O location
52:       			if(!(PIND & (1‹‹6)))PORTB ^= 1‹‹3;//right
+0000005F:   9986        SBIC      0x10,6         Skip if bit in I/O register cleared
+00000060:   C003        RJMP      PC+0x0004      Relative jump
52:       			if(!(PIND & (1‹‹6)))PORTB ^= 1‹‹3;//right
+00000061:   B388        IN        R24,0x18       In from I/O location
+00000062:   2782        EOR       R24,R18        Exclusive OR
+00000063:   BB88        OUT       0x18,R24       Out to I/O location
53:       			if(!(PINB & (1‹‹0)))PORTB |= 1‹‹4;//up
+00000064:   9BB0        SBIS      0x16,0         Skip if bit in I/O register set
53:       			if(!(PINB & (1‹‹0)))PORTB |= 1‹‹4;//up
+00000065:   9AC4        SBI       0x18,4         Set bit in I/O register
54:       			if(!(PIND & (1‹‹5)))PORTB &= ~(1‹‹4);//down
+00000066:   9985        SBIC      0x10,5         Skip if bit in I/O register cleared
+00000067:   CFEC        RJMP      PC-0x0013      Relative jump
54:       			if(!(PIND & (1‹‹5)))PORTB &= ~(1‹‹4);//down
+00000068:   98C4        CBI       0x18,4         Clear bit in I/O register
+00000069:   CFEA        RJMP      PC-0x0015      Relative jump
+0000006A:   CFFF        RJMP      PC-0x0000      Relative jump
54:       			if(!(PIND & (1‹‹5)))PORTB &= ~(1‹‹4);//down
+0000006B:   94F8        CLI                      Global Interrupt Disable
+0000006C:   CFFF        RJMP      PC-0x0000      Relative jump
+0000006D:   CFFF        RJMP      PC-0x0000      Relative jump
+0000006E:   E0FF        LDI       R31,0x0F       Load immediate
+0000006F:   01F9        MOVW      R30,R18        Copy register pair
+00000070:   8120        LDD       R18,Z+0        Load indirect with displacement
+00000071:   7F2E        ANDI      R18,0xFE       Logical AND with immediate
+00000072:   01FC        MOVW      R30,R24        Copy register pair
+00000073:   8320        STD       Z+0,R18        Store indirect with displacement
+00000074:   E381        LDI       R24,0x31       Load immediate
+00000075:   E090        LDI       R25,0x00       Load immediate
+00000076:   01FC        MOVW      R30,R24        Copy register pair
+00000077:   8210        STD       Z+0,R1         Store indirect with displacement
+00000078:   9478        SEI                      Global Interrupt Enable
+00000079:   91CF        POP       R28            Pop register from stack
+0000007A:   91DF        POP       R29            Pop register from stack
+0000007B:   9508        RET                      Subroutine return
+0000007C:   93DF        PUSH      R29            Push register on stack
+0000007D:   93CF        PUSH      R28            Push register on stack
+0000007E:   B7CD        IN        R28,0x3D       In from I/O location
+0000007F:   B7DE        IN        R29,0x3E       In from I/O location
+00000080:   E684        LDI       R24,0x64       Load immediate
+00000081:   93800060    STS       0x0060,R24     Store direct to data space
+00000083:   91CF        POP       R28            Pop register from stack
+00000084:   91DF        POP       R29            Pop register from stack
+00000085:   9508        RET                      Subroutine return
+00000086:   93DF        PUSH      R29            Push register on stack
+00000087:   93CF        PUSH      R28            Push register on stack
+00000088:   B7CD        IN        R28,0x3D       In from I/O location
+00000089:   B7DE        IN        R29,0x3E       In from I/O location
+0000008A:   DFC8        RCALL     PC-0x0037      Relative call subroutine
+0000008B:   DFF0        RCALL     PC-0x000F      Relative call subroutine
+0000008C:   C003        RJMP      PC+0x0004      Relative jump
+0000008D:   0000        NOP                      No operation
+0000008E:   C001        RJMP      PC+0x0002      Relative jump
+0000008F:   0000        NOP                      No operation
+00000090:   91800061    LDS       R24,0x0061     Load direct from data space
+00000092:   2388        TST       R24            Test for Zero or Minus
+00000093:   F3C9        BREQ      PC-0x06        Branch if equal
+00000094:   92100061    STS       0x0061,R1      Store direct to data space
+00000096:   E380        LDI       R24,0x30       Load immediate
+00000097:   E090        LDI       R25,0x00       Load immediate
+00000098:   01FC        MOVW      R30,R24        Copy register pair
+00000099:   8180        LDD       R24,Z+0        Load indirect with displacement
+0000009A:   2388        TST       R24            Test for Zero or Minus
+0000009B:   F054        BRLT      PC+0x0B        Branch if less than, signed
+0000009C:   E388        LDI       R24,0x38       Load immediate
+0000009D:   E090        LDI       R25,0x00       Load immediate
+0000009E:   E328        LDI       R18,0x38       Load immediate
+0000009F:   E030        LDI       R19,0x00       Load immediate
+000000A0:   01F9        MOVW      R30,R18        Copy register pair
+000000A1:   8130        LDD       R19,Z+0        Load indirect with displacement
+000000A2:   E220        LDI       R18,0x20       Load immediate
+000000A3:   2723        EOR       R18,R19        Exclusive OR
+000000A4:   01FC        MOVW      R30,R24        Copy register pair
+000000A5:   8320        STD       Z+0,R18        Store indirect with displacement
+000000A6:   E380        LDI       R24,0x30       Load immediate
+000000A7:   E090        LDI       R25,0x00       Load immediate
+000000A8:   01FC        MOVW      R30,R24        Copy register pair
+000000A9:   8180        LDD       R24,Z+0        Load indirect with displacement
+000000AA:   2F88        MOV       R24,R24        Copy register
+000000AB:   E090        LDI       R25,0x00       Load immediate
+000000AC:   7480        ANDI      R24,0x40       Logical AND with immediate
+000000AD:   7090        ANDI      R25,0x00       Logical AND with immediate
+000000AE:   9700        SBIW      R24,0x00       Subtract immediate from word
+000000AF:   F451        BRNE      PC+0x0B        Branch if not equal
+000000B0:   E388        LDI       R24,0x38       Load immediate
+000000B1:   E090        LDI       R25,0x00       Load immediate
+000000B2:   E328        LDI       R18,0x38       Load immediate
+000000B3:   E030        LDI       R19,0x00       Load immediate
+000000B4:   01F9        MOVW      R30,R18        Copy register pair
+000000B5:   8130        LDD       R19,Z+0        Load indirect with displacement
+000000B6:   E028        LDI       R18,0x08       Load immediate
+000000B7:   2723        EOR       R18,R19        Exclusive OR
+000000B8:   01FC        MOVW      R30,R24        Copy register pair
+000000B9:   8320        STD       Z+0,R18        Store indirect with displacement
+000000BA:   E386        LDI       R24,0x36       Load immediate
+000000BB:   E090        LDI       R25,0x00       Load immediate
+000000BC:   01FC        MOVW      R30,R24        Copy register pair
+000000BD:   8180        LDD       R24,Z+0        Load indirect with displacement
+000000BE:   2F88        MOV       R24,R24        Copy register
+000000BF:   E090        LDI       R25,0x00       Load immediate
+000000C0:   7081        ANDI      R24,0x01       Logical AND with immediate
+000000C1:   7090        ANDI      R25,0x00       Logical AND with immediate
+000000C2:   9700        SBIW      R24,0x00       Subtract immediate from word
+000000C3:   F449        BRNE      PC+0x0A        Branch if not equal
+000000C4:   E388        LDI       R24,0x38       Load immediate
+000000C5:   E090        LDI       R25,0x00       Load immediate
+000000C6:   E328        LDI       R18,0x38       Load immediate
+000000C7:   E030        LDI       R19,0x00       Load immediate
+000000C8:   01F9        MOVW      R30,R18        Copy register pair
+000000C9:   8120        LDD       R18,Z+0        Load indirect with displacement
+000000CA:   6120        ORI       R18,0x10       Logical OR with immediate
+000000CB:   01FC        MOVW      R30,R24        Copy register pair
+000000CC:   8320        STD       Z+0,R18        Store indirect with displacement
+000000CD:   E380        LDI       R24,0x30       Load immediate
+000000CE:   E090        LDI       R25,0x00       Load immediate
+000000CF:   01FC        MOVW      R30,R24        Copy register pair
+000000D0:   8180        LDD       R24,Z+0        Load indirect with displacement
+000000D1:   2F88        MOV       R24,R24        Copy register
+000000D2:   E090        LDI       R25,0x00       Load immediate
+000000D3:   7280        ANDI      R24,0x20       Logical AND with immediate
+000000D4:   7090        ANDI      R25,0x00       Logical AND with immediate
+000000D5:   9700        SBIW      R24,0x00       Subtract immediate from word
+000000D6:   F009        BREQ      PC+0x02        Branch if equal
+000000D7:   CFB7        RJMP      PC-0x0048      Relative jump
+000000D8:   E388        LDI       R24,0x38       Load immediate
+000000D9:   E090        LDI       R25,0x00       Load immediate
+000000DA:   E328        LDI       R18,0x38       Load immediate
+000000DB:   E030        LDI       R19,0x00       Load immediate
+000000DC:   01F9        MOVW      R30,R18        Copy register pair
+000000DD:   8120        LDD       R18,Z+0        Load indirect with displacement
+000000DE:   7E2F        ANDI      R18,0xEF       Logical AND with immediate
+000000DF:   01FC        MOVW      R30,R24        Copy register pair
+000000E0:   8320        STD       Z+0,R18        Store indirect with displacement
+000000E1:   CFAE        RJMP      PC-0x0051      Relative jump
+000000E2:   94F8        CLI                      Global Interrupt Disable
+000000E3:   CFFF        RJMP      PC-0x0000      Relative jump
+000000E4:   CFFF        RJMP      PC-0x0000      Relative jump
+000000E5:   0001        ???                      Data or unknown opcode
+000000E6:   FFFF        ???                      Data or unknown opcode
Chudilo вне форума  
Непрочитано 10.08.2013, 01:15  
Flopix
Гражданин KAZUS.RU
 
Регистрация: 31.12.2010
Сообщений: 837
Сказал спасибо: 371
Сказали Спасибо 153 раз(а) в 113 сообщении(ях)
Flopix на пути к лучшему
По умолчанию Re: Глюк оптимизатора?

По поводу прерываний не знал. Во всяком случае в GCC компиляторе у меня такой проблемы нет.
Flopix вне форума  
Непрочитано 10.08.2013, 14:15  
nahimovv
Заблокирован
 
Регистрация: 25.04.2013
Сообщений: 1,431
Сказал спасибо: 0
Сказали Спасибо 385 раз(а) в 254 сообщении(ях)
nahimovv на пути к лучшему
По умолчанию Re: Глюк оптимизатора?

(Шёпотом)Никому такое не говорите, смеяться будут. В GCC ещё и на ацкий "code reordering" нарваться можно.
nahimovv вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Глюк генератора частоты Proteus nictrace Proteus 5 21.09.2011 09:00
[Решено] Глюк светодиода HB5-439AWCA sergsher Коллекция глюков 3 16.10.2010 09:36
Присвоение значения - глюк Протеуса? maxNTF Микроконтроллеры, АЦП, память и т.д 24 26.02.2010 13:14
Глюк работы модема US Robotics 56К ant_ Коллекция глюков 3 19.06.2009 08:10
Какой-то глюк с PIC в Proteus Alexandr_Il Микроконтроллеры, АЦП, память и т.д 19 11.01.2009 00:12


Часовой пояс GMT +4, время: 17:14.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot