Tag: volatile

微控制器中的易失性关键字

volatile关键字告诉编译器不要优化带前缀的变量。 变量可能在运行时由未知源(编译器不知道)可能由外部中断等改变。 volatile还有其他优势吗? volatile是否适用于从文件中读取?

const volatile指针函数参数

对于嵌入式SW项目,我们需要使用一些const volatile TYPE *指针。 现在我们有一些计算函数,如下所示: uint8 calc(const volatile uint8 *array, uint8 value) { … } 在函数执行期间,两个变量的数据都没有变化。 调用代码如下所示: const volatile uint8 *array = (const volatile uint8 *)0x00010111; uint8 value = 8; uint8 result = calc(array, value); 现在的问题是,如果我们设计没有volatile参数的calucation函数会有区别: uint8 calc(const uint8 *array, uint8 value) { … } 对于电话,我们抛弃了波动: uint8 result = calc((const uint8 *)array, value); 第二种解决方案的优点是更灵活:我们也可以将该函数用于非易失性变量。 但它是否有所作为,如果我们抛弃volatile并且我们的编译器做了一些强有力的优化?

“volatile char *”类型的参数与“const char *”类型的参数不兼容

我有一个函数,其原型如下: void foo(const char * data); 在我的代码的其他地方,我有一个声明如下的全局变量 volatile char var[100]; 每当我尝试这样做: foo(var); 编译器抛出以下错误消息: “volatile char *”类型的参数与“const char *”类型的参数不兼容 为什么会这样? 据我了解,我的函数中的变量不允许更改指针或其内容。 我理解,因为我的全局变量是易变的,它可能随时发生变化,但看到拥有一个易变的const变量是完全合法的,我不明白为什么我得到这个编译器错误。 谢谢 –Amr

Java在C中易变?

我知道在Java中使用volatile 。 那是(基于维基百科的文章 ): 对volatile变量的读写有一个全局排序。 这意味着访问volatile字段的每个线程将在继续之前读取其当前值,而不是(可能)使用缓存值。 我也知道在C中存在volatile关键字,但在完全不同的上下文中,主要用于内存映射I / O. 所以我想知道,是否有一些像Java在C中volatile构造? 哪个会阻止读取变量的缓存值? 如果它不存在于C中,是否有一个带有这样的结构的库,比如pthread ?

volatile和extern有什么区别?

几天前我接受了采访,但仍然在寻找答案。 我想了解使用volatile关键字的意义。 找到下面的代码:两种不同的场景。 //project1 //File1.c int abc;//Global variable /*And this variable is getting used in some other files too.*/ if(abc == 3) //Say { printf(“abc == 3”); } else { printf(“abc != 3”); } /*So if or else part will not be optimized because “abc” can not be predicted, the value can chage at any […]

无限循环条件变量是否应始终声明为volatile?

考虑一下这种类型的代码, while( !cond ) ; 如果cond未声明为volatile,则编译器可以通过将其缓存在寄存器中来优化它。 在这种情况下,即使在设置cond后,while循环也将继续。 现在这是否意味着任何此类变量应始终声明为volatile ? 为什么编译器不够聪明才能意识到它不应该缓存这些变量?

非易失性数据的易失性指针

假设我有以下声明: int* volatile x; 我相信这定义了一个易失性指针“正常”变量。 对我来说,这可能意味着两件事之一: 首先猜猜 指针可以更改,但数字不会更改,恕不另行通知。 这意味着一些其他线程(编译器不知道)可以更改指针,但如果旧指针指向“12”则新指针(指针的新值,因为线程更改它) )会指向另一个“12”。 对我来说这似乎没用,我认为这不是真正的操作。 第二个猜猜 指针可以更改,因此如果指针发生更改,编译器必须在使用之前重新加载指针中的值。 但是如果它确认指针没有改变(带有附加检查),那么它可以假设它指向的值也保持不变。 所以我的问题是: 声明指向非易失性数据的易失性指针实际上做了什么?

为什么即使使用volatile关键字,编译器也会因strncmp()而优化掉共享内存读取?

这是一个程序foo.c ,它将数据写入共享内存。 #include #include #include #include #include #include #include #include int main() { key_t key; int shmid; char *mem; if ((key = ftok(“ftok”, 0)) == -1) { perror(“ftok”); return 1; } if ((shmid = shmget(key, 100, 0600 | IPC_CREAT)) == -1) { perror(“shmget”); return 1; } printf(“key: 0x%x; shmid: %d\n”, key, shmid); if ((mem = […]

内存映射文件和指向易失性对象的指针

我对C和C ++中volatile的语义的理解是它将内存访问转化为(可观察的)副作用 。 每当读取或写入内存映射文件(或共享内存)时,我都希望指针是volatile限定的,以表明这实际上是I / O. (John Regehr写了一篇关于volatile的语义的非常好的文章 )。 此外,我希望使用像memcpy()这样的函数来访问共享内存是不正确的,因为签名表明易失性限定被丢弃,并且内存访问不被视为I / O. 在我看来,这是一个支持std::copy() ,其中volatile限定符不会被丢弃,并且内存访问被正确地视为I / O. 但是,我使用指向volatile对象的指针和std::copy()访问内存映射文件的经验是,它比使用memcpy()要慢memcpy()数量级。 我很想得出结论,或许clang和海湾合作委员会在处理volatile上过于保守。 是这样的吗? 关于volatile访问共享内存有什么指导,如果我想遵循标准的字母并让它依赖我依赖的语义? 标准[intro.execution]§14的相关引用: 读取由volatile glvalue指定的对象,修改对象,调用库I / O函数或调用执行任何这些操作的函数都是副作用,这些都是执行环境状态的变化。 表达式(或子表达式)的评估通常包括值计算(包括确定用于glvalue评估的对象的身份以及获取先前分配给用于prvalue评估的对象的值)和启动副作用。 当对库I / O函数的调用返回或通过volatile glvalue进行访问时,即使调用所隐含的某些外部操作(例如I / O本身)或易失性访问,也会认为副作用已完成可能尚未完成。

在C中,如何将结构的成员声明为volatile?

如何将结构的特定成员声明为volatile?