首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

C语言变量修饰符`volatile`的含义和需要注意的地方

  • 25-03-05 05:15
  • 3088
  • 9869
blog.csdn.net

问题引出

在嵌入式开发中,对于指向寄存器的指针,前面常常加上修饰符volatile,比如下面的代码:

static volatile unsigned int *CCM_CCGR1;
  • 1

这个指针指向IMX6ULL的寄存器CCM_CCGR1,前面用了修饰符volatile,下面是详细解读。

volatile关键字概述

在C语言中,关键字 volatile 是一种类型修饰符,表示所修饰的变量可能在程序的控制流之外被修改,通常用于硬件寄存器、信号处理程序或者多线程的共享变量等场景。它告诉编译器不要对该变量的读写操作进行优化。

在上下文中的意义:

在代码中,CCM_CCGR1 是指向硬件寄存器的指针。这些指针指向的寄存器的值可能在程序之外由硬件修改,比如时钟控制或其他外设配置。通过添加 volatile 修饰符,可以确保每次访问该变量时,程序都会重新从寄存器地址读取值,而不是使用编译器可能优化存储的缓存值。

volatile 的关键作用:

  1. 防止编译器优化:
    编译器通常会优化代码,将变量存储在寄存器中而不是每次都访问内存。加了 volatile 后,编译器不会对该变量进行此类优化,每次都从变量所在的实际地址读取或写入值。

  2. 确保数据的即时性:
    如果变量的值是由外部事件(如硬件、其他线程)改变的,加上 volatile 后,编译器会确保对该变量的访问始终获取最新的值。

  3. 典型应用场景:

    • 硬件寄存器: 像代码中的 CCM_CCGR1,其值是由硬件控制,可能随时改变。
    • 中断处理程序: 中断可能会修改某些全局变量。
    • 多线程环境: 多线程间共享的变量可能会被其他线程修改。

示例说明:

int value = 0;             // 非volatile变量
volatile int flag = 0;     // volatile变量

void func(void)
{
    while (!flag)          // 如果没有volatile,编译器可能优化为死循环
    {
        // 编译器可能认为flag不会被修改,而优化掉重复读取
    }
    // 当flag被硬件或其他程序修改后,带volatile的flag能反映最新值
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

在代码中的意义

static volatile unsigned int *CCM_CCGR1;
  • 1

表示 CCM_CCGR1 是一个指向硬件寄存器的指针,由于硬件寄存器的值可能随时发生变化,使用 volatile 确保每次访问时都读取最新值。

特别注意:volatile的位置不一样,意义也不一样

volatile 修饰的不同位置会对代码的含义产生不同影响:

  1. 修饰指针指向的内容:

    volatile unsigned int *ptr;
    
    • 1

    表示 ptr 所指向的地址(寄存器的值)是易变的,每次访问时都会重新读取该地址的值。

  2. 修饰指针变量:

    unsigned int *volatile ptr;
    
    • 1

    表示 ptr 这个指针变量本身是易变的,编译器不能优化对 ptr 本身的访问,每次都要重新读取指针的值。

在这个地方,显然指针所指向的内容是易变的,而指针变量本身不是易变的,所以volatile的位置在前方,所以要用1中的代码。

昊虹嵌入式技术交流群
QQ群名片
注:本文转载自blog.csdn.net的昊虹AI笔记的文章"https://blog.csdn.net/wenhao_ir/article/details/144983848"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top