精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

關鍵字volatile是什么?volatile關鍵字對編譯器優化的影響

Dp1040 ? 來源:strongerHuang ? 2023-11-03 11:47 ? 次閱讀

在我的技術交流群里,經常會看到大家討論一些“奇怪”的問題,其中有好幾次我都發現,是他們全局變量“惹的禍”,問題就是全局變量被優化導致的。

可能初學者不太關心編譯器優化的功能,但對于經驗豐富的工程師來說,掌握代碼優化是必備技能。

今天,我們講述的話題就是關于代碼優化中,關鍵字volatile在優化過程中起到的作用

關鍵字volatile是什么?

volatile是一個類型修飾符(type specifier)。

volatile的作用是作為指令關鍵字,確保本條指令不會因編譯器的優化而省略,且要求每次直接讀值。

volatile變量是說這變量可能會被意想不到地改變,這樣,編譯器就不會去假設這個變量的值了。

---來自百度百科

volatile的定義,應該在(讀書)學習時都看過無數遍,但我相信絕大部分人都沒有深刻理解其中含義

當你真正編程、開發項目之后,你就會進一步理解其中含義。

volatile關鍵字對編譯器優化的影響

我們都知道編譯器有優化代碼的功能,我們常用的集成開發環境(Keil、 IAR等)都有優化選項。

473fd922-79e1-11ee-939d-92fbcf53809c.jpg

如果不使用關鍵字 volatile 申明變量,則編譯器可能會對變量的訪問并生成非預期的代碼或刪除預期的功能。

1、什么時候使用volatile?

常見使用volatile聲明的情況:

訪問內存映射外設。

在多個線程之間共享全局變量。

在中斷例程或信號處理程序中訪問全局變量。

比如,在STM32代碼中:


#define __O volatile /*!< Defines 'write only' permissions */#define?????__IO????volatile?????????????/*!

瀏覽代碼,你會發現,很多地方都使用了“__IO”,也就是volatile.

在跑系統的項目中,線程間共享的全局變量,建議都加上volatile關鍵字,這一點,很多人沒有在意。

2、不用volatile時可能出現的問題

如果未將變量用volatile聲明,則編譯器會假定其值不能在其定義的范圍之外進行修改。

因此,編譯器可能會執行不需要的優化。這可以通過多種方式表現出來:

在輪詢硬件時,代碼可能會陷入循環。

多線程代碼可能會表現出奇怪的行為。

優化可能會導致刪除實現故意時序延遲的代碼。

舉個例子,這是我自己寫一個延時函數:


void Delay(int Cnt){ int i;

while(Cnt--) { i++; for(i=0; i<10; i++); ?}}

你在不同優化等級情況下,延時時間可能會不一樣

同樣的代碼,你在Keil 和 IAR環境下編譯出來的延時時間也可能不一樣。

當然,更深入的理解就會牽涉到匯編代碼,編譯之后的匯編代碼會比較直觀的呈現差異。

本文轉載自strongerHuang

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 編譯器
    +關注

    關注

    1

    文章

    1618

    瀏覽量

    49052
  • 關鍵字
    +關注

    關注

    0

    文章

    37

    瀏覽量

    6891
  • volatile
    +關注

    關注

    0

    文章

    45

    瀏覽量

    13009

原文標題:全局變量加/不加volatile的影響

