設定建構環境

前往 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 用於建構、測試、程式碼檢查的指令碼
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 資料夾中建立一些指令碼,以簡化常見的工作方式。這些指令碼可能包括啟動指令碼、建構、執行程式碼程式碼工具等工作,以及 GitHub CI 檢查的測試指令碼。

以下列舉一些大部分現有平台存放區都適用的指令碼範例。

bootstrap

這個指令碼應安裝硬體平台所需的所有工具和套件。此外,此程式碼也應執行 openthread 的啟動指令碼,以確保使用者擁有建構 OpenThread 堆疊所需的一切。

如需範例,請參閱 ot-efr32 中的 Bootstrap 指令碼

build

CMake 建構指令碼應該讓使用者能為您的平台建構 OpenThread 堆疊。如果您的存放區定義了任何範例應用程式,則這個指令碼也應該加以建構。這個指令碼應包含基本系統設定選項,包括任何平台專用的巨集定義。

如需範例,請參閱 ot-efr32 中的建構指令碼

test

測試指令碼對於使用者使用您定義之任何測試來說可能很有幫助。這可以簡單地執行彈性檢查版本,也可以和啟動單元測試套件一樣複雜。

ot-efr32 中,指令碼會針對 efr32 平台上每個支援的板執行執行 build 指令碼。

如需範例,請參閱 ot-efr32 中的 測試指令碼

make-pretty

為維持一致的樣式,這個指令碼應設定程式碼、指令碼和 Markdown 檔案的格式。

您可以自行定義這個指令碼,但最簡單的方法可能是使用現有平台存放區使用的 make-pretty 指令碼。這個指令碼會呼叫 openthread 的樣式指令碼,藉此確保所有 OpenThread 存放區的樣式保持一致。

連接器指令碼設定

GNU Linker 指令碼會說明如何將輸入檔案 (GGU Compiler Collection (GCC) 產生的 .o「物件」檔案) 中的所有區段對應至最終輸出檔案 (例如 .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

示例ot-cc2538 中的 startup-gcc.c - src/CMakeLists.txt

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