Để thúc đẩy quá trình phát triển tự do và mở, OpenThread sử dụng CMake trong chuỗi công cụ bản dựng. Hiện tại, bạn cần có chuỗi công cụ này để chuyển đổi OpenThread đến một nền tảng phần cứng mới.
Các chuỗi công cụ bản dựng khác có thể được hỗ trợ trong tương lai, nhưng chúng sẽ không được hỗ trợ trong tương lai phạm vi của hướng dẫn chuyển này.
Tạo kho lưu trữ mới
Bước đầu tiên là thiết lập một ngôi nhà mới cho nền tảng phần cứng của bạn. Trong hướng dẫn này, chúng ta sẽ tạo một kho lưu trữ mới có tên là ot-efr32. Kho lưu trữ này chứa tầng trừu tượng của nền tảng, SDK của nền tảng phần cứng và một số tập lệnh hữu ích.
Trong ví dụ này, chúng ta đã tạo kho lưu trữ SiliconLabs/ot-efr32 trên GitHub và nhân bản kho lưu trữ đó vào ~/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
Cấu trúc kho lưu trữ
Để duy trì tính nhất quán với các kho lưu trữ hiện có trên nền tảng trong tổ chức OpenThread GitHub, bạn nên sắp xếp cấu trúc kho lưu trữ như sau:
tree -F -L 1 --dirsfirst
.
├── examples/
├── openthread/
├── script/
├── src/
├── third_party/
├── CMakeLists.txt
├── LICENSE
└── README.md
| Thư mục | Mô tả |
|---|---|
examples |
không bắt buộc Ứng dụng mẫu |
openthread |
Kho lưu trữ openthread ở dạng mô-đun con |
script |
Các tập lệnh để xây dựng, kiểm thử, tìm lỗi mã nguồn |
src |
Triển khai lớp trừu tượng của nền tảng |
third_party |
Vị trí của mọi nguồn của bên thứ ba |
Thêm mô-đun con
Bước tiếp theo là thêm openthread và mọi kho lưu trữ bắt buộc khác làm mô-đun con
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.
Trong ví dụ này, chúng ta sẽ thêm một phiên bản thu gọn của SDK Silicon Labs Gecko làm một mô-đun con trong third_party.
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.
Tập lệnh
Để thực hiện các thao tác phổ biến dễ dàng hơn, bạn nên tạo một số tập lệnh trong thư mục script. Trong đó có thể bao gồm các tập lệnh cho các tác vụ như tự khởi động, xây dựng, chạy trình kiểm thử mã và tập lệnh kiểm thử để kiểm tra CI trên GitHub.
Dưới đây là một số ví dụ về tập lệnh là tiêu chuẩn cho hầu hết các kho lưu trữ nền tảng hiện có.
bootstrap
Tập lệnh này sẽ cài đặt tất cả các công cụ và gói mà nền tảng phần cứng của bạn yêu cầu. Mã này cũng sẽ thực thi tập lệnh tự khởi động của openthread nhằm đảm bảo rằng người dùng có mọi thứ cần thiết để xây dựng ngăn xếp OpenThread.
Hãy xem tập lệnh Tự khởi động trong ot-efr32 để biết ví dụ.
build
Tập lệnh bản dựng CMake sẽ cho phép người dùng xây dựng ngăn xếp OpenThread cho nền tảng của bạn. Nếu kho lưu trữ của bạn xác định bất kỳ ứng dụng mẫu nào, thì tập lệnh này cũng sẽ tạo các ứng dụng đó. Tập lệnh này phải chứa các tuỳ chọn cấu hình hệ thống cơ bản, bao gồm cả mọi định nghĩa macro dành riêng cho nền tảng.
Xem tập lệnh bản dựng trong ot-efr32 để biết ví dụ.
test
Tập lệnh kiểm thử có thể hữu ích cho người dùng trong việc kiểm thử các thay đổi bằng cách sử dụng bất kỳ kiểm thử nào bạn đã xác định. Điều này có thể đơn giản như chạy các bản dựng kiểm tra tính hợp lý hoặc phức tạp như khởi chạy một bộ kiểm thử đơn vị.
Trong ot-efr32, tập lệnh chỉ thực thi tập lệnh build cho mọi bảng được hỗ trợ trên mỗi nền tảng efr32.
Xem tập lệnh kiểm thử trong ot-efr32 để biết ví dụ.
make-pretty
Để duy trì định kiểu nhất quán, tập lệnh này phải định dạng mã, tập lệnh và tệp Markdown.
Bạn có thể tự xác định tập lệnh này, nhưng cách dễ nhất là sử dụng tập lệnh make-pretty mà các kho lưu trữ nền tảng hiện có đang sử dụng. Tập lệnh này gọi vào các tập lệnh định kiểu của openthread và giúp đảm bảo kiểu nhất quán trên tất cả các kho lưu trữ OpenThread.
Cấu hình tập lệnh trình liên kết
Tập lệnh GNU Linker
mô tả cách liên kết tất cả các phần trong tệp đầu vào (tệp .o "đối tượng"
do GNU Compiler Collection (GCC) tạo vào tệp đầu ra cuối cùng (đối với
ví dụ: .elf). Thuộc tính này cũng xác định vị trí lưu trữ của từng phân đoạn của
chương trình thực thi cũng như địa chỉ mục nhập. Trình liên kết dành riêng cho nền tảng
tập lệnh thường được cung cấp cùng với nhịp độ cài đặt (BSP) của nền tảng.
Định cấu hình công cụ ld để trỏ đến tập lệnh trình liên kết dành riêng cho nền tảng bằng cách sử dụng
target_link_libraries trên mục tiêu CMake của nền tảng trong src/CMakeLists.txt:
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
)
Mã khởi động chuỗi công cụ
Mã khởi động chuỗi công cụ thường được cung cấp cùng với {/9} của nền tảng. Chiến dịch này mã thường:
- Triển khai hàm nhập (
Reset_Handler) của chương trình thực thi - Xác định bảng vectơ gián đoạn
- Khởi chạy Vùng nhớ khối xếp và Ngăn xếp
- Sao chép phần
.datatừ bộ nhớ bất biến vào RAM - Chuyển đến hàm chính của ứng dụng để thực thi logic ứng dụng
Mã khởi động (mã nguồn C hoặc mã nguồn tập hợp) phải có trong mã khởi động của nền tảng
thư viện openthread-platform-name, nếu không thì một số biến chính dùng trong trình liên kết
tập lệnh không thể được trích dẫn chính xác:
src/CMakeLists.txt
Ví dụ: startup-gcc.c trong ot-cc2538 – src/CMakeLists.txt
add_library(openthread-cc2538
alarm.c
...
startup-gcc.c
...
system.c
logging.c
uart.c
$
)