switch-case Как бесконечный цикл с ветвлением!

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
king-live
Прорезались зубы
Сообщения: 238
Зарегистрирован: Сб янв 29, 2011 20:26:48

switch-case Как бесконечный цикл с ветвлением!

Сообщение king-live »

Доброго времени суток! Почему не работает код. Только один проход ветвления. Нету бесконечного цикла чтобы входила по очереди в case.

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


int x;
int main()
while(1)
{
switch(x)
{
case0:...
case1:...
case2:...
}
x=x+1;
}
}

Спасибо!
Реклама
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: switch-case Как бесконечный цикл с ветвлением!

Сообщение ploop »

В конце кейса что?
Реклама
king-live
Прорезались зубы
Сообщения: 238
Зарегистрирован: Сб янв 29, 2011 20:26:48

Re: switch-case Как бесконечный цикл с ветвлением!

Сообщение king-live »

....
case0: ....break;
.....
.....
ну в конце можно ещё дописать
if (x==3)
x=0;
.....
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Re: switch-case Как бесконечный цикл с ветвлением!

Сообщение ChipKiller »

king-live писал(а):Почему не работает код.

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

int x;
int main()
while(1)
{
switch(x)
.....
... наверное из-за невнимательности :)

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

int x;
int main()
{ 
while(1)
{
switch(x)
.....
Реклама
Эиком - электронные компоненты и радиодетали
king-live
Прорезались зубы
Сообщения: 238
Зарегистрирован: Сб янв 29, 2011 20:26:48

Re: switch-case Как бесконечный цикл с ветвлением!

Сообщение king-live »

Писал на форуме на скорую руку, поэтому и упустил "{" ниже пример.

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

#include <avr/io.h>
#define F_CPU 4000000UL
#include <util/delay.h>

int a;
int b;
int c;
int d;
int x;

int main ()
{
a=1;
b=2;
c=3;
x=0;
while(1)
	{
	switch(x)
		{
		case 0:
			  break;
		
		case 1:
			{
			 d=a+b;
			  break;
			}
		case 2:
			{
			d=a+c; break;
			}
		case 3:
			{
			d=b+c; break;
			}
		case 4:
			{
			d=d+b; break;
			}
		case 5:
			{
			d=c+b; break;
			}
		}
	x=x+1;
	}
}
Пошагово в AVRStudio хотел проверить изменения значений переменных. Для опыта. Но не входит даже в цикл.
Реклама
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: switch-case Как бесконечный цикл с ветвлением!

Сообщение ploop »

Хоть я и не силён в Си, но вижу, что у вас X чётко задан и равен нулю. Для компилятора остальной код просто не имеет смысла, поэтому отбрасывается.
Реклама
king-live
Прорезались зубы
Сообщения: 238
Зарегистрирован: Сб янв 29, 2011 20:26:48

Re: switch-case Как бесконечный цикл с ветвлением!

Сообщение king-live »

А какже "x=x+1;" значения x меняется. Но цикла нет всёравно.
Аватара пользователя
Goodefine
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср апр 16, 2008 13:22:54
Откуда: Приднестровье, Тирасполь

Re: switch-case Как бесконечный цикл с ветвлением!

Сообщение Goodefine »

А что будет после x=5? Его иногда и обнулять надо...
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
Аватара пользователя
Pavel V.
Мявтор!
Сообщения: 384
Зарегистрирован: Ср май 17, 2006 18:39:01
Откуда: Москва
Контактная информация:

Re: switch-case Как бесконечный цикл с ветвлением!

Сообщение Pavel V. »

Надо листинг смотреть, может соптимизировалось что-нибудь :) Попробуй объявить x как volatile.
К switch добавь ветку default, в ней же можно обнулять.
ellioh
Встал на лапы
Сообщения: 100
Зарегистрирован: Сб янв 22, 2011 16:57:45

Re: switch-case Как бесконечный цикл с ветвлением!

Сообщение ellioh »

Оно не volatile, как справедливо замечают выше. Выхода из цикла нет, значит, нигде более x не используется. Могло соптимизировать.

И вот тут есть простой совет: выключите оптимизацию!
Клоподавер упрыгхт
king-live
Прорезались зубы
Сообщения: 238
Зарегистрирован: Сб янв 29, 2011 20:26:48

Re: switch-case Как бесконечный цикл с ветвлением!

Сообщение king-live »

Еслибы цикл изначально работалбы, то конечно х обнулилбы после 5, но процесс изначально не стал работать! Если x не равно 0 а равно другому значению до 6. то в цикл входит, расчёт переменной d ведётся. Но опятьже один проход. и переменная х по листингу не изменяется т,е, до строчки х=х+1; не доходит.
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

Re: switch-case Как бесконечный цикл с ветвлением!

Сообщение avreal »

Да какая разница -- ни одна из указанных переменных никому вообще не нужна. Компилятору плевать. будет ли кто-то смотреть дизасм или в отладчике крутиить. Он не видит эффекта от кода -- выбрасывает и имеет полное право. Добавьте где-то в цикле PORTB = d;, чтобы он понял, что вычисления хоть кому-то нужны, и посмотрите опять.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Аватара пользователя
md5sum
Вымогатель припоя
Сообщения: 672
Зарегистрирован: Вт окт 27, 2009 22:39:19
Откуда: Москва

Re: switch-case Как бесконечный цикл с ветвлением!

Сообщение md5sum »

Оптимизатор посмотрев код и увидев, что значение d нигде не используется - выкинул весь switch нафиг :) Код работает при компиляции с ключем -O0
— Не говорите мне что делать и я не скажу куда Вам идти...
ellioh
Встал на лапы
Сообщения: 100
Зарегистрирован: Сб янв 22, 2011 16:57:45

