在以下情况下,我应该使用“Volatile”吗?

3
考虑到我的应用程序中有多个“.c”源文件。

Module1.c

static char status_variable = 0;

Modify1() 
{

   status_variable = 'a';

}

Modify2() 
{

   status_variable = 'x';

}

char GetStatus()
{
   return status_variable;
}

根据事件(非通过ISR)可以从其他.c文件调用Modify函数。

Module2.C

TakeAction()
 {
    if(GetStatus() == 'a')
    {
        //do something
    }
    else 
    {
        //do something
    }

}

现在我的问题是,在这种情况下,我需要将status_variable声明为volatile吗?
编辑1:
我的应用程序是16位微控制器(RL78),我没有使用任何操作系统。
编辑2:
正如一些人评论的那样,多线程根本没有出现在我的脑海中。我为我的应用程序编写了一个简单的非抢占式轮询调度程序。我不知道多线程环境中什么使变量成为易失性变量。它与我的环境有什么不同?如果有人能更详细地阐述它,那将是一个很大的帮助。

@Mat 不,我没有使用任何操作系统,也没有涉及到线程。 - Vagish
1
那么不需要将其设为volatile。如果“变量”以某种方式映射到I/O设备使用的内存上,则volatile会有所帮助,并且如果你在某些时刻中断正在运行的程序并跳转到其他代码,想要查看先前的更改(但这将是一种非并发线程或某种中断处理,而你已经表示这种情况并未发生),那么它将是必需的。 - Tony Delroy
2个回答

4

由于status_variable没有绑定到任何:

  • 内存映射的外设寄存器
  • 被中断服务例程修改的全局变量
  • 多线程应用程序中的全局变量

status_variable声明中可以安全地省略volatile关键字。


谢谢!您能否更详细地解释第三点?在RTOS中,多线程和多任务处理是相同的吗? - Vagish
@Vagish:在多线程应用程序中,您使用全局变量来在线程之间共享数据(没有基于MMU的内存保护),而当谈到操作系统进程/任务时,通常不会通过全局变量共享数据(每个进程的内存地址空间可以明确地由MMU分隔)。在最后一种情况下,您需要使用某种形式的IPC(进程间通信)机制。因此,volatile是不可能的选择。 - Eugeniu Rosca

1
如果模块可以同时运行(如果没有其他线程锁定机制),那么你绝对应该使用volatile,正如@BlueMoon93所说。但是,如果这些模块一个接一个地运行,那么你可以安全地跳过使用volatile的步骤。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接