你还记得这个C语言关键字吗?

你还记得这个C语言关键字吗?_第1张图片

当你使用 volatile 关键字时,你告诉编译器该变量的值可能会在程序的执行过程中被外部因素更改,因此编译器不应该对该变量的读写进行优化。下面是一些使用 volatile 的例子,以及对它们的一些文字描述:


1,防止编译器优化

#include 
int main() {
    int a = 0;
    while (a == 0) {
        // 此处的循环条件可能在外部被修改,使用 volatile 防止编译器优化
    }
    printf("Loop exited!\n");
    return 0;
}

这个例子中,a 的值可能会在循环外部被修改,但是由于循环内没有对 a 进行修改的语句,编译器可能会认为 a 的值在循环中永远不会变化,进而优化掉整个循环。通过使用 volatile,我们告诉编译器不要对这个变量的读写进行优化。


2. 提醒编译器不要缓存

#include 
#include 
#include 
volatile int flag = 1;  // 用于标识是否可以退出循环
void *threadFunction(void *arg) {
    sleep(2);  // 模拟一些操作
    flag = 0;  // 线程中修改 flag 的值
    return NULL;
}
int main() {
    pthread_t tid;
    pthread_create(&tid, NULL, threadFunction, NULL);
    while (flag) {
        // 在循环中读取 flag 的值,使用 volatile 防止编译器缓存
    }
    printf("Thread signaled exit!\n");
    pthread_join(tid, NULL);
    return 0;
}

在这个例子中,flag 的值在另一个线程中被修改。由于涉及多线程,编译器可能会对 flag 进行缓存优化。通过使用 volatile,我们提醒编译器不要对这个变量进行缓存,而是每次都从内存中重新加载。


3. 内存映射的硬件寄存器

#include 
volatile unsigned int *hardwareRegister = (volatile unsigned int *)0x12345678;
int main() {
    unsigned int value = *hardwareRegister;  // 从硬件寄存器读取值
    // 对硬件寄存器进行操作...
    *hardwareRegister = 42;  // 将值写入硬件寄存器
    return 0;
}

在这个例子中,hardwareRegister 是一个指向内存映射硬件寄存器的指针。硬件寄存器的值可能在程序执行期间被硬件修改,因此我们使用 volatile 保证了对硬件寄存器的读写不会被编译器优化,而是每次都从内存中重新加载。

==========

往期回顾:

STM32单片机实现固件在线升级

FreeRTOS中Systick的问题

CH32内部参考电压的笔记

strlen和sizeof的异同

STM32CubeMx的串口DMA收发数据

==========

你还记得这个C语言关键字吗?_第2张图片

你还记得这个C语言关键字吗?_第3张图片

你还记得这个C语言关键字吗?_第4张图片

你可能感兴趣的:(c语言,开发语言)