当前位置: 首页 > 知识库问答 >
问题:

C中的易失性变量或易失性结构问题

陶飞鸿
2023-03-14
#include <stdio.h>
#include <string.h>
void Process(void);
#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;
        }

    }

}
void TIM_IRQHandler(){

//Do something


    if(something==True)
    {
    Variable.Flag=1;
    Variable.Var2= < 30-40>;
    }
   if(Variable.Var2>40 || Variable.Var2<30){
      printf("ERROR");
     } 

}

所有的中断函数都能正常工作,但是过程函数却让我很生气。

我会感激任何我没注意的把戏。

共有1个答案

邢嘉祯
2023-03-14

在任何类型的typedef中使用关键字“volatile”时,千万不要有任何期望。您正在声明类型“struct st”,包括关键字。您的描述暗示您期望变量“variable”具有易变的行为,该变量是在没有关键字的情况下定义和声明的。根据我的经验,关键字只是有时(取决于平台和编译器)在类型中起作用。如果在变量的定义和声明中同时使用,它似乎会产生可靠的效果。

尝试更改

struct ST Variable;

volatile struct ST Variable;
extern struct ST Variable;
extern volatile struct ST Variable;
 类似资料:
  • 谢谢,伊利亚

  • 在阅读了这个问题和这个(尤其是第二个答案)之后,我对volatile及其关于记忆障碍的语义感到非常困惑。 在上面的例子中,我们写入一个易失性变量,这会导致一个mitch,这反过来会将所有挂起的存储缓冲区/加载缓冲区刷新到主缓存,使其他缓存行无效。 然而,非易失性字段可以优化并存储在寄存器中,例如?那么,我们如何才能确保给定一个写入易失性变量之前的所有状态变化都是可见的呢?如果我们有1000件东西呢

  • 当线程读取易失性变量时,它不仅会看到易失性的最新更改,还会看到导致更改的代码的副作用 这是在http://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html提到的 有人可以举个例子吗? 这首先给我的印象是,读取可变变量的线程将与编写器线程同步,并等待写入完成。但事实显然并非如此。 举个例子会很有帮助,非常感谢。 谢谢,

  • 我已经阅读了许多相互矛盾的信息(msdn,SO等),关于易失性和VoletleRead(ReadAcquireFence)。 我理解这些限制的内存访问重新排序含义——我仍然完全搞不清楚的是新鲜度保证——这对我来说非常重要。 msdn doc用于挥发性提及: (…)这样可以确保字段中始终存在最新的值。 挥发性字段的msdn文档提到: 对易失性字段的读取称为易失性读取。易失性读取具有“获取语义”;也就

  • 我已经读到,使引用变量易失性,并不会使其内部字段易失性。但我尝试了下面的示例,其中看起来易失性也应用于类的内部字段。 使用者java:-//字段“flag”设置为true的用户类。 MyRunnableThread1。java:- 在这里,我将“user”设置为volatile,而不是将其内部字段“flag”设置为volatile 子线程在“while(this.user.isFlag())”处连

  • 我对下面的代码段有一个问题。结果可能有一个结果[0,1,0](这是用JCStress执行的测试)。那么这是怎么发生的呢?我认为数据写入(data=1)应该在Actor2(guard2=1)中写入到guard2之前执行。我说得对吗?我问,因为很多时候我读到挥发物周围的说明没有重新排序。此外,根据这一点:http://tutorials.jenkov.com/java-concurrency/vola