4.1.6. __global_reg

__global_reg 存储类说明符将声明的变量分配给全局变量寄存器。

语法


__global_reg(n) typevarName

其中:

n

是 1 到 8 之间的整数。

type

是以下类型之一:

  • long long 之外的任何整型

  • 任何字符类型

  • 任何指针类型。

varName

是变量名称。

限制

如果使用此存储类,则无法使用任何其他存储类,如 externstatictypedef

在 C 中,不能在声明时限定或初始化全局寄存器变量。 在 C++ 中,任何初始化均被视为动态初始化。

可用寄存器的数量因所使用的 AAPCS 变体而异,有 5 到 7 个寄存器可用作全局变量寄存器。

实际上,使用全局寄存器变量时,建议:

  • ARM 或 Thumb-2 中不要超过三个全局寄存器变量

  • Thumb-1 中不要超过一个全局寄存器变量

  • 全局浮点寄存器变量不要超过可用浮点寄存器数量的一半。

如果声明的全局变量太多,代码大小会显著增加。 在某些情况下,程序可能无法进行编译。

Caution

在使用全局寄存器变量时必须小心,原因如下:

  • 在链接时不进行检查,因而无法保证不同编译单元之间的直接调用是合理的。 如果可能,请在程序的每个编译单元内定义程序中使用的全局寄存器变量。 通常,最好将定义放在全局头文件中。 在使用全局寄存器之前,必须及早在代码中设置寄存器内的值。

  • 全局寄存器变量映射到由被调用方保存的寄存器,因此,对于未将该变量用作全局寄存器变量的编译单元,将通过函数调用来保存和恢复它的值,例如,库函数。

  • 回调使用全局寄存器变量的编译单元是很危险的。 例如,如果从未声明某个全局寄存器变量的编译单元中调用使用该全局寄存器的函数,函数将从其假定的全局寄存器变量中读取错误的值。

  • 只能在文件范围内使用此存储类。

示例

Example 4.1 声明一个分配给 r5 的全局变量寄存器。

Example 4.1. 声明全局整数寄存器变量


__global_reg(2) int x      ; v2 is the synonym for r5

Example 4.2 将生成错误,因为必须在同一变量的所有声明中均指定全局寄存器。

Example 4.2.  全局寄存器 - 声明错误


int x;

__global_reg(1) int x; // error

在 C 中,无法在定义时初始化 __global_reg 变量。Example 4.3 在 C 中生成错误,而在 C++ 中不生成错误。

Example 4.3. 全局寄存器 - 初始化错误


__global_reg(1) int x=1; // error in C, OK in C++

Copyright © 2007 ARM Limited. All rights reserved. ARM DUI 0348AC
Non-Confidential