<ph type="x-smartling-placeholder"></ph>
在 GitHub 上查看源代码
为了促进自由、开放的开发,OpenThread 在 Google Cloud 中使用 CMake, 构建工具链。目前,若要移植 将 OpenThread 迁移到新的硬件平台。
将来可能会支持其他构建工具链,但它们不在 本携号转网指南的范围
创建新代码库
第一步是为硬件平台创建一个新家。在本指南中,我们将创建一个名为 ot-efr32 的新代码库,其中包含平台抽象层、硬件平台的 SDK 和一些有用的脚本。
在此示例中,我们在 GitHub 上创建了 SiliconLabs/ot-efr32 代码库,并将其克隆到 ~/repos/ot-efr32。
mkdir -p ~/reposcd ~/reposgit clone git@github.com:SiliconLabs/ot-efr32.gitCloning 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 statusOn 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_partygit submodule add git@github.com:SiliconLabs/sdk_support.gitCloning 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 文件夹中创建一些脚本。这可能包括用于引导、构建和运行 code-linter 等任务的脚本,以及用于 GitHub CI 检查的测试脚本。
以下是一些脚本示例,它们是大多数现有平台代码库的标准脚本。
bootstrap
此脚本应安装硬件平台所需的所有工具和软件包。它还应执行 openthread 的引导脚本,以确保用户拥有构建 OpenThread 堆栈所需的一切。
build
CMake 构建脚本应允许用户为您的平台构建 OpenThread 堆栈。如果您的代码库定义了任何示例应用,此脚本也应构建这些应用。该脚本应包含基本的系统配置选项,其中包括所有针对具体平台的宏定义。
test
如果用户使用您定义的任何测试来测试变更,测试脚本可能会很有用。这个流程可以很简单,比如运行健全性检查 build,也可能很复杂,比如启动一个单元测试套件。
在 ot-efr32 中,脚本只会针对每个 efr32 平台上的每个受支持的开发板执行 build 脚本。
make-pretty
为了保持一致的样式设置,此脚本应为代码、脚本和 Markdown 文件设置格式。
您可以自行定义此脚本,但使用现有平台代码库使用的 make-pretty 脚本可能是最简单的方法。此脚本会调用 openthread 的样式脚本,并确保样式在所有 OpenThread 代码库中保持一致。
链接器脚本配置
GNU Linker 脚本
描述了如何映射输入文件(.o 个“对象”文件)中的所有部分,
将由 GNU 编译器集合 (GCC) 生成的输出传递给最终输出文件(
示例 .elf)。它还决定了
可执行程序和条目地址。针对具体平台的链接器
脚本通常会随平台的 BSP 一起提供。
将 ld 工具配置为使用
src/CMakeLists.txt 中您的平台 CMake 目标上的 target_link_libraries:
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 一起提供。这个 代码通常:
- 实现可执行程序的输入函数 (
Reset_Handler) - 定义中断矢量表
- 初始化堆和堆栈
- 将
.data部分从非易失性内存复制到 RAM - 跳转到应用主函数以执行应用逻辑
启动代码(C 或汇编源代码)必须包含在平台的
openthread-platform-name 库,否则链接器中使用了一些关键变量
脚本无法正确引用:
src/CMakeLists.txt
示例:ot-cc2538 中的 startup-gcc.c - src/CMakeLists.txt
add_library(openthread-cc2538
alarm.c
...
startup-gcc.c
...
system.c
logging.c
uart.c
$
)