Re: switch-case Как бесконечный цикл с ветвлением!

Сообщение ellioh »

Кстати, компилятору-то рукоплещу. Он выбросил код, меняющий глобальные переменные, на основании трёх фактов:
1. В рамках цикла факт изменения переменной ни на что не влияет.
2. Цикл вечный, то есть не по прерываниям больше ничего в программе выполняться не будет.
3. Глобальная переменная -- не volatile, то есть скрытым образом (сиречь в прерывании) изменяться и использоваться не может.

Вообще должен сказать, что avr-gcc в плане оптимизации меня в целом скорее радует. Иногда, конечно, загнёт что-то странное, но в среднем выходит достойно.
Клоподавер упрыгхт
king-live
Прорезались зубы
Сообщения: 238
Зарегистрирован: Сб янв 29, 2011 20:26:48

Re: switch-case Как бесконечный цикл с ветвлением!

Сообщение king-live »

Да окозалось намного сложнее! Если что-то нигде не используется, то и компилятор это выкидывает "нафиг" - как и было сказанно. Умно устроенно. Добавил PORTB и всё заработало как надо! Спасибо! Единственно почемуто иногда окно "Watch" где можно наблюдать за изменениями значений переменных не работает. Само окно с переменными выходит но изменений в значениях переменных не наблюдается.

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

#include <avr/io.h>
#define F_CPU 4000000UL
#include <util/delay.h>

int a;
int b;
int c;
int d;
int x;

int main ()
{
DDRB=0xFF;
a=1;
b=2;
c=3;
x=0;
while(1)
	{
	switch(x)
		{
		case 0:
			  break;
			
		case 1:
			{
			 d=a; break;
			}
		case 2:
			{
			d=a+1; break;
			}
		case 3:
			{
			d=a+2; break;
			}
		case 4:
			{
			d=a+3; break;
			}
		case 5:
			{
			d=a+4; break;
			}
		
		}
	x=x+1;
	PORTB=d;
	if (x==6)
	x=0;
	}
}
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18670
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: switch-case Как бесконечный цикл с ветвлением!

Сообщение ARV »

с локальными переменными в отладчике студии непросто: если они регистровые, а скорее всего, так оно и есть, отладчик не может их показать... если вы сделаете переменные глобальными, да еще и static (или лучше volatile) - вы сможете видеть их содержимое в окне Watch
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: switch-case Как бесконечный цикл с ветвлением!

Сообщение ploop »

Да окозалось намного сложнее! Если что-то нигде не используется, то и компилятор это выкидывает "нафиг" - как и было сказанно. Умно устроенно.
Если программировать "по большому" - это нормальное явление. Там и не такие фишки выползают. Поэтому и считаю, что если писать для МК на ЯВУ, то надо досконально знать особенности используемого компилятора...
king-live
Прорезались зубы
Сообщения: 238
Зарегистрирован: Сб янв 29, 2011 20:26:48

Re: switch-case Как бесконечный цикл с ветвлением!

Сообщение king-live »

если вы сделаете переменные глобальными,
А разве я не объявил переменную - глобальной (до функции). Я считал, что если переменная объявляется до какой нибудь функции, то внутри функции переменная считается глобальной. Или есть разница в том что, объявил до функции, а присвоил значение внутри функции, и после присвоения значения, переменная считается уже локальной.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18670
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: switch-case Как бесконечный цикл с ветвлением!

Сообщение ARV »

когда у вас кроме main нет никаких функций, компилятор в целях оптимизации не делает разницы между локальными и глобальными переменными - ее ведь и нет, не так ли? локальные-то прячутся от сторонних функций. а когда их нет - от кого прятаться? зато локальные лучше оптимизируются... вот у вас и выходят чудеса в решете :)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
king-live
Прорезались зубы
Сообщения: 238
Зарегистрирован: Сб янв 29, 2011 20:26:48

Re: switch-case Как бесконечный цикл с ветвлением!

Сообщение king-live »

Спасибо! Буду это иметь ввиду!
Ну а всётаки для укрепления знаний - если есть другие функции, то как это работает "нижеописанное" Что будет считаться приоритетным? " что глобальное и что локальное"
Или есть разница в том что, объявил до функции, а присвоил значение внутри функции, и после присвоения значения, переменная считается уже локальной.
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»