C中的volatile变量是什么?

回答:

易失性的关键字是类型限定符防止从编译器optimization.According至C标准的对象,具有挥发性限定类型可以以实施方式未知进行修改或具有其他未知侧effects.You也可以说,一个对象可以随时更改volatile限定对象的值,而不需要代码执行任何操作。

如果一个对象被volatile限定符限定,那么每次程序访问它时,编译器都会从内存中重新加载该值,这意味着它阻止将变量缓存到寄存器中。从内存中读取值是检查内存的唯一方法。价值的不可预测的变化。


我们可以有一个易失性指针吗?

回答:

是的,我们可以用C语言创建一个易失性指针。

int * volatile piData; // piData是一个指向整数的易失性指针。


使用volatile关键字的正确位置?

回答:

在这里,我指出了一些需要使用volatile关键字的重要位置。

  • 访问内存映射外设寄存器或硬件状态寄存器。

#define COM_STATUS_BIT  0x00000006

uint32_t const volatile * const pStatusReg = (uint32_t*)0x00020000;

unit32_t GetRecvData()

{

//Code to recv data

)

{

// Wait untill flag does not set

}

return RecvData;

}

  • 在多个线程之间共享全局变量或缓冲区。
  • 访问中断例程或信号处理程序中的全局变量。

;

ISR(void)

{

;

}

int main(void)

{

while (!giFlag)

{

//do some work

}

;

}


C中的const和volatile限定符有什么区别?

回答:

const关键字是编译器强制执行的,并且表示程序无法更改对象的值,这意味着它使对象成为不可修改的类型。

例如,
const int a = 0; 

如果你试图修改“a”的值,你将得到编译器错误,因为“a”符合const关键字,阻止更改整数变量的值。

在另一方面,volatile阻止任何编译器优化,并且表示对象的值可以通过程序无法控制的内容进行更改,因此编译器不会对该对象做出任何假设。

例如,
volatile int a;

当编译器看到上述声明时,它避免对“a”做出任何假设,并且在每次迭代中从分配给变量的地址中读取值。


C中的变量可以是常量变量还是易变量?

回答:

是的,我们可以同时使用常量和常量。volatile和const关键字的最大用途之一是访问GPIO寄存器时。对于GPIO,如果将其配置为输入,则可以通过“外部因素”(如果交换机或任何输出设备与GPIO连接)更改其值。在这种情况下,volatile起着重要作用,并确保编译器始终从GPIO地址读取值并避免做出任何假设。

使用volatile关键字后,无论何时访问端口,都会得到正确的值,但是这还有一个问题,因为指针不是const类型,因此可能是程序更改了指针的指向地址。所以我们必须用volatile关键字创建一个常量指针。

声明的语法,

int volatile * const PortRegister;

如何阅读上述声明,

int volatile * const PortRegister;

|     |     |   |    |

|     |     |   |    +------> PortRegister is a

|     |     |   +-----------> constant

|     |     +---------------> pointer to a

|     +---------------------> volatile

+---------------------------> integer

考虑一个简单的下面例子:

#define PORTX 0x00020000 // GPIO的地址

uint32_t volatile * const pcPortReg =(uint32_t *)PORTX;

pcPortReg是一个指向易失性无符号整数的常量指针,使用* pcPortReg我们可以访问内存映射寄存器。

* pcPortReg = value; //将值写入端口

value = * pcPortReg; //从端口读取值

