这是我的头文件(Header.h)volatile变量或用C挥发性结构问题
#include <stdio.h>
#include <string.h>
void Process(void);
和 “Header.C”
#include <stdio.h>
#include <string.h>
#include "Header.h"
struct St{
unsigned long int volatile Var1;
unsigned long int volatile Var2;
unsigned char volatile Flag;
};
extern struct ST Variable;
void Process(void){
Variable.Var1=Variable.Var2;
}
和主文件:
#include <stdio.h>
#include <string.h>
#include "Header.h"
struct St{
unsigned long int volatile Var1;
unsigned long int volatile Var2;
unsigned char volatile Flag;
};
struct ST Variable;
//Interrupt each 10us
void TIM_IRQHandler(){
//Do something
if(something==True)
{
Variable.Flag=1;
Variable.Var2=AVariable; //AVariable is between 30-40
}
}
int main(){
while(1)
{
//wait 10ms
if(Variable.Flag==1)
{
Process();
Variable.Flag=0;
}
}
}
正如你可以看到一个中断每10us发生一次,如果它正确地执行了一些代码,它将改变Var2的数值在30-40之间,并设置一个Flag变量乐。在主代码中,如果标志已被设置,它应该是呼叫处理功能并且用Var2值更改Var1。 但有时我收到var1与其他奇怪的值,他们是不正确的。我测试了我的中断,我发现我从来没有填写我的Var2奇怪的值。
void TIM_IRQHandler(){
//Do something
if(something==True)
{
Variable.Flag=1;
Variable.Var2= < 30-40>;
}
if(Variable.Var2>40 || Variable.Var2<30){
printf("ERROR");
}
}
和所有中断功能工作正常,但在过程功能,它让我生气。
我会欣赏任何我没有注意到的技巧。
这是什么意思? 'Variable.Var2 = < 30-40>;'它是如何编译的? – Arash
这不是我的确切代码,但它意味着它的值可能在30到40之间 –
@Ehsan Zakeri:当前一个结果仍在处理中时,您有可能发生第二次中断触发和'Var2'的潜在竞赛。如果读取不是原子的,比如在一个典型的8位MCU上,那么你可能会得到一些来自前一个值的字节,一些来自新的。最简单的解决方法是在Process之前重置'Variable.Flag'并测试,看看它是否在之后再次被提升,在这种情况下,你可以旋转并重试。相反,该标志应该是'sig_atomic_t'类型,在实践中这不太可能是个问题。还有其他需要注意的问题。 – doynax