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. [.Net Core] - 当 .Net Core 版本由 1.x 升级至 2.x 后,Cookie 使用方式变更

    背景 Asp.Net Core 项目升级至 2.x 版本后,Cookie 验证方式需要进行更新. 升级前:.Net Core 1.x Startup.cs public void Configure( ...

  2. lnmp 是不是该吐吐槽

    lnmp 提供提供了便捷 , 并且手也伸的挺长的,它已不仅仅是个服务器环境那么简单 作为服务器继承环境来讲,可能每个人的认知程度不一,总之用了它需要服从它的规则 但从个人感觉上,其埋的坑还是让人不适, ...

  3. heroku 的用法

    heroku 安装cli npm install -g heroku ubuntu 下 sudo snap install --classic heroku 安装 npm init -y heroku ...

  4. 剑指offer66:机器人的运动范围

    1 题目描述 地上有一个m行和n列的方格.一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子. 例如,当k为18时,机器 ...

  5. Linux基础-02-目录文件管理

    1. Linux文件系统的层次结构 1) Linux文件系统的树状结构: 在Linux或UNIX操作系统中,所有的文件和目录都被组织成一个以根节点开始的倒置的树状结构. 2) 目录的定义: 目录相当于 ...

  6. 10分钟搭建一个小型网页(python django)(hello world!)

    10分钟搭建一个小型网页(python django)(hello world!) 1.安装django pip install django 安装成功后,在Scripts目录下存在django-ad ...

  7. Mock常用占位符一览

    1.随机字符串(类型 , 位数)@string(lower,10) lower : 小写字母upper : 大写字母number : 数字 2.随机int(下限 , 上限)@integer(60, 1 ...

  8. Kettle部署笔记

    1.启动脚本(启动job) /u02/www/data-integration/kitchen.sh -file:/u02/www/data-integration/job.kjb -logfile= ...

  9. Yii2 redis 使用

    首先要安装一下redis的扩展 composer require yiisoft/yii2-redis 在配置文件中添加redis配置 'components' => [ .... 'redis ...

  10. ASP.NET MVC 5 伪静态之支持*.html路由

    参考了例子 到自己实践还是有不少坑要踩,这种文章,你说它好还是不好呢 注意这里的版本是ASP.NET MVC 5 首页的URL为  http://localhost:58321/index.html  ...