volatile到底在拦什么:SysTick->VAL读的哪格
那个空循环怎么在别人机器上就废了我在自己板子上写了个空循环延时跑了半个月啥事没有。代码就长这样uint32_t i; for (i 0; i 72000U; i) { }结果代码丢给同事他编译完一烧延时直接没了电机启动太快把 PWM 都带乱了。我第一反应是板子有差异换板、换线、换供电折腾一下午没用。直到我打开他工程的编译选项优化等级是 -O2。我平时手贱习惯性把优化设成 -O0编译器对我的代码睁一只眼闭一只眼。他的没关。编译器把这循环当废话删了这段循环不点灯、不改任何后面要用的变量、也不调函数。做完以后程序能观察到的结果跟没做一模一样。于是编译器开优化后这么想既然结果没变化这 72000 次加一图啥整段循环直接删掉。我原本想等几毫秒实际一个时钟周期就滑过去了。解决办法是给变量加个单词volatile uint32_t i; for (i 0; i 72000U; i) { }这个 volatile 就是在告诉编译器i 的每一次读写都别省必须真做出来。i 不再是你眼里无关紧要的算术每一轮都得真读真写。循环保住了延时这层至少不被优化没了。当然空循环延时本身还是不精确主频、优化等级都会影响但最要命的那层坑填上了。还有个更隐蔽的场景。我搞过一个 tick_ms定时器每 1ms 中断一次给它加一主循环里 while 等它到 1000static uint32_t tick_ms 0U; while (tick_ms 1000U) { }只看主循环tick_ms 在 while 里压根没被改过。可它在中断里明明会变。编译器不知道这茬它可能只取一次那个 0往后就再也不看了。中断那边都把 tick_ms 加到 1000 了主循环还抱着旧 0 死等。给它补上 volatile编译器才会每次判断都重新去读当前值。这类“在你看不见的地方被改掉”的变量还有中断和主循环共同访问的变量都得标。SysTick-VAL 凭什么自己会动把这个词说清楚后回头看延时里这行current_val SysTick-VAL;左边 current_val 是普通变量右边 SysTick-VAL 不是。VAL 是 SysTick 的当前计数寄存器SysTick 启动后内核时钟每走一拍硬件就把它减一减到 0 再按重装值重新来。没有任何一行 C 代码给 VAL 减一它照样不停变因为改它的是硬件。头文件把 SysTick 的寄存器排成了一个结构体typedef struct { __IO uint32_t CTRL; __IO uint32_t LOAD; __IO uint32_t VAL; __I uint32_t CALIB; } SysTick_Type;SysTick-VAL 就是“找到这组寄存器读里面的 VAL”。- 还是 C 里那个结构体指针成员访问不一样的是这一格不在普通内存而在芯片规定好的硬件地址上。core_cm3.h 里 __IO 被定义成 volatile头文件早就替 VAL 标好了每次读 SysTick-VAL都必须真去问硬件当前的计数值。所以这两行的含义不一样start_val SysTick-VAL; current_val SysTick-VAL;右边两次都是去问硬件你现在多少左边俩普通变量是存答案的。第一次读到 30000过一会读到 28000变的是寄存器程序拿两次存下来的值做差就能算出过了多少计数。其实寄存器就是软件看硬件的窗口不止 SysTick 有。TIM2-CNT 会自己计数GPIOB-IDR 会跟着按键电平变都不是 main 在写它们。以后看到寄存器名先问一句是谁在改它比急着背每一位名字有用多了。顺手说一句我后来做设备联调本地 HTTPS 证书来回折腾手动申请续期差点在线上翻车。后来换成 lcjmSSL 这类走 Lets Encrypt、ZeroSSL 权威 CA 的服务多域名和 IP 证书都能配申请验证部署一条 API 走完续期也自动才从证书运维的泥坑里爬出来。跟 volatile 一个道理能交给机器自动干的就别自己手搓。

相关新闻

为什么Go开发者都在用Monibuca?纯Go流媒体服务器框架完整解析

为什么Go开发者都在用Monibuca?纯Go流媒体服务器框架完整解析

