本文简单介绍Zephyr的工作空间拓扑结构,并详细说明单一应用West提货单使用方法。
简洁清晰的代码结构有利于项目代码的管理,Zephyr的West工具对多仓库代码文件提供了多种拓扑结构管理方式。West对多仓库的管理基本概念可以参考Zephyr-west简介中”提货单简介”章节,本文主要讨论单一应用的提货单使用方法。
Zephyr代码工作空间的拓扑结构
West支持的代码拓扑结构有三种
- T1: 星型结构,manifest 在zephyr中
- T2: 星型结构,manifest 在app中, 适用于单独应用管理
- T3: 树型结构,专门的manifest目录, 适用于多应用管理
T1
zephyr仓库作为中央存储库,并在它的west.yml 中指定其模块(外部项目), app可以放到任意目录。这种形式在不修改west.yml的情况下会下载所有的外部module,适合于Zephyr本身的开发。
类似于以Zephyr为主项目,其它为git子模块,这是Zephyr Getting Started示例使用的目录结构,这里就不再举例说明
T2
应用程序的仓库充当中央存储库,并在它的west.yml中指定要使用的模块(zephyr和其它外部项目)。该方式适合于单个独立的Zephyr应用的开发。
类似于以Zephyr应用为主项目,其它(包括zephyr)为git子模块,后文会详细说明该方式的使用,这里不做举例。
T3
不包含 Zephyr 源代码的专用”提货单”存储库,指定所有处于同一“级别”的项目列表,适合于多个相互独立的Zephyr应用开发。
类似于google的repo管理,示例如下
工作空间的代码结构1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21west-workspace/
├── app1/ # .git/ project
│ ├── CMakeLists.txt
│ ├── prj.conf
│ └── src/
│ └── main.c
├── app2/ # .git/ project
│ ├── CMakeLists.txt
│ ├── prj.conf
│ └── src/
│ └── main.c
├── manifest-repo/ # .git/ never modified by west
│ └── west.yml # main manifest with optional import(s) and override(s)
├── modules/
│ └── lib/
│ └── tinycbor/ # .git/ project from either the main manifest or
│ # from some import
│
└── zephyr/ # .git/ project
└── west.yml # This can be partially imported with lower precedence or ignored.
# Only the 'manifest-rev' version can be imported.
对应的提货单应该放在manifest-repo/west.yml1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19manifest:
remotes:
- name: zephyrproject-rtos
url-base: https://github.com/zephyrproject-rtos
- name: your-git-server
url-base: https://git.example.com/your-company
defaults:
remote: your-git-server
projects:
- name: zephyr
remote: zephyrproject-rtos
revision: v2.5.0
import: true
- name: app1
revision: SOME_SHA_OR_BRANCH_OR_TAG
- name: app2
revision: ANOTHER_SHA_OR_BRANCH_OR_TAG
self:
path: manifest-repo
单一应用West提货单
我的个人项目只有单应用,因此采用T1或者T2结构都可以。我希望应用仓库里面只有单纯和应用相关的代码,同时又能够通过应用仓库拿到Zephyr代码和必要的外部项目代码,这一点T2就非常合适了。
应用仓库的代码拓扑结构如下1
2
3
4
5
6
7
8
9app
├── CMakeLists.txt
├── boards
├── drivers
├── dts
├── prj.conf
├── scripts
├── src
└── west.yml
west.yaml内容如下1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18manifest:
remotes:
- name: zephyrproject-rtos
url-base: https://github.com/zephyrproject-rtos
projects:
- name: zephyr
remote: zephyrproject-rtos
revision: zephyr-v2.6.0
clone-depth: 1
import:
name-allowlist:
- cmsis
- hal_nxp
- hal_espressif
- fatfs
- lvgl
self:
west-commands: scripts/west-commands.yml
执行下面命令west init -l app/
就会按照west.yaml指定的内容下载zephyr和zephyr外部项目的代码,该west.yaml要下载的内容:
- Zephyr的源代码:指定下载v2.6.0 tag的
- cmsis: 使用cortex-m7,需要cmsis
- hal_nxp: 应用会跑到rt1052上因此需要nxp hal
- hal_espressif: 应用会跑到esp32上因此需要espressif hal
- fatfs:应用使用了文件系统
- lvgl:应用使用了gui
除以上内容外,不会再下载其它内容,这样大大缩减了T1模式下载代码的时间和占用的空间1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18.
├── LICENSE
├── README.en.md
├── README.md
├── app
│ ├── CMakeLists.txt
│ ├── boards
│ ├── drivers
│ ├── dts
│ ├── prj.conf
│ ├── scripts
│ ├── src
│ └── west.yml
├── modules
│ ├── fs
│ ├── hal
│ └── lib
└── zephyr
参考
https://docs.zephyrproject.org/latest/guides/west/workspaces.html#topologies-supported