Google 致力于为黑人社区推动种族平等。查看具体行动

设置构建环境

使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。

在 GitHub 上查看源代码

为了促进免费和开放式开发,OpenThread 在构建工具链中使用 CMake。目前,如需将 OpenThread 移植到新的硬件平台,必须使用此工具链。

将来可能支持其他构建工具链,但它们不在本移植指南的讨论范围内。

创建新代码库

第一步是为您的硬件平台设置一个新的家。在本指南中,我们将创建一个名为 ot-efr32 的新代码库,其中包含平台抽象层、硬件平台 SDK 和一些实用脚本。

在此示例中,我们在 GitHub 上创建了 SiliconLabs/ot-efr32 代码库,并将其克隆到 ~/repos/ot-efr32

mkdir -p ~/repos
cd ~/repos
git clone git@github.com:SiliconLabs/ot-efr32.git
Cloning into 'ot-efr32'...
remote: Enumerating objects: 99, done.
remote: Counting objects: 100% (99/99), done.
remote: Compressing objects: 100% (60/60), done.
remote: Total 333 (delta 65), reused 39 (delta 39), pack-reused 234
Receiving objects: 100% (333/333), 170.78 KiB | 5.69 MiB/s, done.
Resolving deltas: 100% (194/194), done.
git status
On branch main
Your branch is up to date with 'origin/main'.

nothing to commit, working tree clean

代码库结构

为了帮助与 OpenThread GitHub 组织中的现有平台代码库保持一致,您可能需要按照以下方式构建代码库:

tree -F -L 1 --dirsfirst
.
├── examples/
├── openthread/
├── script/
├── src/
├── third_party/
├── CMakeLists.txt
├── LICENSE
└── README.md
文件夹 说明
examples 可选 示例应用
openthread openthread 代码库作为子模块
script 用于构建、测试、执行 lint 请求的脚本
src 平台抽象层实现
third_party 所有第三方来源的位置

添加子模块

下一步是将 openthread 和任何其他必需的代码库添加为子模块

git submodule add git@github.com:openthread/openthread.git
Cloning into '/home/user/repos/ot-efr32/openthread'...
remote: Enumerating objects: 78281, done.
remote: Counting objects: 100% (1056/1056), done.
remote: Compressing objects: 100% (488/488), done.
remote: Total 78281 (delta 639), reused 864 (delta 556), pack-reused 77225
Receiving objects: 100% (78281/78281), 76.62 MiB | 35.24 MiB/s, done.
Resolving deltas: 100% (61292/61292), done.

在此例中,我们将在 third_party 中添加 Silicon Labs Gecko SDK 的精简版作为子模块。

cd third_party
git submodule add git@github.com:SiliconLabs/sdk_support.git
Cloning into '/home/user/repos/ot-efr32/third_party/sdk_support'...
remote: Enumerating objects: 32867, done.
remote: Counting objects: 100% (8181/8181), done.
remote: Compressing objects: 100% (3098/3098), done.
remote: Total 32867 (delta 4945), reused 7469 (delta 4732), pack-reused 24686
Receiving objects: 100% (32867/32867), 128.83 MiB | 30.91 MiB/s, done.
Resolving deltas: 100% (19797/19797), done.

脚本

为了更轻松地执行常规任务,您可能需要在 script 文件夹中创建一些脚本。这可能包括用于引导、构建、运行 linter 任务的脚本,以及用于 GitHub CI 检查的测试脚本。

以下是大多数现有平台代码库的标准脚本示例。

bootstrap

此脚本应安装您的硬件平台所需的所有工具和软件包。它还应执行 openthread 的引导脚本,以确保用户具备构建 OpenThread 堆栈所需的一切。

如需查看示例,请参阅 ot-efr32 中的引导加载程序脚本

build

CMake 构建脚本应允许用户为您的平台构建 OpenThread 堆栈。如果您的代码库定义了任何示例应用,此脚本也应构建这些应用。此脚本应包含基本的系统配置选项,包括所有平台特定的宏定义。

如需查看示例,请参阅 ot-efr32 中的构建脚本

test

测试脚本可能对用户来说非常有用,它们可以使用您定义的任何测试来测试更改。它可以是运行健全性检查 build 这样简单,也可以是启动单元测试之类的复杂操作。

ot-efr32 中,该脚本只是在每个 efr32 平台上为每个受支持的开发板执行 build 脚本。

如需查看示例,请参阅 ot-efr32 中的测试脚本

make-pretty

为了保持样式一致,此脚本应设置代码、脚本和 Markdown 文件的格式。

您可以自行定义此脚本,但最简单的做法可能是使用现有平台代码库正在使用的 make-pretty 脚本。该脚本会调用 openthread 的样式脚本,并帮助确保所有 OpenThread 代码库的样式保持一致。

链接器脚本配置

GNU 链接器脚本描述了如何将输入文件(.o 的 GCC 编译器集合 (GCC) 生成的文件)中的所有部分映射到最终输出文件(例如 .elf)。它还会确定可执行程序的每个分段的存储位置以及条目地址。平台专用链接器脚本通常与平台的 BSP 一起提供。

src/CMakeLists.txt 中的平台 CMake 目标上,使用 target_link_librariesld 工具配置为指向平台特定的链接器脚本:

set(LD_FILE "${CMAKE_CURRENT_SOURCE_DIR}/efr32mg12.ld")

target_link_libraries(openthread-efr32mg12
    PRIVATE
        ot-config
    PUBLIC
        -T${LD_FILE}
        -Wl,--gc-sections -Wl,-Map=$.map
)

工具链启动代码

工具链启动代码通常与平台的 BSP 一起提供。此代码通常:

  1. 实现可执行程序的输入函数 (Reset_Handler)
  2. 定义中断矢量表
  3. 初始化堆和堆栈
  4. .data 部分从非易失性内存复制到 RAM
  5. 跳转到应用主函数以执行应用逻辑

启动代码(C 或汇编源代码)必须包含在平台的 openthread-platform-name 库中,否则链接器脚本中使用的某些关键变量无法正确引用:

  • src/CMakeLists.txt

示例startup-gcc.c位于 ot-cc2538 - src/CMakeLists.txt

add_library(openthread-cc2538
    alarm.c
...
    startup-gcc.c
...
    system.c
    logging.c
    uart.c
    $
)