我在程序中遇到了一种奇怪的行为。对于上下文,我正在编程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()
功能没有任何具体内容。除了其他不相关的东西之外,它还可以使用全局变量(struct)var
。
void interruption(void){
if(var.x == 0 && var.y == 0){
// Some irrelevant calculus
var.x = 1;
}
}
正如其名称所述,interruption()
功能是ISR(中断服务程序)。与此ISR相关的中断大约每16ms提高一次。它适用于相同的全局变量(struct)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;
}
}
具体来说:当它不起作用时,意味着我的程序既不会通过ISR中的if
条件,也不会通过if
函数中的foo()
条件。当它工作时,程序会遍历它们(if
条件)。
if
条件均为假的事实意味着:
var.x == 0
var.y == 1
if
条件。问题是,这就是错误的地方,通常这些值只在if
函数的foo()
条件下遇到。如果我处于此状态,var.y
在此条件结束时等于0
。 var
目前无处使用。
所以,我的问题是,你对这个现象有什么解释吗?
谢谢!
答案 0 :(得分:1)
您可能正在看到注册缓存的实际效果。确保将全局变量声明为volatile
(请参阅https://barrgroup.com/Embedded-Systems/How-To/C-Volatile-Keyword)。基本上,生成的代码不认为var.x
可以在当前函数之外进行更改。 volatile
关键字告诉代码生成器它应该假定该值被异步操作(ISR,信号处理程序,其他线程等)修改。
哦,我假设目标语言是C或C ++,因为该语言定义了volatile
关键字。