Можно ли влиять на while локальной переменной - C (СИ)
Формулировка задачи:
Всем привет, недавно сел на си и в общем-то использую си для AVR МК ATMEGA. Пока в этом не силён.
Проблема заключается в том, что у нас есть два мк атмега8 и между ними мост для передачи битов. В итоге мне приходится ждать в цикле пока глобальная переменная не изменит своё значение. Но что-то при изменении её (я вижу это на индикаторе осциллоскопа) ничего происходит, цикл остаётся по-прежнему активным. Ах да, схема представлены на протеус 7.
Короче, может ли на цикл while влиять глобальная переменная? Думаю понятно поставил вопрос.
P.S. Ппц, в загаловке темы нельзя писать слово "помощь". А как же "при помощи", "с помощью"?
Глобальную переменную*
Пока дождёшься ответа, уже и книжку прочтёшь). НО мне подсказали. В общем ответ: (ЦИТАТА)
"
Сделайте её volatile
Например, volatile int i;
Компилятор видит, что в коде цикла она не меняется и не добавляет проверку в целях оптимизации."
Обрати внимание на директиву «volatile». Сейчас я тебе расскажу про очень популярную ошибку среди новичков, чтобы ты ее не повторял. Дело в том, что у компилятора Си очень хитрый оптимизатор, но им надо уметь пользоваться. Если в коде встречается условие, которое ну никак не выполнится, по мнению компилятора, то оптимизатор легко может вырезать его из программы. Такое условие, например, – изменение переменной, которая не меняется в коде программы. Но ведь эта глобальная переменная может изменяться по прерыванию! Вот директива «volatile» и указывает именно на то, что переменная может непроизвольно изменяться внешними силами.
Решение задачи: «Можно ли влиять на while локальной переменной»
textual
Листинг программы
int val = 1;
...
while (val) {
...
if (expression)
val = !val;
}
Объяснение кода листинга программы
- Объявлена переменная типа int с именем
valи инициализирована значением 1. - В цикле while выполняется условие, где переменная
valпроверяется на ненулевое значение. - Внутри цикла while выполняется блок кода, который может содержать операторы и другие конструкции.
- Внутри цикла while проверяется условие
expression, если оно истинно, то выполняется операторval = !val;. - Операция
val = !val;меняет значение переменнойvalна противоположное. - Цикл while выполняется до тех пор, пока значение переменной
valне станет равным нулю. - После окончания цикла while выполняются операции, которые находятся после него в коде.