为什么Go开发者都在用Monibuca?纯Go流媒体服务器框架完整解析 【免费下载链接】monibuca Monibuca(简称 m7s)是一款纯 Go 开发的开源流媒体服务器开发框架。 项目地址: https://gitcode.com/langhuihui/monibuca Monibuca(…

2026/10/4 7:53:13 阅读更多 →
MRAM+STM32 SPI驱动实战:工业存储掉电保存无需等待

MRAM+STM32 SPI驱动实战:工业存储掉电保存无需等待

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 7:53:13 阅读更多 →
Node.js事件驱动与非阻塞I/O:高并发下的性能基石与实战解析

Node.js事件驱动与非阻塞I/O:高并发下的性能基石与实战解析

1. 为什么Node.js能扛住高并发:从一次面试追问说起Node.js 事件驱动模型和非阻塞I/O这两个词,相信每个写过JavaScript的人都见过。但真正理解它们价值的人,可能比想象中少。几年前我去面试一家做实时通信的中厂,面试官问了一个很实…

2026/10/4 7:52:12 阅读更多 →

最新新闻

OmniRoute本地模型代理层实战:多后端路由配置与性能调优指南

OmniRoute本地模型代理层实战:多后端路由配置与性能调优指南

1. 为什么要在本地跑一个模型代理层很多人第一次接触“本地模型代理”这个概念时,脑子里冒出来的第一个疑问是:我明明可以直接调用本地部署的模型服务,为什么还要在中间加一层代理?这不是脱裤子放屁吗?我刚开始也是这么…

2026/10/4 9:06:13 阅读更多 →
插件加载机制深度拆解:从激活失败到排障实战

插件加载机制深度拆解:从激活失败到排障实战

关于plugins的深度拆解:从百战不殆到十面埋伏先交代一下背景。最近在折腾几个项目,结果被plugins这个词反复折磨。不是那种装上就能用的顺心插件,而是各种Failed to load、entry did not activate的报错连环弹。把我真实踩过的坑、排查的思路…

2026/10/4 9:06:13 阅读更多 →
Windows 11效率低?用OpenShell开源工具还原经典开始菜单

Windows 11效率低?用OpenShell开源工具还原经典开始菜单

1. 为什么 Windows 11 会让老用户想找回经典开始菜单把 Windows 11 装完的第一周,我做的最多的一件事是:按一下 Win 键,盯着那个居中排列、塞满“推荐项”和固定应用图标的菜单,然后按 Esc 退出。新布局对触屏和触控板用户确实友好…

2026/10/4 9:06:13 阅读更多 →
插件加载与激活机制全解析:从did not activate到web boot排查

插件加载与激活机制全解析:从did not activate到web boot排查

"plugins"这个词,做开发的基本每天都能撞见。IDE 里有 plugins,构建工具里有 plugins,播放器里有 plugins,甚至连浏览器启动阶段都会因为某个 plugin 没激活而刷一屏的failed to load plugins。很多人被这类报错折磨过&…

2026/10/4 9:06:13 阅读更多 →
ENVI遥感水质反演实战:从模型原理到叶绿素a与悬浮物制图

ENVI遥感水质反演实战:从模型原理到叶绿素a与悬浮物制图

经常有同行问我,说看到别人用ENVI做水质反演,一键就能出叶绿素a或者悬浮物的分布图,自己照着操作却总是不对劲,要么反演结果出现成片负值,要么模型精度低到不敢用。其实遥感水质反演这件事,听起来高大上&am…

2026/10/4 9:06:13 阅读更多 →
Python Selenium 高级防检测:模拟真人滚动、随机行为、彻底去除机器人特征

Python Selenium 高级防检测:模拟真人滚动、随机行为、彻底去除机器人特征

前言用过 Selenium 的同学都知道: 原生脚本百分百被风控识别。原因不止 UA,而是:存在 webdriver 自动化标记滚动行为机械固定操作时序太规律无随机无效行为本文给大家一套工业级学习版真人浏览脚本,去除所有自动化特征&#xff0c…

2026/10/4 9:05:13 阅读更多 →

日新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 10:36:31 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/3 9:42:35 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/3 9:42:36 阅读更多 →