相关疑难解决方法(0)

通过访问功能访问共享内存需要`volatile`吗?

[ 编辑 ]对于背景阅读,并且要清楚,这就是我所说的:volatile关键字简介

在查看嵌入式系统代码时,我看到的最常见错误之一是省略了线程/中断共享数据的volatile.但是我的问题是,volatile当通过访问函数或成员函数访问变量时,是否"安全"不使用?

一个简单的例子; 在以下代码中......

volatile bool flag = false ;
void ThreadA()
{
    ...
    while (!flag)
    {
        // Wait
    }
    ...
}

interrupt void InterruptB()
{
    flag = true ;
} 
Run Code Online (Sandbox Code Playgroud)

...变量flag必须是volatile,以确保ThreadA中的读取不被优化,但是如果通过函数读取标志,那么......

volatile bool flag = false ;
bool ReadFlag() { return flag }
void ThreadA()
{
    ...
    while ( !ReadFlag() )
    {
        // Wait
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

...... flag还需要挥发吗?我意识到它不易受到伤害,但我担心的是它何时被省略而且没有发现遗漏; 这会安全吗?

上面的例子是微不足道的; 在真实的情况下(以及我要求的原因),我有一个包装RTOS的类库,这样就有一个抽象类cTask来自任务对象.这样的"活动"对象通常具有访问数据的成员函数,而不是可以在对象的任务上下文中修改但可以从其他上下文访问; 这样的数据被声明为volatile是否至关重要?

我真的对这些数据的保证感兴趣,而不是实际编译器可能做的事情.我可能会测试一些编译器并发现它们从未通过访问器优化读取,但有一天会发现编译器或编译器设置使得这个假设不真实.我可以想象,例如,如果函数是内联的,那么这样的优化对于编译器来说是微不足道的,因为它与直接读取没有什么不同.

c c++ embedded volatile

18
推荐指数
2
解决办法
4456
查看次数

标签 统计

c ×1

c++ ×1

embedded ×1

volatile ×1