STM32F4,IRQ 处理程序和具有共享变量的函数之间的奇怪行为
STM32F4, strange behavior between an IRQ Handler and a function with shared variables
我在我的程序中遇到了一个奇怪的行为。对于上下文,我正在对 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
条件之间存在 "something" 时,整个过程才有效,例如:延迟或 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;
}
}
具体一点:当它不起作用时,这意味着我的程序既没有通过 ISR 中的 if
条件,也没有通过 foo()
中的 if
条件功能。当它确实工作时,程序会通过它们(if
条件)。
两个 if
条件都为假的事实意味着:
var.x == 0
var.y == 1
- 这两个值都为真在
if
条件之外。问题是,这就是这里出现问题的地方,通常这些值仅在 foo()
函数的 if
条件下遇到。如果我处于这种状态,var.y
有 在这种情况结束时等于 0
。
var
目前没有在别处使用。
所以,我的问题是,你对这个现象有什么解释吗?
谢谢!
您可能看到寄存器缓存正在运行。确保您的全局变量声明为 volatile
(参见 https://barrgroup.com/Embedded-Systems/How-To/C-Volatile-Keyword)。基本上,生成的代码认为 var.x
不能在当前函数之外更改。 volatile
关键字告诉代码生成器它应该假设该值被异步操作(ISR、信号处理程序、其他线程等)修改。
哦,我假设目标语言是 C 或 C++,因为该语言定义了 volatile
关键字。
我在我的程序中遇到了一个奇怪的行为。对于上下文,我正在对 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
条件之间存在 "something" 时,整个过程才有效,例如:延迟或 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;
}
}
具体一点:当它不起作用时,这意味着我的程序既没有通过 ISR 中的 if
条件,也没有通过 foo()
中的 if
条件功能。当它确实工作时,程序会通过它们(if
条件)。
两个 if
条件都为假的事实意味着:
var.x == 0
var.y == 1
- 这两个值都为真在
if
条件之外。问题是,这就是这里出现问题的地方,通常这些值仅在foo()
函数的if
条件下遇到。如果我处于这种状态,var.y
有 在这种情况结束时等于0
。
var
目前没有在别处使用。
所以,我的问题是,你对这个现象有什么解释吗?
谢谢!
您可能看到寄存器缓存正在运行。确保您的全局变量声明为 volatile
(参见 https://barrgroup.com/Embedded-Systems/How-To/C-Volatile-Keyword)。基本上,生成的代码认为 var.x
不能在当前函数之外更改。 volatile
关键字告诉代码生成器它应该假设该值被异步操作(ISR、信号处理程序、其他线程等)修改。
哦,我假设目标语言是 C 或 C++,因为该语言定义了 volatile
关键字。