【方辉专栏】ARM嵌入式编译器(四) volatile 关键字对Arm Compiler 6编译优化的影响
发布时间:2022-08-10

摘要: 本文主要对Arm Compiler 6编译器的volatile 关键字对优化的影响进行介绍。

关键字:Arm Compiler 6、编译器、volatile 、优化


1. volatile关键字的意义

当一个变量使用volatile关键字进行声明时,意味着这个变量是可能随时被外部进行修改的。(例如操作系统、硬件)

使用此声明可以避免在编译器优化时,假设没有被修改或被使用就进行优化处理。


2. volatile关键字的使用

volatile用于可能从定义变量的范围之外修改的变量。

例如,如果程序在某些计算中使用全局变量,编译器会生成代码以将变量的值加载到寄存器中以执行该计算。如果随后在另一个计算使用相同的全局变量,编译器可能会直接使用寄存器的值,而不是从内存重新加载到寄存器。这样操作时因为编译器优化时认为此变量不会被外部修改,但实际上对于内存映射的外设是不正确的。因为此变量可能会被修改,直接使用上次寄存器值就会导致计算错误。

让我们看个实际的例子:

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

这两个例程都在循环中递增一个计数器,直到状态标志buffer_full为真。buffer_full的状态是随程序流异步改变。

左边的例子没有将变量声明buffer_full为volatile,而右边的进行了声明。

下面显示了两个程序在编译之后再进行反汇编之后的代码。使用的编译命令均为:

armclang --target=arm-arm-none-eabi -march=armv8-a -Os -S


反汇编结果如下表所示:

不使用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没有声明为外部会改变的变量,因此编译器假定它的值不能在程序之外被修改,因此优化时省略了重新加载过程,就变成了一个无限循环。

在使用volatile声明的例子中,编译器假定buffer_full可以在程序外部更改不执行优化。因此buffer_full的值每次重新加载到r2寄存器中。此时生成的汇编代码是正确的。


3. volatile关键字对编译器优化的影响

当变量可能随时被外部进行修改时,如果编译器假定其值不能从定义它的范围之外修改。因此,编译器可能会执行不必要的优化。

这个问题可能有以下两种表现方式:

1)轮询时,代码可能会陷入死循环。

2)可能会导致删除故意延时的代码。


来源:《Arm® Compiler for Embedded User Guide Version 6.18》


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


关于凯发k8一触即发电子

凯发k8一触即发电子技术有限公司(英文名称:Emdoor Electronics Technology Co.,Ltd)是国内资深的研发工具软件提供商,公司成立于 2002 年,面向中国广大的制造业客户提供研发、设计、管理过程中使用的各种软件开发工具,致力于帮助客户提高研发管理效率、缩短产品设计周期,提升产品可靠性。

20 年来,先后与 Altium、ARM、Ansys、QT、Adobe、Visu-IT、Minitab、Testplant、EPLAN、HighTec、GreenHills、PLS、Ashling、MSC Software 、Autodesk、Source Insight、TeamEDA、MicroFocus等多家全球知名公司建立战略合作伙伴关系,并作为他们在中国区的主要分销合作伙伴服务了数千家中国本土客户,为客户提供从芯片级开发工具、EDA 设计工具、软件编译以及测试工具、结构设计工具、仿真工具、电气设计工具、以及嵌入式 GUI 工具等等。凯发k8一触即发电子凭借多年的经验积累,真正的帮助客户实现了让研发更简单、更可靠、更高效的目标。

欢迎关注“凯发k8一触即发电子”公众号

了解更多研发工具软件知识