第6章:对象类型及命名固件C字营·版权所有
敬请关注微信公众号:“固件C字营”

=====================================================================
-
ACPI/ASL字符集
与其他的编程语言类似,每一种语言都有其支持的字符集合,使用这些字符的组合来定义对象、路径、数字、常量、方法。字符集是组成ASL代码的最小基本单位。
- 多个空格相当于一个空格。空行、小括号、逗号、新行,都是分隔符
- “//”表示从”//”开始到行末都是注释
- “/*”表示直到最近的“*/”结尾都是注释
- “”表示ASCII字符串,支持转义字符‘\’
- 支持整形数字。10(十进制),0x0A(16进制),012(8进制)
- {Nothing}表示空的目标,或{}
- 支持的字符集为“A-Z”、“a-z”\“0-9”、“_”、‘^’、 ‘,’ 、‘\’等
- 常量True | False、Zero | One | Ones
- 算子‘+’ | ‘-‘ | ‘*’ | ‘/’ | ‘%’ | ‘&’ | ‘|’ | ‘^’ | ‘~’ | ‘<’ | ‘>’ | ‘!’ | ‘=’及其组合
- 命名可以使用数字、字母或下划线。0x00表示NULL字符
- True表示Ones,False表示Zero
- 父名字空间前缀“^”,用于在孩子域中访问“父名字空间”的资源
- 路径分隔符“.”,用于分割不同的路径域
- ASL名大小写不敏感,都会被编译器转化为大写
- 支持宏,宏会在编译之后生成算子集如:EISAID、For、Printf、ResourceTemplate、Unicode
-
ACPI/ASL对象(数据)类型
ACPI/ASL是一种声明式编程语言,把一切都视作对象,预定义了多种对象类型(Object)以及对各种对象进行操作的算子(ASL operator)。每一种对象都有唯一的对象类型编码(ObjectType)范围是0~16,其他的未定义类型作为Reserved不能使用,可以使用ObjectType()方法获取类型编码。不同对象类型之间支持显示类型转换,也支持隐式类型转换。
[Uninitialized]:未定义类型。一般是未初始化的LocalX、ArgX或未初始化的Package成员
Buffer:字节数组,默认值为全部“0”的未初始化状态
Buffer Field:Buffer内部的字段,可以是bit、字节、双字节、4字节等。
Debug Object:调试对象,用于把需要打印的对象输出到系统调试接口或调试终端
Device:设备或总线对象,如CPU、PCI根控制器、USB控制器
Event:事件同步对象
Field Unit:地址空间内部的字段,可以按bit来访问。
Integer:64bit的小端模式整形,低32bit有效,高32bit为0(ACPI 1.0是32bit整形)
Integer constant:整形常量。“Zero”, “One”, “Ones”, and “Revision”.
Method:控制方法,可以编译成AML字节码被解释执行
Mutex:互斥同步对象,如对EC进行访问时对互斥锁。
Object Reference:引用对象。一般使用RefOf, Index, CondRefOf创建引用对象。
Operation Region:操作域,表示一个可以访问的地址空间,如IO、Memory、PCI等
Package:包含多个ASL对象的集合,最大包含255个对象。
Power Resource:能源对象或电源对象,如设备在D0/D3状态下不同的电源声类型明
Processor:处理器对象
RawDataBuffer:原始数据对象。仅包含纯数据,不会被编译器解析成AML字节码
String:Null结尾的ASCII字符串
Thermal Zone:热空间对象。_TZD通常会包含一个或多个温度传感器、风扇等

固件C字营·版权所有
敬请关注微信公众号:“固件C字营”

=====================================================================
本文介绍了ACPI/ASL编程中的字符集、注释、数字、常量以及算子的使用规则。详细讲解了ASL中的命名规范,包括对象的命名、路径分隔符和大小写不敏感特性。此外,还概述了ACPI/ASL的预定义对象类型,如Buffer、Field Unit、Integer、Method和Mutex等,并强调了不同类型之间的转换和交互。

被折叠的 条评论
为什么被折叠?



