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

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

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

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

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

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

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.RUN
 
Регистрация: 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.RUN
 
Регистрация: 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.RUN
 
Регистрация: 31.12.2010
Сообщений: 837
Сказал спасибо: 371
Сказали Спасибо 153 раз(а) в 113 сообщении(ях)
Flopix на пути к лучшему
По умолчанию Re: Глюк оптимизатора?

По поводу прерываний не знал. Во всяком случае в GCC компиляторе у меня такой проблемы нет.
Flopix вне форума  
Непрочитано 10.08.2013, 14:15  
nahimovv
Заблокирован
 
Регистрация: 25.04.2013
Сообщений: 1,427
Сказал спасибо: 0
Сказали Спасибо 381 раз(а) в 251 сообщении(ях)
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:24.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.