為了促進自由開放的開發作業,OpenThread 將 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 |
用於建構、測試及程式碼檢查的指令碼 |
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 資料夾中建立一些指令碼。可能包括啟動、建構和執行程式碼 Linter 等工作的指令碼,以及 GitHub CI 檢查的測試指令碼。
以下列舉幾個現有平台存放區的標準指令碼範例。
bootstrap
這個指令碼應安裝硬體平台所需的所有工具和套件。它也應執行 openthread 的 Bootstrap 指令碼,確保使用者俱備建構 OpenThread 堆疊所需的一切資源。
如需範例,請參閱 ot-efr32 中的 Bootstrap 指令碼。
build
CMake 建構指令碼應允許使用者為您的平台建構 OpenThread 堆疊。如果您的存放區定義了任何範例應用程式,也應使用這個指令碼建構這些應用程式。這段指令碼應包含基本系統設定選項,包括任何平台專屬的巨集定義。
test
使用者如果想利用您定義的任何測試來測試變更,測試指令碼可能會有幫助。這類作業可以單純執行,例如執行例行性檢查版本,或是啟動單元測試套件一樣複雜。
在 ot-efr32 中,指令碼只會為每個 efr32 平台的每個支援開發板執行 build 指令碼。
make-pretty
為維持樣式一致的樣式,這個指令碼應設定程式碼、指令碼和 Markdown 檔案的格式。
您可以自行定義這個指令碼,不過最簡單的方式就是使用現有平台存放區所用的 make-pretty 指令碼。指令碼會呼叫 openthread 的樣式指令碼,有助於確保所有 OpenThread 存放區中的樣式一致。
連接器指令碼設定
GNU Linker 指令碼
說明如何對應輸入檔案 (.o「物件」檔案) 中的所有區段
GNU 編譯器集合 (GCC) 產生的檔案,到最後的輸出檔案 (
例如:.elf)。這也決定了 Pod 中各區段的儲存位置
可執行程式,以及項目位址平台專屬連接器
平台的 BSP 通常會提供指令碼。
使用以下程式碼設定 ld 工具,使其指向特定平台的連結器指令碼
平台 CMake 目標在 src/CMakeLists.txt 中的 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
$
)