YAML语法规则
Zephyr和Linux生态中的YAML文件在基础语法上完全一致,都遵循YAML通用规则,如缩进表示层级、键值对格式等。核心差异在于语义和应用场景:Zephyr的YAML主要用于嵌入式开发(如测试用例、硬件配置),字段定义围绕Zephyr工具链;而Linux生态的YAML应用更广泛(如容器编排、CI/CD),内容取决于具体工具(如Docker、Kubernetes)。两者语法相同但字段含义和解析工
Zephyr 中的 YAML 文件与 Linux 生态中的 YAML 文件,在基础语法上完全一致(因为 YAML 是一种通用的数据序列化格式,语法规则是统一的),但两者的核心差异在于 “语义定义” 和 “应用场景”—— 即不同项目会根据自身需求,在 YAML 中定义不同的字段、结构和功能,以适配各自的工具链和业务逻辑。
一、先明确:YAML 语法本身是通用的
无论是 Zephyr、Linux 还是其他项目,使用的 YAML 都遵循通用语法规则,例如:
- 用缩进表示层级关系(通常 2 或 4 个空格,不允许用制表符);
- 用
key: value表示键值对; - 用
-表示列表项; - 用
#表示注释; - 支持字符串、数字、布尔值等基础类型,以及嵌套结构(列表、字典)。
因此,语法层面(如格式、缩进、数据类型)没有区别,学会 YAML 基础语法后,在任何场景下都通用。
二、核心差异:语义与应用场景
差异主要体现在 “YAML 文件承载的信息含义” 和 “被哪些工具解析” 上,具体如下:
1. 用途与场景不同
Zephyr 中的 YAML 文件:
主要服务于嵌入式系统开发的项目管理、测试框架、硬件配置等场景,例如:
testcase.yaml:定义测试用例的元数据(名称、依赖、平台支持等),供 Zephyr 测试工具twister解析;board.yaml:描述开发板的硬件信息(如支持的功能、默认配置),用于 Zephyr 构建系统识别硬件;west.yml:管理 Zephyr 项目的代码仓库(远程仓库地址、分支),供west(Zephyr 官方构建工具)使用。
这些 YAML 文件的核心是 “为 Zephyr 特定工具提供结构化配置”,内容高度依赖 Zephyr 的开发流程和工具链。
Linux 生态中的 YAML 文件:
应用场景更广泛,覆盖系统配置、容器编排、CI/CD、软件包管理等,例如:
docker-compose.yml:定义 Docker 容器的服务、网络、卷等配置,供docker-compose工具解析;GitHub Actions配置文件(.github/workflows/*.yml):定义 CI/CD 流程(构建、测试、部署步骤),供 GitHub 服务器解析;systemd相关 YAML:部分 Linux 发行版用 YAML 配置系统服务(如systemd-networkd的网络配置);- Kubernetes 资源配置(如
pod.yaml、deployment.yaml):定义容器集群的资源对象(API 版本、类型、规格),供 K8s 集群解析。
这些 YAML 文件的核心是 “为 Linux 生态中的各类工具(容器、CI/CD、服务管理等)提供配置”,内容依赖具体工具的规则。
2. 定义的字段与语义不同
由于用途不同,两者在 YAML 中定义的 “字段” 和 “语义” 完全不同(即使字段名相同,含义也可能不同):
| 示例场景 | Zephyr 中的 YAML 字段(以 testcase.yaml 为例) |
Linux 生态中的 YAML 字段(以 docker-compose.yml 为例) |
|---|---|---|
| 核心字段 | test-name、depends_on、platforms、kconfig |
services、image、ports、volumes、networks |
| 字段含义 | depends_on: uart 表示测试依赖 UART 驱动 |
depends_on: db 表示服务依赖 db 容器启动 |
| 结构目的 | 描述测试用例的执行条件和元数据 | 描述容器服务的构建、运行参数和依赖关系 |
3. 依赖的工具链不同
- Zephyr 的 YAML 文件由 Zephyr 专属工具解析,例如:
testcase.yaml→ 由twister(Zephyr 测试工具)解析,用于自动化测试;west.yml→ 由west(Zephyr 项目管理工具)解析,用于拉取代码、构建项目。
- Linux 生态的 YAML 文件由各自领域的工具解析,例如:
docker-compose.yml→ 由docker-compose解析,用于管理容器生命周期;- Kubernetes YAML → 由
kubectl解析,用于与 K8s 集群交互; - CI/CD 配置 → 由 GitLab CI、GitHub Actions 等平台的解析器处理。
4. 复杂度与扩展性不同
- Zephyr 的 YAML 文件通常结构较简单,字段数量有限(聚焦嵌入式场景的特定需求),例如
testcase.yaml主要围绕测试依赖、平台、超时等核心参数,扩展性较低(字段由 Zephyr 框架固定)。 - Linux 生态的 YAML 文件复杂度差异极大:
- 简单场景(如
docker-compose基础配置)结构清晰; - 复杂场景(如 Kubernetes 的
CustomResourceDefinition)可能包含嵌套多层的结构、条件判断、引用等,扩展性极强(支持用户自定义资源类型和字段)。
- 简单场景(如
三、总结
Zephyr 中的 YAML 文件与 Linux 中的 YAML 文件,基础语法完全一致(共享 YAML 通用规则),但差异体现在:
- 用途不同:Zephyr 聚焦嵌入式开发的测试、硬件配置等;Linux 覆盖容器、CI/CD、系统管理等更广泛场景;
- 语义不同:字段定义和含义由各自项目的工具链决定(如 Zephyr 的
depends_on与 Linux 容器的depends_on含义无关); - 工具链不同:解析工具和处理逻辑完全独立。
学习时,需先掌握 YAML 通用语法,再针对具体场景(Zephyr 或 Linux 某工具)学习其定义的字段和语义即可。
YAML基本语法学习
学习链接:YAML 入门教程-菜鸟教程
很多东西不是看一遍就会的,比如:大小写敏感,缩进表示层级但是缩进只能用空格不允许使用制表符,缩进空格数不重要但同一级别必须左对齐,冒号后要加一个空格,等等,需要不断练习。
四、zephyr中的一段yaml代码举例
下面是zephyr 工程tests/drivers/uart/uart_async_api/testcase.yaml中一段内容,结合Test Runner-Zephyr官网来解读该文件。
common: # 所有测试用例共享的基础配置
platform_exclude: # 排除不支持该测试的平台(开发板)
- stamp_c3
- wio_terminal
- xiao_esp32c3
tags: # 给测试打标签(drivers 表示属于驱动测试,uart 表示针对 UART 功能)。后续可通过 twister 工具按标签筛选测试(如 twister --tag uart 只执行 UART 相关测试)。
- drivers
- uart
tests: # 具体测试用例的配置
drivers.uart.async_api.lpuart: # 根据测试套件的实现,其测试用例标识符由至少三个部分组成,并用一个点进行分隔
filter: CONFIG_SERIAL_SUPPORT_ASYNC and CONFIG_UART_MCUX_LPUART and not CONFIG_CPU_HAS_DCACHE # 测试执行的条件过滤(仅当条件为真时才运行)
harness: ztest #不理解什么叫:指定测试框架为 Zephyr 内置的 ztest ??????
depends_on: dma # 当前case在测试平台下依赖哪些功能,如果这个平台上没有这些功能则会测试失败
drivers.uart.async_api.lpuart.rt_nocache:
filter: CONFIG_SERIAL_SUPPORT_ASYNC and CONFIG_UART_MCUX_LPUART and CONFIG_CPU_HAS_DCACHE
harness: ztest
depends_on: dma
extra_configs: # 为该测试单独添加的 Kconfig 配置(会覆盖工程默认的 prj.conf)
- CONFIG_DCACHE=y
- CONFIG_NOCACHE_MEMORY=y
- CONFIG_USERSPACE=n
更多推荐



所有评论(0)