Thiết lập môi trường tạo bản dựng

Xem mã nguồn trên GitHub

Để thúc đẩy hoạt động phát triển tự do và mở, OpenThread sử dụng CMake trong chuỗi công cụ xây dựng. Hiện tại, bạn cần có chuỗi công cụ này để chuyển OpenThread sang một nền tảng phần cứng mới.

Các chuỗi công cụ xây dựng khác có thể được hỗ trợ trong tương lai, nhưng không thuộc phạm vi của hướng dẫn chuyển đổi này.

Tạo kho lưu trữ mới

Bước đầu tiên là thiết lập một trang chủ 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 ot-efr32. Kho lưu trữ này chứa lớp trừu tượng 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à sao chép kho lưu trữ đó vào ~/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

Cấu trúc kho lưu trữ

Để giúp duy trì tính nhất quán với các kho lưu trữ nền tảng hiện có trong tổ chức GitHub OpenThread, bạn nên thiết lậ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ưới dạng mô-đun con
script Tập lệnh để tạo, kiểm thử, tìm lỗi mã nguồn
src Triển khai lớp trừu tượng nền tảng
third_party Vị trí cho 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 dưới dạng 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 phiên bản rút gọn của SDK Gecko của Silicon Labs làm mô-đun con trong third_party.

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.

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. Tệp này có thể bao gồm các tập lệnh cho các tác vụ như khởi động, tạo, chạy trình tìm lỗi mã và tập lệnh kiểm thử cho các bước kiểm tra CI trên GitHub.

Dưới đây là một số ví dụ về tập lệnh 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. Trình khởi động cũng sẽ thực thi tập lệnh khởi động của openthread để đảm bảo rằng người dùng có mọi thứ cần thiết để tạo ngăn xếp OpenThread.

Hãy xem tập lệnh 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 tạo 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, 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 mọi định nghĩa macro dành riêng cho nền tảng.

Hãy xem tập lệnh bản dựng trong ot-efr32 để biết ví dụ.

test

Kịch bản kiểm thử có thể hữu ích cho người dùng để kiểm thử các thay đổi bằng bất kỳ chương trình kiểm thử nào mà 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ư 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 bo mạch được hỗ trợ trên mỗi nền tảng efr32.

Hãy xem tập lệnh kiểm thử trong ot-efr32 để biết ví dụ.

make-pretty

Để duy trì 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 tập lệnh kiểu của openthread và giúp đảm bảo kiểu nhất quán trên tất 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 "đối tượng" .o do GNU Compiler Collection (GCC) tạo) với tệp đầu ra cuối cùng (ví dụ: .elf). Tập lệnh này cũng xác định vị trí lưu trữ của mỗi phân đoạn trong một chương trình có thể thực thi, cũng như địa chỉ truy cập. Tập lệnh trình liên kết dành riêng cho nền tảng thường được cung cấp cùng với 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 BSP của nền tảng. Mã này thường:

  1. Triển khai hàm nhập (Reset_Handler) của chương trình thực thi
  2. Xác định bảng vectơ ngắt
  3. Khởi tạo vùng nhớ khối xếp và ngăn xếp
  4. Sao chép phần .data từ bộ nhớ không bay hơi sang RAM
  5. Chuyển đến hàm chính của ứng dụng để thực thi logic của ứng dụng

Mã khởi động (mã nguồn C hoặc mã nguồn tập hợp) phải có trong thư viện openthread-platform-name của nền tảng, nếu không, một số biến chính dùng trong tập lệnh trình liên kết sẽ không được trích dẫn chính xác:

  • src/CMakeLists.txt

Ví dụ: startup-gcc.c trong ot-cc2538src/CMakeLists.txt

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