文章出處:【微信號:玩點嵌入式,微信公眾號:玩點嵌入式】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    C語言關鍵字分別發生在哪個階段

    的第一個階段:預處理,對一些宏定義做替換。 第二個,const。 C語言中的 const 用于修飾只讀變量,表示變量本身不能修改。 這個關鍵字會在編譯的第二步起作用,也就是編譯。強行修改一個只讀變量,
    的頭像 發表于 11-24 10:31 ?84次閱讀

    C語言關鍵字--typedef

    C語言關鍵字使用方法學習指南!
    的頭像 發表于 10-07 12:44 ?176次閱讀

    使用邊緣AI和Sitara處理進行關鍵字檢測

    電子發燒友網站提供《使用邊緣AI和Sitara處理進行關鍵字檢測.pdf》資料免費下載
    發表于 09-02 11:30 ?0次下載
    使用邊緣AI和Sitara處理<b class='flag-5'>器</b>進行<b class='flag-5'>關鍵字</b>檢測

    快速掌握C語言關鍵字

    C語言中的32個關鍵字你知道多少個呢?根據關鍵字的作用分為四類:數據類型關鍵字、控制語句關鍵字、存儲類型關鍵字和其它
    的頭像 發表于 07-06 08:04 ?304次閱讀
    快速掌握C語言<b class='flag-5'>關鍵字</b>

    inline關鍵字優化導致此類函數被布局在flash內,怎么處理?

    == 0));} 由于uart.c多處調用這個函數,所以編譯器自作聰明地把它編譯成了非內聯函數(意圖是減少代碼占用?),且elf能找到uart_ll_is_tx_idle標號
    發表于 06-21 12:03

    IDF4.2.1的編譯器優化bug導致panic怎么處理?

    == 0) && (status.st_utx_out == 0));} 它是一個inline函數。我們都認為inline關鍵字,會告訴編譯器內聯此函數,于是它的代碼
    發表于 06-21 10:55

    簡單總結一下嵌入式C++中常見的錯誤形式

    對于 C++ 類,一些關鍵字只要寫在 .h 中就好,cpp 中就不用再加上了,比如 virtual、static 等關鍵字,如果在 cpp 中多寫,編譯器會報錯。
    的頭像 發表于 02-23 09:40 ?444次閱讀

    關鍵字搜索文件夾中某個TXT文件

    文件夾中隨時創造TXT文件,如何及時選出剛創造的文件?或關鍵字搜索出需要的TXT文件?
    發表于 02-06 15:22

    谷歌搜索引擎優化的各個方面和步驟

    谷歌搜索引擎是最受歡迎和廣泛使用的搜索引擎之一,為了使你的網站在谷歌上更好地排名并提高曝光度,你可以采取一些谷歌搜索引擎優化的步驟。 使用關鍵字研究工具,如Google AdWords關鍵字規劃工具
    的頭像 發表于 01-25 10:29 ?834次閱讀

    在NVM和本地\"內存中定義數組(靜態 /global /local)的\"關鍵字是什么?

    在 NVM 和本地\"內存中定義數組(靜態 /global /local)的\"關鍵字是什么? 還有與 32 位對齊的關鍵字怎么樣。
    發表于 01-25 07:52

    探討多線程編程中的volatile關鍵字應用

    有時候,我們可能需要在指針類型之間進行轉換,而編譯器會認為這是不安全的操作,從而導致編譯錯誤。使用volatile關鍵字可以告知編譯器,這個
    發表于 12-27 13:53 ?420次閱讀

    你還記得這個C語言關鍵字嗎?

    當你使用volatile關鍵字時,你告訴編譯器該變量的值可能會在程序的執行過程中被外部因素更改,因此編譯器不應該對該變量的讀寫進行優化。下面
    的頭像 發表于 12-17 08:00 ?332次閱讀
    你還記得這個C語言<b class='flag-5'>關鍵字</b>嗎?

    嵌入式軟件開發常用的關鍵字和運算符

    volatile是一個特征修飾符,提醒編譯器它后面所定義的變量隨時都有可能改變,因此編譯后的程序每次需要存儲或讀取這個變量的時候,告訴編譯器對該變量不做
    的頭像 發表于 12-04 12:22 ?563次閱讀

    vlookup提取關鍵字匹配多個結果

    是它能夠基于關鍵字匹配提取多個結果。 當使用VLOOKUP提取多個結果時,需要遵循以下幾個重要步驟。首先,您需要確保數據的組織和結構正確。數據應以表格格式排列,左側為關鍵字列,右側為相應的信息列。 首先,讓我們考慮一個實際的例子。假設您有一個大型數據集
    的頭像 發表于 12-01 10:40 ?2346次閱讀

    編譯器通常會怎么去處理使用volatile修飾的變量呢?

    在嵌入式軟件開發過程中,如果對volatile不熟,那可以你應該是個"假嵌入式程序員",因為一個變量需不需要使用volatile考慮的場景挺多的
    的頭像 發表于 11-29 10:05 ?347次閱讀
    <b class='flag-5'>編譯器</b>通常會怎么去處理使用<b class='flag-5'>volatile</b>修飾的變量呢?