Страница 1 из 1

Цикл без asm("nop") не работает

Добавлено: Сб апр 04, 2015 05:07:58
Ellissar
Столкнулся с проблемой при отладке программы в Atmel studio 6.2
если код выглядит так, то всё работает нормально

Код: Выделить всё

    while(1)
    {
		if (millis - prevMillis > 20)
		{
			prevMillis = millis;
			PORTC ^= (1<<5); //инверсия одного бита	
		}
		asm ("nop");
    }
но если из цикла выкинуть asm ("nop"); то светодиод не моргает. В чём проблема?

Код: Выделить всё

    while(1)
    {
		if (millis - prevMillis > 20)
		{
			prevMillis = millis;
			PORTC ^= (1<<5); //инверсия одного бита
		}
    }
Хочу разобраться с этим чтоб небыло проблем в будущем.

Re: Цикл без asm("nop") не работает

Добавлено: Сб апр 04, 2015 05:54:59
pyzhman

Код: Выделить всё

millis - prevMillis > 20
Скобки не забыли? На самом деле, наверное, должно выглядеть так:

Код: Выделить всё

(millis - prevMillis) > 20

Re: Цикл без asm("nop") не работает

Добавлено: Сб апр 04, 2015 09:36:06
Ellissar
Попробовал ваш вариант со скобками, но как и думал это ничего не изменило. Скобки ведь ничего не меняют здесь.

Re: Цикл без asm("nop") не работает

Добавлено: Сб апр 04, 2015 09:37:05
BorisSPB
millis должна быть volatile

Re: Цикл без asm("nop") не работает

Добавлено: Сб апр 04, 2015 09:48:10
Ellissar
volatile помогло, но почему так происходит? Хочу разобраться.

Re: Цикл без asm("nop") не работает

Добавлено: Сб апр 04, 2015 10:11:10
Аlex

Re: Цикл без asm("nop") не работает

Добавлено: Сб апр 04, 2015 10:46:14
Ellissar
Спасибо. Вроде бы понял.

Re: Цикл без asm("nop") не работает

Добавлено: Вт июн 09, 2015 23:21:44
AlphaLaiman
А почему тогда это работает с #asm "nop"?

Re: Цикл без asm("nop") не работает

Добавлено: Ср июн 10, 2015 11:42:56
Kinder_Surprise
Политика оптимизатора, АСМ не должен оптимизироваться. Вставив #asm "nop" вы указали оптимизатору, что содержимое while не просто так. Без АСМа оптимизатор посчитал код ненужным и просто его выкинул. Но правильнее будет с volatile.