贡献一下我自己对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