19.6.101. Package(声明 Package 对象)
语法 :
Package (NumElements) {PackageList} => Package
参数
NumElements 被求值为一个整数。PackageList 是对象的初始化列表。
描述
声明一个未命名的聚合体,其中包含已命名的数据项、常量和/或对非数据命名空间对象的引用。该 package 的大小为 NumElements。PackageList 包含用于初始化该 package 的数据项、常量和/或对象引用。
如果省略 NumElements,ASL 编译器会自动将其设置为与 PackageList 中的元素个数匹配。如果 NumElements 存在并且大于 PackageList 中的元素个数,则使用 Uninitialized 类型的默认项(参见 ObjectType)来初始化超出 PackageList 所初始化部分的 package 元素。
PackageList 中允许三种类型的 package 元素:常量数据对象(Integers、Strings、Buffers 和 Packages)、解析为数据对象(Integers、Strings、Buffers 和 Packages)的命名引用,以及对数据对象之外对象的命名引用。
这些常量项在 ASL 编译时解析:
整数常量
字符串常量
Buffer 常量
Package 常量
这些对数据对象的命名引用在运行时由 AML 解释器解析为实际数据:
整数引用
字符串引用
Buffer 引用
Buffer Field 引用
Field Unit 引用
Package 引用
这些对非数据对象的命名引用不能解析为值。它们会作为引用返回到 package 中:
Device 引用
Event 引用
Method 引用
Mutex 引用
Operation Region 引用
Power Resource 引用
Processor 引用
Thermal Zone 引用
注意
对于类型为 Package 的 package 元素(定义子 package),子 package 的各个元素都按照上述规则进行解析,包括编译时和运行时。*
对未初始化元素求值将产生运行时错误,但可以在运行时为这些元素赋值以定义它们(通过 Index 运算符)。如果 NumElements 小于 PackageList 中定义的元素个数,则这是一个编译时错误。
对于 Package 声明,ASL 编译器可以发出两种不同的 AML 操作码,即 PackageOp 或 VarPackageOp。对于较小的固定长度 package,使用 PackageOp,并且此操作码与 ACPI 1.0 兼容。如果以下任一条件为真,则会发出 VarPackageOp:
NumElements 参数是一个 TermArg,只能在运行时解析。
在编译时,NumElements 被解析为一个大于 255 的常量。
PackageList 包含超过 255 个初始化元素。
示例 :
Name (INT1, 0x1234)
Processor (CPU0, 0, 0x1010, 6) {}
PowerResource (PWR1, 0, 0) {}
Name (PKG1, Package () {
0x3400, // Integer Constant, resolved at compile time
"Processor " // String Constant, resolved at compile time
\INT1 // Integer Reference, resolved to value at
// runtime
\CPU0 // Object Reference, returned as a reference
// object
Package () { // Package Constant. Elements are resolved at
// both compile time and runtime
0x4321, // Integer Constant, resolved at compile time
\INT1, // Integer Reference, resolved to value at
// runtime
\PWR1
})
父包和子包的运行时值为:
Package [Contains 0x05 Elements] {
(00) Integer 0x0000000000003400
(01) String [0x09] "Processor"
(02) Integer 0x0000000000001234
(03) Reference [Named Object] [CPU0] Processor
(04) Package [Contains 0x03 Elements]
(00) Integer 0x0000000000004321
(01) Integer 0x0000000000001234
(02) Reference [Named Object] [PWR1] Power
}