Zephyr应用的代码结构--West提货单

Creative Commons
本作品采用知识共享署名

本文简单介绍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
21
west-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.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
manifest:
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
9
app
├── 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
18
manifest:
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