博客
关于我
C语言 关键字 | volatile
阅读量:543 次
发布时间:2019-03-09

本文共 1133 字,大约阅读时间需要 3 分钟。

C语言volatile关键字

1. 简介

volatile 是一个类型修饰符(type specifier),主要用来修饰被不同线程或因外部因素影响的变量。它的作用是确保编译器不会对访问该变量的代码进行优化,从而防止因编译器的优化导致的潜在问题。

2. 作用

volatile 的主要作用是阻止编译器对变量的访问进行优化。这意味着,无论编译器对代码进行怎样的优化,都不会对volatile变量的访问做出假设。具体表现为:

  • 防止优化丢失:编译器会生成针对volatile变量的直接读取指令,确保每次访问时都能读取最新的值。
  • 保证一致性:volatile变量的值不会因编译器的优化而被保留在寄存器中,因此需要每次访问都重新读取实际值。
  • 适用于特殊场景:如并行设备的硬件寄存器、多线程环境下的共享变量以及外部中断处理等。

例如,以下代码会被优化为只执行最后一条指令:

BYTE[0] = 0x12;
BYTE[1] = 0x34;
BYTE[2] = 0x56;
BYTE[3] = 0x78;

如果使用volatile修饰符,编译器会生成多次直接读取指令,从而保证每次操作的准确性。

3. 使用场景

volatile变量主要在以下场景下使用:

  • 并行设备的硬件寄存器:确保对状态寄存器的访问是可靠的。
  • 中断服务程序:防止编译器优化丢失对非自动变量的访问,保证中断处理的正确性。
  • 多线程环境:防止多个线程或任务共享的变量在不同时间有不同的值。

4. 个人理解

volatile的意义在于确保编译器不对变量的访问进行优化。其核心在于:

  • 禁止编译器优化:编译器就不会优化掉对volatile变量的访问。
  • 直接存取原始地址:保证变量值来源于实际存储地址,而不是可能过期的寄存器备份。
  • 通常与硬件/RTOS相关:在嵌入式开发中,volatile变量是处理中断、硬件状态等场景的重要标记。

语句分析

  • 参数既可以是const也可以是volatile吗?

    • 是的。例如,状态寄存器可以用const和volatile同时修饰。它是const因为程序不应该修改它,但因为可能被外部修改,所以是volatile。
  • 指针能否是volatile?

    • 是的。例如,在中断服务函数中修改一个指针(如缓冲区指针),该指针可以是volatile,因为中断可能直接修改它。
  • 函数是否能实现预期目标?

    • 不行。定义语句中参数已经是volatile,所以上述代码会生成建造性的代码,无法正确返回平方值。
  • 总结

    volatile是嵌入式开发中必须掌握的关键概念。正确理解和使用它,可以避免因编译器优化导致的逻辑错误,同时确保程序在特殊场景下的正确性。如果在开发过程中忽略volatile的作用,其后可能会面临严重的问题。

    转载地址:http://klliz.baihongyu.com/

    你可能感兴趣的文章
    Node-RED中将CSV数据写入txt文件并从文件中读取解析数据
    查看>>
    Node-RED中建立TCP服务端和客户端
    查看>>
    Node-RED中建立Websocket客户端连接
    查看>>
    Node-RED中建立静态网页和动态网页内容
    查看>>
    Node-RED中解析高德地图天气api的json数据显示天气仪表盘
    查看>>
    Node-RED中连接Mysql数据库并实现增删改查的操作
    查看>>
    Node-RED中通过node-red-ui-webcam节点实现访问摄像头并截取照片预览
    查看>>
    Node-RED中配置周期性执行、指定时间阶段执行、指定时间执行事件
    查看>>
    Node-RED安装图形化节点dashboard实现订阅mqtt主题并在仪表盘中显示温度
    查看>>
    Node-RED怎样导出导入流程为json文件
    查看>>
    Node-RED订阅MQTT主题并调试数据
    查看>>
    Node-RED通过npm安装的方式对应卸载
    查看>>
    node-request模块
    查看>>
    node-static 任意文件读取漏洞复现(CVE-2023-26111)
    查看>>
    Node.js 8 中的 util.promisify的详解
    查看>>
    node.js debug在webstrom工具
    查看>>
    Node.js HTTP模块详解:创建服务器、响应请求与客户端请求
    查看>>
    Node.js RESTful API如何使用?
    查看>>
    node.js url模块
    查看>>
    Node.js Web 模块的各种用法和常见场景
    查看>>