Перейти к содержанию
    

В одних случаях код вообще не меняется,

А вы оптимизацию включите :)

а в других появляются сообщения типа:

Warning[Pa082]: undefined behavior: the order of volatile accesses is undefined in this statement

когда пытаюсь передать volatile глобальную переменную как параметр функции.

Кусок кода привели бы...

Почему компилятор считает что эта глобальная переменная "в соответствии с volatile-доступом неопределена в этом выражении"?

Нет. "порядок доступа к volatile переменным не определен в данном выражении"

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А вы оптимизацию включите

Подобное предупреждение выскакивает при любых уровнях оптимизации

 

Кусок кода привели бы...

 

Полный код привести не могу (он очень большой)

Работает он приблизительно так как приведено ниже (только проверок внутри State1, State2 больше):

 

#define time1 10
#define time2 20
unsigned int timer;

#define state1 0
#define state2 1

//прерывание от ТС1 по совпадению с автосбросом
#pragma vector=TIMER1_COMPA_vect 
__interrupt void TIMER1_COMPA_IRQ(void)
{
  //сканирование кнопки
  Button_Scun();
}

void GoToState1(unsigned int t)
{
SaveLog(t);
timer = 0;
state = state1;
}

void GoToState2(unsigned int t)
{
SaveLog(t);
timer = 0;
state = state2;
}

void State1(void)
{
timer++;
if(timer > time1) GoToState2(timer);
}

void State2(void)
{
timer++;
if(timer > time2) GoToState1(timer);
}

void main(void)
{
state = state1;
timer=0;

for(;;)
{
__watchdog_reset();
__enable_interrupt();
__sleep();

switch(state)
{
case state_1: State1();
break;

case state_2: State2();
break;
}

}

}

 

 

Нет. "порядок доступа к volatile переменным не определен в данном выражении"

Сорри быстро и невнимательно прочитал :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Подобное предупреждение выскакивает при любых уровнях оптимизации

Полный код привести не могу (он очень большой)

Работает он приблизительно так как приведено ниже (только проверок внутри State1, State2 больше)

Извините, но из того куска кода, что Вы показали, я (видимо не я один) не понял, как он должен работать и уж тем более что в нем не работает. Тем более не ясно, как это вообще связано с volatile.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Извините, но из того куска кода, что Вы показали, я (видимо не я один) не понял, как он должен работать и уж тем более что в нем не работает. Тем более не ясно, как это вообще связано с volatile.

Изначально я просто поинтересовался в чём суть volatile и вы и vik0 всё доступно разъяснили:) Код у меня рабочий но привести его не могу из-за размеров (ну ещё из-за того что это коммерческий проект :)). В моём коде используется много глобальных переменных (без volatile). Некоторые из них спокойно переносят присваивание им квалификатора volatile, а для некоторых появляется ошибка приведённая выше (а именно у тех которые передаются как параметры в функции). Но в любом случае hex-файл прошивки получается один в один что с volatile что без :)

Спасибо всем ответившим на мой вопрос.

Думаю стоит помоч топикстартеру с реализацией его идеи.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...