麻豆一区二区三区蜜桃免费_中文字幕Va一区二区三区 _国产成人综合久久二区_丰满多毛的大隂户毛茸茸_国产麻豆剧果冻传媒免费老狼_无码人妻精品一区二区三区久久久 _亚洲中文无码精品卡通_蜜臀亚洲AV永久无码精品老司机

【方輝專欄】ARM嵌入式編譯器(四) volatile 關(guān)鍵字對(duì)Arm Compiler 6編譯優(yōu)化的影響
發(fā)布時(shí)間:2022-08-10

摘要: 本文主要對(duì)Arm Compiler 6編譯器的volatile 關(guān)鍵字對(duì)優(yōu)化的影響進(jìn)行介紹。

關(guān)鍵字:Arm Compiler 6、編譯器、volatile 、優(yōu)化


1. volatile關(guān)鍵字的意義

當(dāng)一個(gè)變量使用volatile關(guān)鍵字進(jìn)行聲明時(shí),意味著這個(gè)變量是可能隨時(shí)被外部進(jìn)行修改的。(例如操作系統(tǒng)、硬件)

使用此聲明可以避免在編譯器優(yōu)化時(shí),假設(shè)沒有被修改或被使用就進(jìn)行優(yōu)化處理。


2. volatile關(guān)鍵字的使用

volatile用于可能從定義變量的范圍之外修改的變量。

例如,如果程序在某些計(jì)算中使用全局變量,編譯器會(huì)生成代碼以將變量的值加載到寄存器中以執(zhí)行該計(jì)算。如果隨后在另一個(gè)計(jì)算使用相同的全局變量,編譯器可能會(huì)直接使用寄存器的值,而不是從內(nèi)存重新加載到寄存器。這樣操作時(shí)因?yàn)榫幾g器優(yōu)化時(shí)認(rèn)為此變量不會(huì)被外部修改,但實(shí)際上對(duì)于內(nèi)存映射的外設(shè)是不正確的。因?yàn)榇俗兞靠赡軙?huì)被修改,直接使用上次寄存器值就會(huì)導(dǎo)致計(jì)算錯(cuò)誤。

讓我們看個(gè)實(shí)際的例子:

不使用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;
}

這兩個(gè)例程都在循環(huán)中遞增一個(gè)計(jì)數(shù)器,直到狀態(tài)標(biāo)志buffer_full為真。buffer_full的狀態(tài)是隨程序流異步改變。

左邊的例子沒有將變量聲明buffer_full為volatile,而右邊的進(jìn)行了聲明。

下面顯示了兩個(gè)程序在編譯之后再進(jìn)行反匯編之后的代碼。使用的編譯命令均為:

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沒有聲明為外部會(huì)改變的變量,因此編譯器假定它的值不能在程序之外被修改,因此優(yōu)化時(shí)省略了重新加載過程,就變成了一個(gè)無限循環(huán)。

在使用volatile聲明的例子中,編譯器假定buffer_full可以在程序外部更改不執(zhí)行優(yōu)化。因此buffer_full的值每次重新加載到r2寄存器中。此時(shí)生成的匯編代碼是正確的。


3. volatile關(guān)鍵字對(duì)編譯器優(yōu)化的影響

當(dāng)變量可能隨時(shí)被外部進(jìn)行修改時(shí),如果編譯器假定其值不能從定義它的范圍之外修改。因此,編譯器可能會(huì)執(zhí)行不必要的優(yōu)化。

這個(gè)問題可能有以下兩種表現(xiàn)方式:

1)輪詢時(shí),代碼可能會(huì)陷入死循環(huán)。

2)可能會(huì)導(dǎo)致刪除故意延時(shí)的代碼。


來源:《Arm? Compiler for Embedded User Guide Version 6.18》


+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


關(guān)于億道電子

億道電子技術(shù)有限公司(英文名稱:Emdoor Electronics Technology Co.,Ltd)是國內(nèi)資深的研發(fā)工具軟件提供商,公司成立于 2002 年,面向中國廣大的制造業(yè)客戶提供研發(fā)、設(shè)計(jì)、管理過程中使用的各種軟件開發(fā)工具,致力于幫助客戶提高研發(fā)管理效率、縮短產(chǎn)品設(shè)計(jì)周期,提升產(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)略合作伙伴關(guān)系,并作為他們?cè)谥袊鴧^(qū)的主要分銷合作伙伴服務(wù)了數(shù)千家中國本土客戶,為客戶提供從芯片級(jí)開發(fā)工具、EDA 設(shè)計(jì)工具、軟件編譯以及測(cè)試工具、結(jié)構(gòu)設(shè)計(jì)工具、仿真工具、電氣設(shè)計(jì)工具、以及嵌入式 GUI 工具等等。億道電子憑借多年的經(jīng)驗(yàn)積累,真正的幫助客戶實(shí)現(xiàn)了讓研發(fā)更簡單、更可靠、更高效的目標(biāo)。

歡迎關(guān)注“億道電子”公眾號(hào)

了解更多研發(fā)工具軟件知識(shí)