【发布时间】:2017-10-10 21:49:55
【问题描述】:
假设我有以下 C 代码:
/* clock.c */
#include "clock.h"
static volatile uint32_t clock_ticks;
uint32_t get_clock_ticks(void)
{
return clock_ticks;
}
void clock_tick(void)
{
clock_ticks++;
}
现在我在中断内调用clock_tick(即:递增clock_ticks 变量),同时从main() 函数调用get_clock_ticks()(即:在中断外)。
我的理解是clock_ticks 应该声明为volatile,否则编译器可以优化它的访问并使main() 认为值没有改变(虽然它实际上是从中断中改变的)。
我想知道是否在那里使用get_clock_ticks(void) 函数,而不是直接从main() 访问变量(即:不将其声明为static)实际上可以强制编译器从内存中加载变量,即使它是未声明为 volatile。
我想知道这是因为有人告诉我这可能会发生。这是真的吗?在什么条件下?如果我使用“getter”函数,我是否应该始终使用volatile?
【问题讨论】:
-
volatile在您的情况下是必不可少的。从中断访问变量时会有所不同。这样编译器就知道有东西正在访问和修改它不知道的变量。否则,您的“getter”将(可能)返回变量的常量初始值。 -
getter 函数可能会被内联。可能存在可能表现为非确定性行为的缓存一致性问题。
-
@EugeneSh。谢谢你的评论!您介意添加一个答案来解释为什么 getter 没有任何区别吗?
-
@jxh 感谢您的评论!您介意添加一个答案来解释为什么 getter 没有任何区别吗?
标签: c embedded interrupt volatile