首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用临时易失性限定符优化共享数组访问

使用临时易失性限定符优化共享数组访问
EN

Stack Overflow用户
提问于 2016-10-28 08:58:52
回答 1查看 200关注 0票数 6

我想知道在下面的场景中,临时的易失性限定符是否会产生正确的行为。假设ISR在数组中收集值,并且一旦收集了足够的值,它就表示准备就绪。

代码语言:javascript
复制
int array[10]; // observe no volatile here
int idx = 0;   // neither here
volatile bool ready = false; // but here

这是ISR是伪码

代码语言:javascript
复制
ISR() {
  if (idx < 10)
     array[idx++] = ...;
  ready = (idx >= 10);
}

假设我们可以保证在发送 ready信号并通过特定的方法( only )访问元素之后,只读取

代码语言:javascript
复制
int read(int idx) {
  // temporary volatile semantics
  volatile int *e = (volatile int*)(array + idx);
  return *e;
}

根据cpp-参考的说法这似乎是允许的

将非易失性值转换为易失性类型没有任何影响.若要使用易失性语义访问非易失性对象,必须将其地址转换为易失性指针,然后必须通过该指针进行访问。

为了完整起见,主例程执行以下操作

代码语言:javascript
复制
void loop() {
   if (ready) {
     int val = read(0); // Read value 
     // do something with val.
   }
}

在这种情况下,我应该期望从array读取正确的值还是在需要的数组元素上是易失性的,以确保从ISR()内部写入数组实际上是在RAM中执行的呢?

请注意,为什么C中需要易失性?没有详细说明在这种特殊情况下是否需要易失性。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-28 09:16:13

写到array[]并不是通过volatile,所以您不能依赖于这种可观察的行为。是的,编译器必须发出array的非缓存读取,但这只是图片的一半。

你说的是秩序,就好像它受到了volatile的影响--它不是。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40301542

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档