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

Xem nguồn trên GitHub

Để quảng bá hoạt động phát triển mở và miễn phí, OpenThread sử dụng CMake trong chuỗi công cụ tạo bản dựng. Hiện tại, chuỗi công cụ này là cần thiết để chuyển OpenThread sang một nền tảng phần cứng mới.

Các chuỗi công cụ tạo bản dựng khác có thể được hỗ trợ trong tương lai, nhưng các chuỗi này không nằm trong 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 nhà mới cho nền tảng phần cứng. 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 có lớp trừu tượng của nền tảng, SDK của nền tảng phần cứng và một vài tập lệnh hữu ích.

Trong ví dụ này, chúng tôi đã 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ữ

Để 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 OpenThread GitHub, bạn nên định cấu trúc kho lưu trữ của mình 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 làm mô-đun phụ
script 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í cho bất kỳ nguồn nào 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 phụ

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 tôi sẽ thêm phiên bản thu gọn của SDK Silicon Labs Gecko làm mô-đun phụ 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 tác vụ 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. Đối tượng này có thể bao gồm các tập lệnh cho các nhiệm vụ như khởi động, xây dựng, chạy liên kết mã và một tập lệnh kiểm thử cho các kiểm tra CI GitHub.

Dưới đây là một số ví dụ về tập lệnh chuẩn đối với hầu hết các kho lưu trữ nền tảng hiện có.

bootstrap

Tập lệnh này phải 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. Tệp này 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.

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 phải 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 phải tạo các ứng dụng đó. Tập lệnh này phải chứa các tùy 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

Tập lệnh kiểm thử có thể hữu ích cho người dùng 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. Quá trình này có thể đơn giản như chạy các bản dựng kiểm tra độ hợp lý hoặc phức tạp như việc phát hành 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 từng 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 đánh dấu.

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 đang sử dụng. Tập lệnh 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 Trình liên kết GNU mô tả cách ánh xạ tất cả các phần trong các tệp đầu vào (các tệp "đối tượng" .o do GNU Compiler Collection (GCC) tạo ra) đến tệp đầu ra cuối cùng (ví dụ: .elf). Nó cũng xác định vị trí lưu trữ của từng phân đoạn của một chương trình thực thi, cũng như địa chỉ nhậ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 với Bệ 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 EMM 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 chạy Heap và Stack
  4. Sao chép phần .data từ bộ nhớ không biến động sang RAM
  5. Chuyển đến hàm chính của ứng dụng để thực thi logic ứng dụng

Bạn phải đưa mã khởi động (C hoặc mã nguồn tập hợp) vào thư viện openthread-platform-name của nền tảng, nếu không, một số biến chính được sử dụng trong tập lệnh trình liên kết không thể đượ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
    $
)