19.6.84. Method(声明控制方法)
语法 :
Method ( MethodName, NumArgs, SerializeRule, SyncLevel, ReturnType, ParameterTypes ) {TermList}
参数
MethodName 作为 Namestring 数据类型求值。
NumArgs 是可选项,表示传递给该方法所需的参数个数,作为 Integer 数据类型求值。如果未指定,默认值为零个参数。一个方法最多可传递 7 个参数。这些参数可在方法内部作为 Arg0 到 Arg6 被引用。
SerializeRule 是可选项,是一个标志,用于定义该方法是否被串行化,其值为以下之一:Serialized 或 NotSerialized。被串行化的方法不能被其他线程重入。如果未指定,默认值为 NotSerialized。
SyncLevel 是可选项,用于指定该方法的同步级别(0 - 15)。如果未指定,默认同步级别为零。
ReturnType 是可选项,用于指定方法返回的对象类型。如果该方法不返回对象,则不指定任何内容,或指定 UnknownObj。若指定单一返回类型,只需使用 ObjectTypeKeyword(例如 IntObj、PkgObj 等)。若指定多个可能的返回类型,则用花括号括起以逗号分隔的 ObjectTypeKeyword。例如:{IntObj, BuffObj}。
ParameterTypes 是可选项,用于指定方法参数的类型。它是一个以逗号分隔的可变长度列表,列出每个方法参数所期望的对象类型,并用花括号括起。对于每个参数,其参数类型由一个 ObjectTypeKeyword,或一个用花括号括起的、以逗号分隔的 ObjectTypeKeyword 子列表组成。如果指定了 ParameterTypes,则参数个数必须与 NumArgs 匹配。
TermList 是一个可变长度的可执行 ASL 语句列表,表示控制方法的方法体。
说明
创建一个名为 MethodName 的新控制方法。这是一个命名包,包含一系列对象引用,它们共同表示一个控制方法;控制方法是一种可被调用以执行计算的过程。Method 会打开一个名称作用域。
系统软件按顺序引用该包中的对象来执行控制方法。有关方法执行的更多信息,见第 5.5.2 节
名称创建期间使用的当前命名空间位置会被调整为命名空间树中的当前位置。在该作用域内创建的任何名称都位于此包名称的“下方”。当前命名空间位置会赋给该方法包,并且在执行该包的控制方法期间发生的所有命名空间引用都相对于该位置。
如果一个方法被声明为 Serialized,则会以指定的 SyncLevel 获取一个与该方法对象关联的隐式互斥体。如果未指定 SyncLevel,则假定为 SyncLevel 0。串行化规则可用于防止方法被重入。如果该方法创建命名空间对象,这一点尤其有用。没有串行化规则时,当方法尝试创建相同的命名空间对象时,方法重入将失败。
每个方法都会自动提供八个局部变量,可作为 Local0 到 Local7 引用。这些局部变量可用于存储任意类型的 ASL 对象。
还要注意,由方法创建的所有命名空间对象都具有临时生命周期。当方法执行退出时,所创建的对象将被销毁。
示例
下面的 ASL 示例代码块展示了 Method 的一种用法,用于定义一个开启电源资源的控制方法。
Method (_ON) {
Store (One, GIO.IDEP) // assert power
Sleep (10) // wait 10ms
Store (One, GIO.IDER) // de-assert reset#
Stall (10) // wait 10us
Store (Zero, GIO.IDEI) // de-assert isolation
}
该方法是 _SRS(设置资源) 的一个实现。它展示了一个方法参数和两个方法局部变量的用法:
Method (_SRS, 1, NotSerialized)
{
CreateWordField (Arg0, One, IRQW)
Store (\_SB.PCI0.PID1.IENA, Local1)
Or (IRQW, Local1, Local1)
Store (Local1, \\_SB.PCI0.PID1.IENA)
FindSetRightBit (IRQW, Local0)
If (Local0)
{
Decrement (Local0)
Store (Local0, \\_SB.PCI0.PID1.IN01)
}
}