[经验分享] 嵌入式 volatile的作用

[复制链接]
4473|27
 楼主| tpgf 发表于 2024-11-7 10:21 | 显示全部楼层 |阅读模式
   别优化我,需要我的时候别老找寄存器传话

                                                                ——volatile变量

一、 volatile的作用
1.1 易变的
volatile声明的变量,表明该数据是易变的,每次使用读写该数据的时候,需要从主存重新读取,不应该为提高运行效率直接使用寄存器里的值,保证数据的一致性。

1.2 不可优化
volatile 会告诉编译器不要对其修饰的变量进行各种优化,尤其是将其删除。保证了与该变量相关的程序一定会执行。

1.3 顺序执行
volatile 会告诉编译器不要对其修饰的变量相关的代码进行顺序优化,保证该变量相关的代码按预定的顺序执行。

二、适用场景
(1)中断服务程序中修改并供其他程序使用的全局变量。

int test_flag = 0;

void test_task(void)
{
    if(test_flag == 1)
    {
        /* code */
    }
}

void ISR_EXTI_INTERRUPTS0_1(void)
{
    test_flag = 1;
}
(2)被多线程或多任务应用读写的全局变量。

(3)外设寄存器地址映射
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/qq_42357877/article/details/129324519

louliana 发表于 2024-11-8 21:07 | 显示全部楼层
当一个变量在中断服务程序中被修改,而在主程序或其他任务中被访问时,需要使用volatile关键字,以确保每次访问都能获取到最新的值。
youtome 发表于 2024-11-8 21:17 | 显示全部楼层
不同编译器对 volatile 的处理可能有所不同
jtracy3 发表于 2024-11-9 07:37 | 显示全部楼层
只有当变量确实可能会在程序的控制之外被改变时,才应该将其声明为 volatile。不恰当的使用 volatile 会导致不必要的性能损失。
ingramward 发表于 2024-11-9 08:35 | 显示全部楼层
volatile 是一个重要的关键字,用于处理特殊变量,但在使用时需要谨慎
dspmana 发表于 2024-11-9 12:04 | 显示全部楼层
volatile修饰符只能作用于变量,不能作用于常量表达式或函数调用等。
saservice 发表于 2024-11-9 12:39 | 显示全部楼层
volatile可以确保变量的可见性,但它并不能提供线程安全或原子操作。
deliahouse887 发表于 2024-11-9 19:15 | 显示全部楼层
volatile仅对变量的访问进行优化控制,并不影响变量的其他属性。例如,它不会改变变量的存储类型、作用域或生命周期。
51xlf 发表于 2024-11-9 19:40 | 显示全部楼层
因为 volatile 禁止了编译器的优化,所以它可能会导致程序性能下降。
abotomson 发表于 2024-11-10 09:11 | 显示全部楼层
在嵌入式系统中,许多硬件寄存器是通过内存映射的方式来访问的
primojones 发表于 2024-11-10 11:26 | 显示全部楼层
volatile 关键字在嵌入式系统中主要用于防止编译器优化
updownq 发表于 2024-11-10 12:31 | 显示全部楼层
避免编译器优化              
lihuami 发表于 2024-11-10 13:14 | 显示全部楼层
需要使用volatile来确保每次访问都是直接对硬件寄存器的操作
jtracy3 发表于 2024-11-10 15:53 | 显示全部楼层
volatile变量用于标记中断处理可能改变的内存位置
hilahope 发表于 2024-11-10 16:35 | 显示全部楼层
volatile关键字在嵌入式系统编程中扮演着重要的角色,它能够确保变量在特定条件下的正确访问和同步。
mikewalpole 发表于 2024-11-10 19:27 | 显示全部楼层
将不需要volatile修饰的变量声明为volatile,因为这可能会增加程序的复杂性和运行时的开销。
plsbackup 发表于 2024-11-10 20:16 | 显示全部楼层
在中断服务程序中,某些变量可能会被中断处理程序修改。使用 volatile 关键字可以确保主程序在访问这些变量时,总是读取最新的值。
burgessmaggie 发表于 2024-11-10 21:11 | 显示全部楼层
在嵌入式系统中,硬件寄存器的值可能会被外部硬件操作改变。使用 volatile 关键字可以确保每次访问这些寄存器时,都会从实际的硬件地址读取最新的值。
mmbs 发表于 2024-11-10 22:33 | 显示全部楼层
volatile 关键字确保编译器不会对声明为 volatile 的变量进行优化。
averyleigh 发表于 2024-11-11 11:58 | 显示全部楼层
频繁地使用volatile可能会影响编译器的优化,从而增加可执行文件的大小且降低程序性能。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2415

主题

17754

帖子

21

粉丝
快速回复 在线客服 返回列表 返回顶部