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