Re: [问题] volatile的正确用法

楼主: csee (CSE)   2014-09-17 16:29:00
贡献一下我自己对volatile的看法:
一开始我自己也是一知半解, 后来接触嵌入式领域以后才比较清楚.
关于volatile的解释是:
如果一个变量会因为外力而改变(非程控流程)
那每次取值请到memory中去读取
一般而言, compiler会把 一个变量会被放在CPU的register or cache,
因为DRAM 的latency可是很吓人的
( DRAM 光 RTL 读取都要好几个cycle, 更遑论CPU处理 )
所以直接放在CPU中or Cache中可以快速取值.
然而某些情况 如果某些变量的值会被ISR改变,
这种情况, 到快取中取得的值就是错误的
因此你必须每次都到内存中去抓取.
例如Timer_ticks就是个很好的例子.
因为timer的值并非是自己写的程式主动去改动,
因此需要宣告成volatile, 告诉CPU抓取这个值的时候必须到内存中去读取.
※ 引述《windows2k (程式宅 <囧>)》之铭言:
: 开发平台(Platform): (Ex: VC++, GCC, Linux, ...)
: VC++/GCC/CLANG
: 额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
: None
: 问题(Question):
: volatile大概是C/C++最难了解的关键字之一
: 最近在看完这篇[How to zero a buffer](http://bit.ly/1wmpbys)产生的问题
: 在开启最佳化之后,对照Assembly Code,所有的编译器会舍弃掉stack上的memset。
: 不过如果照他的方式刻一个,会发现所有Compiler都会做清空的动作
: static void
: secure_memzero(void * p, size_t len)
: {
: volatile uint8_t * _p = p;
: while (len
楼主: csee (CSE)   2014-09-17 16:30:00
= =看到标题才发现讨论错主题 版主可以帮忙删吗?
作者: damody (天亮damody)   2014-09-17 23:06:00
没讲错呀~ 提供另一种角度思考xd
作者: loveme00835 (发箍)   2014-09-18 00:21:00
xDD
作者: carylorrk (carylorrk)   2014-09-18 06:16:00
一般环境 cache 是由 CPU/OS 管的。Compiler 还有可能干脆把变量或 expression 用 constant 取代掉~volatile 在底层比较常用是因为写底层根据我们对硬件及环境的了解才能保证 atomic operation. 这在 app 层是有很多顾虑的。所以才需要 sync utilities 像是 lock和 atomic

Links booklink

Contact Us: admin [ a t ] ucptt.com