volatile用法

简介: volatile用法

还有很多搞嵌入式的不知道volatile这个关键字的作用啊。今天我就简单介绍一下。


volatile这个关键字很简单,就是防止编译器被优化,每次使用变量的时候,必须从内存里面取出。用粗俗的话来说就是,一个重复的代码,编译器可能会认为这个代码没有多次重复的意义,从而将这部分代码进行优化。


举个例子,很多时候,单片机的延时程序是根据一个变量不断减少实现的。以下为一个闪烁的灯光程序。


void delay(int time)  //假设这是一个延时0.5s的程序
{
    long long i;
    while(time--)
    {
        for{i=0xFFFFFFFFFFFFFFFF;i<1;i--};
    }
}
void main()
{
    while(1)
    {
        delay(2);
        P1^1=0;
        delay(2);
        P1^1=1;
    }
}


正常情况下,这个灯光会间隔一秒一闪一闪的。但是当这个程序写入单片机的时候,我们会发现,灯光一直亮着啊。这是什么原因呢?

很可能是因为这个i--的过程被编译器优化了。导致这个延时并不准确,做不到真正的0.5s延时。这个时候我们应该怎么做呢?就可以用volatile了。

void delay(int time)  //假设这是一个延时0.5s的程序
{
    volatile long long i;
    while(time--)
    {
        for{i=0xFFFFFFFFFFFFFFFF;i<1;i--};
    }
}
void main()
{
    while(1)
    {
        delay(2);
        P1^1=0;
        delay(2);
        P1^1=1;
    }
}


这个时候,又有人会说了,我从来没有见到过volatile这个关键字啊。一点都不常用。但凡多用过几次stm32就不会这么说了,我们写stm32的程序的时候,能经常看见__IO这个关键词,而__IO你查看他的定义,发现他是这么写的。

#define     __IO    volatile                  /*!< defines 'read / write' permissions   */
目录
相关文章
|
负载均衡 算法 前端开发
使用 Haproxy + Nginx 实现高可用
Haproxy 是目前比较流行的一种集群调度工具,同类集群调度器工具有很多,如 LVS 和 Nginx。相比较而言,LVS 性能最好,但是搭建相对复杂;Nginx 的 upstream 模块虽然支持集群功能,但是对集群节点健康检查功能不强,性能没有 Haproxy 好。
1026 0
使用 Haproxy + Nginx 实现高可用
|
开发工具
Python----schedule模块关于定时任务的高级用法二
Python----schedule模块关于定时任务的高级用法二
675 1
|
6月前
|
JSON 数据管理 Java
淘宝买家订单列表、订单详情、订单物流 API 接口全攻略
淘宝订单相关API接口是电商自动化的核心工具,提供订单数据管理和物流追踪功能。开发者可通过HTTP协议调用,支持Python、Java等语言,响应JSON格式数据。主要功能包括:订单列表查询、订单详情获取和物流轨迹追踪。申请流程:注册账号(c0b.cc/R4rbK2),创建应用并生成App Key,申请所需接口权限如taobao.trades.sold.get、taobao.trade.fullinfo.get等。
1146 7
|
3月前
|
前端开发 JavaScript 算法
《从量子奇境到前端优化:解锁卡西米尔效应的隐藏力量》
卡西米尔效应揭示了真空中能量涨落的奇妙现象,其微观调控机制为前端内存管理提供了新思路。通过构建内存约束模型、动态加载资源与碎片整理,可实现更高效的内存控制,提升应用性能与用户体验。
100 6
|
测试技术 API Python
掌握 Playwright:元素操作技巧大揭秘
Playwright Python 库简化了网页元素的交互,如点击和输入文本。使用 `click()` 方法可实现元素点击,`fill()` 方法用于在输入字段填充文本,而 `get_attribute()` 方法则用来获取元素属性值。这些功能在自动化测试和网页爬取中非常实用。
|
C++ Python
[ROS2] --- 手动编写一个节点
[ROS2] --- 手动编写一个节点
347 1
|
算法 安全 Go
Go切片删除元素错过这篇你就out了
Go切片删除元素错过这篇你就out了
3619 0
|
安全 Linux 虚拟化
解决Centos7 yum 出现could not retrieve mirrorlist 错误
在新安装的CentOS7.x通过VMware后,遇到无法通过`ip addr`获取IP地址以及`yum`安装软件时加载镜像列表失败的问题。
2270 2
|
Go
Go 语言中如何表示枚举值(enums)?
【2月更文挑战第22天】
862 3
|
存储 监控 安全
最佳推荐:必备局域网监控软件有哪些
寻找局域网监控软件以保障家庭或办公室网络安全?WorkWin、PRTG Network Monitor和NetWorx是不错的选择。WorkWin侧重USB管理、时间统计及权限控制,提升效率和安全;PRTG提供屏幕截图、流量监控和性能检查,助于网络优化;而NetWorx则具备实时监控、定时报告和连接管理,确保网络稳定。这些工具将帮助你实现远程监控、资源分配和安全防护。
263 2