摘要: 本文主要對Arm Compiler 6編譯器的volatile 關鍵字對優(yōu)化的影響進行介紹。
關鍵字:Arm Compiler 6、編譯器、volatile 、優(yōu)化
1. volatile關鍵字的意義
當一個變量使用volatile關鍵字進行聲明時,意味著這個變量是可能隨時被外部進行修改的。(例如操作系統(tǒng)、硬件)
使用此聲明可以避免在編譯器優(yōu)化時,假設沒有被修改或被使用就進行優(yōu)化處理。
2. volatile關鍵字的使用
volatile用于可能從定義變量的范圍之外修改的變量。
例如,如果程序在某些計算中使用全局變量,編譯器會生成代碼以將變量的值加載到寄存器中以執(zhí)行該計算。如果隨后在另一個計算使用相同的全局變量,編譯器可能會直接使用寄存器的值,而不是從內(nèi)存重新加載到寄存器。這樣操作時因為編譯器優(yōu)化時認為此變量不會被外部修改,但實際上對于內(nèi)存映射的外設是不正確的。因為此變量可能會被修改,直接使用上次寄存器值就會導致計算錯誤。
讓我們看個實際的例子:
不使用volatile聲明變量 | 使用volatile聲明變量 |
int buffer_full; int read_stream(void) { int count = 0; while (!buffer_full) { count++; } return count; } | volatile int buffer_full; int read_stream(void) { int count = 0; while (!buffer_full) { count++; } return count; } |
這兩個例程都在循環(huán)中遞增一個計數(shù)器,直到狀態(tài)標志buffer_full為真。buffer_full的狀態(tài)是隨程序流異步改變。
左邊的例子沒有將變量聲明buffer_full為volatile,而右邊的進行了聲明。
下面顯示了兩個程序在編譯之后再進行反匯編之后的代碼。使用的編譯命令均為:
armclang --target=arm-arm-none-eabi -march=armv8-a -Os -S
反匯編結(jié)果如下表所示:
不使用volatile聲明變量 | 使用volatile聲明變量 |
read_stream: movw r0, :lower16:buffer_full movt r0, :upper16:buffer_full ldr r1, [r0] mvn r0, #0 .LBB0_1: add r0, r0, #1 cmp r1, #0 beq .LBB0_1 ;infinite loop bx lr | read_stream: movw r1, :lower16:buffer_full mvn r0, #0 movt r1, :upper16:buffer_full .LBB1_1: ldr r2, [r1] ; buffer_full add r0, r0, #1 cmp r2, #0 beq .LBB1_1 bx lr |
在不使用volatile聲明的例子中,buffer_full沒有聲明為外部會改變的變量,因此編譯器假定它的值不能在程序之外被修改,因此優(yōu)化時省略了重新加載過程,就變成了一個無限循環(huán)。
在使用volatile聲明的例子中,編譯器假定buffer_full可以在程序外部更改不執(zhí)行優(yōu)化。因此buffer_full的值每次重新加載到r2寄存器中。此時生成的匯編代碼是正確的。
3. volatile關鍵字對編譯器優(yōu)化的影響
當變量可能隨時被外部進行修改時,如果編譯器假定其值不能從定義它的范圍之外修改。因此,編譯器可能會執(zhí)行不必要的優(yōu)化。
這個問題可能有以下兩種表現(xiàn)方式:
1)輪詢時,代碼可能會陷入死循環(huán)。
2)可能會導致刪除故意延時的代碼。
來源:《Arm? Compiler for Embedded User Guide Version 6.18》
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
關于億道電子
億道電子技術(shù)有限公司(英文名稱:Emdoor Electronics Technology Co.,Ltd)是國內(nèi)資深的研發(fā)工具軟件提供商,公司成立于 2002 年,面向中國廣大的制造業(yè)客戶提供研發(fā)、設計、管理過程中使用的各種軟件開發(fā)工具,致力于幫助客戶提高研發(fā)管理效率、縮短產(chǎn)品設計周期,提升產(chǎn)品可靠性。
20 年來,先后與 Altium、ARM、Ansys、QT、Adobe、Visu-IT、Minitab、Testplant、EPLAN、HighTec、GreenHills、PLS、Ashling、MSC Software 、Autodesk、Source Insight、TeamEDA、MicroFocus等多家全球知名公司建立戰(zhàn)略合作伙伴關系,并作為他們在中國區(qū)的主要分銷合作伙伴服務了數(shù)千家中國本土客戶,為客戶提供從芯片級開發(fā)工具、EDA 設計工具、軟件編譯以及測試工具、結(jié)構(gòu)設計工具、仿真工具、電氣設計工具、以及嵌入式 GUI 工具等等。億道電子憑借多年的經(jīng)驗積累,真正的幫助客戶實現(xiàn)了讓研發(fā)更簡單、更可靠、更高效的目標。

歡迎關注“億道電子”公眾號
了解更多研發(fā)工具軟件知識