这是我的头文件(Header.h)
#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发生一次中断,如果它正确地执行了某些代码,它将使用30-40之间的值更改Var2并设置Flag变量。在主代码中,如果已设置标志,则应该是调用过程函数并将Var1更改为Var2值。 但有时我收到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");
}
}
并且所有中断函数都能正常工作,但在Process函数中它让我很生气。
我会感谢任何我没有注意的技巧。
答案 0 :(得分:1)
使用关键字&#34; volatile&#34;时不要指望任何事情。在任何类型的typedef里面。您正在声明类型&#34; struct St&#34;,包括关键字。您的描述意味着您期望变量&#34;变量&#34;上的易变行为,它是在没有关键字的情况下定义和声明的。 根据我的经验,关键字有时(取决于平台和编译器)在类型中有效。如果在变量的定义和声明中使用它似乎可靠地产生影响。
尝试更改
struct ST Variable;
到
volatile struct ST Variable;
和
extern struct ST Variable;
到
extern volatile struct ST Variable;
此外,周围是否有错误&#34; St&#34; !=&#34; ST&#34;,带有&#34;结构ST&#34;类型在别处宣布?
另外,作为旁注,您可能希望将类型声明移动到标题中。
我目前无法访问C环境,所以请原谅我没有测试我的答案。