volatile相关知识
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
while (((*pStatusReg) & COM_STATUS_BIT) == 0)
{
// Wait untill flag does not set
}
return RecvData;
}
- 在多个线程之间共享全局变量或缓冲区。
- 访问中断例程或信号处理程序中的全局变量。
volatile int giFlag = 0;
ISR(void)
{
giFlag = 1;
}
int main(void)
{
while (!giFlag)
{
//do some work
}
return 0;
}
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; //从端口读取值
- Exim Off-by-one(CVE-2018-6789)漏洞复现分析
- 一文学会用 Tensorflow 搭建神经网络
- 数据降维处理:PCA之特征值分解法例子解析
- 理解Eureka的自我保护模式
- 如何使用Feign构造多参数的请求
- 最简日志打印规范
- 碎片化 | 第四阶段-47-值栈细节问题-视频
- word2vec 模型思想和代码实现
- 碎片化 | 第四阶段-48-hibernate概述和配置-视频
- 【LEETCODE】模拟面试-357- Count Numbers with Unique Digits
- Python 爬虫 2 爬取多页网页
- 碎片化 | 第四阶段-49-hibernate之HQL查询操作-视频
- Spring Cloud各组件超时总结
- 总结Web应用中常用的各种Cache
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- strtol函数的用法——字符串转长整形
- JsonPath工具类封装
- Ubuntu16.04 实时内核 RT Preempt 安装
- c语言实现整数转换为字符串——不考虑负数
- JsonPath工具类单元测试
- Selenium4 IDE特性:无代码趋势和SIDE Runner
- 浮点数转成字符串函数gcvt()
- moco固定QPS接口升级补偿机制
- 大小端示例-arm c51
- #define的一个小技巧
- 干货 | 手把手教你用115行代码做个数独解析器!
- Ubuntu18.04 ROS安装小记
- 面试题系列第7篇:Java方法到底是值传递还是引用传递?
- input输入框内容规范正则总结
- 【干货满满】1.5w字初中级前端面试复习总结