volatile相关知识的更多相关文章

  1. 【Java并发】1. Java线程内存模型JMM及volatile相关知识

    Java招聘知识合集:https://www.cnblogs.com/spzmmd/tag/Java招聘知识合集/ 该系列用于汇集Java招聘需要的知识点 JMM 并发编程的三大特性:可见性(vola ...

  2. 整理volatile相关知识点

    前言:volatile关键字在面试中经常被问到,从volatile关键字可以引申出许多知识点,因此有必要对此进行总结.本文根据<深入理解Java虚拟机——JVM高级特性与最佳实践>中的相关 ...

  3. 【Python五篇慢慢弹(5)】类的继承案例解析,python相关知识延伸

    类的继承案例解析,python相关知识延伸 作者:白宁超 2016年10月10日22:36:57 摘要:继<快速上手学python>一文之后,笔者又将python官方文档认真学习下.官方给 ...

  4. 移动WEB像素相关知识

    了解移动web像素的知识,主要是为了切图时心中有数.本文主要围绕一个问题:怎样根据设备厂商提供的屏幕尺寸和物理像素得到我们切图需要的逻辑像素?围绕这个问题以iphone5为例讲解涉及到的web像素相关 ...

  5. listener监听器的相关知识

    从别人的博客上我学习了listener的相关知识现在分享给大家 1.概念: 监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上 ...

  6. UIViewController相关知识

    title: UIViewController 相关知识date: 2015-12-13 11:50categories: IOS tags: UIViewController 小小程序猿我的博客:h ...

  7. 【转】java NIO 相关知识

    原文地址:http://www.iteye.com/magazines/132-Java-NIO Java NIO(New IO)是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的 ...

  8. NSString使用stringWithFormat拼接的相关知识

    NSString使用stringWithFormat拼接的相关知识 保留2位小数点 1 2 3 4 //.2代表小数点后面保留2位(2代表保留的数量) NSString *string = [NSSt ...

  9. iOS网络相关知识总结

    iOS网络相关知识总结 1.关于请求NSURLRequest? 我们经常讲的GET/POST/PUT等请求是指我们要向服务器发出的NSMutableURLRequest的类型; 我们可以设置Reque ...

随机推荐

  1. [C语言]小知识点 持续更新

    2019-11-24 1.如果输入: printf(,)); 会得到0: 这和我们的日常判断不相符! 然而,改成: printf(,)); 就可以成功输出“2”: 因此,注意pow函数返回的是浮点数, ...

  2. 01 web概念概述

    1.JavaWeb: 使用Java语言开发基于互联网的项目 2.软件架构:(1) C/S: Client/Server 客户端/服务器端在用户本地有一个客户端程序,在远程有一个服务器端程序如:QQ,迅 ...

  3. 最佳thread数量

    cpu 密集性task,过多的线程反而降低了处理效率,最佳的做法就是保持和cpu core数量大致相同的线程数量: threads = number of CPUs + 1 io密集型,因为会有cpu ...

  4. Docker 学习笔记(一):基础命令

    仅为个人查阅使用,要学习 Docker 的话,推荐看这份文档:<Docker - 从入门到实践> P.S. 大多数的 docker container xxx/docker image x ...

  5. 【Linux】Shell批量修改文件名

    修改文件名,替换中间字符: 例如:ABC_define_EFG.jpg,要把中间的define替换成argument: 用如下脚本即可: for var in *; do mv "$var& ...

  6. idea .gitignore模板

    IDEA 创建的项目,需要搞个.gitignore文件,文件内容可以参考插件的. # Created by .ignore support plugin (hsz.mobi) ### JetBrain ...

  7. redis原理及集群主从配置

    一.简介 存储系统背景 存储系统有三类: RDBMS oracle,dh2,postgresql,mysql,sql server NoSQL: KV NoSQL:redis,memcached 列式 ...

  8. java redisUtils工具类很全

    GitHub地址:https://github.com/whvcse/RedisUtil redisUtils工具类: package com.citydo.utils; import org.spr ...

  9. OOM与StackOverFlow发生的原因及解决办法【待完成】

    1,Out Of Memery 内存耗尽 1,1 产生原因 1.1.1 内存用完[堆内存] package com.cnblogs.mufasa; import org.junit.Test; imp ...

  10. SQL case when 遇到null值

    case  when f.FPH is  NULL then a.HSJE else f.KPHSJE  end    yes case f.FPH  when   NULL then a.HSJE ...