C

时间:2017-03-18 07:50:46

标签: c volatile

这是我的头文件(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函数中它让我很生气。

我会感谢任何我没有注意的技巧。

1 个答案:

答案 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环境,所以请原谅我没有测试我的答案。