Я столкнулся со странным поведением в моей программе. Для контекста я программирую микроконтроллер STM32F469. Используемая IDE — SW4STM32 (с версией Eclipse Neon (4.6.3)).
Чтобы сразу перейти к делу, вот что у меня есть:
void foo(void){
while(1){
if(var.x == 1){
var.x = 0;
var.y = 1;
// Some irrelevant calculus
var.y = 0;
}
}
Функция foo()
не имеет ничего конкретного. Он работает, помимо всего прочего, здесь не относящегося к делу, с глобальной переменной (структурой) var
.
void interruption(void){
if(var.x == 0 && var.y == 0){
// Some irrelevant calculus
var.x = 1;
}
}
Как следует из названия, функция interruption()
представляет собой ISR (процедура обслуживания прерываний). Прерывание, связанное с этим ISR, возникает примерно каждые 16 мс. Он работает с той же глобальной переменной (структурой) var
.
Наконец, вот мой main
:
int main(void)
{
myStruct var;
var.x = 0;
var.y = 0;
// Some initialization (the ISR for example)
foo();
}
Итак, чего я не понимаю, так это того, что весь процесс работает только в том случае, если между циклом while
и условием if
есть «что-то», например: задержка или переключение состояния вывода в функции foo()
:
void foo(void){
**Place something here to make the process work, a 1ms delay for example**
while(1){
if(var.x == 1){
var.x = 0;
var.y = 1;
// Some irrelevant calculus
var.y = 0;
}
}
Просто чтобы быть конкретным: когда это не работает, это означает, что моя программа не проходит ни условие if
в ISR, ни условие if
в функции foo()
. Когда это сработает, программа пройдет их оба (условие if
).
Тот факт, что оба условия if
ложны, означает, что:
var.x == 0
var.y == 1
- Оба эти значения истинны вне условия
if
. Дело в том, что здесь что-то не так, обычно эти значения встречаются только в условииif
функцииfoo()
. И если я нахожусь в этом состоянии,var.y
должно быть равно0
в конце этого состояния.
var
в настоящее время больше нигде не используется.
Итак, мой вопрос: есть ли у вас какое-либо объяснение этому феномену?
Спасибо !