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

Xem nguồn trên GitHub

Để 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 ~/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ữ 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_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. 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:

  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ơ gián đoạn
  3. Khởi chạy Vùng nhớ khối xếp và Ngăn xếp
  4. Sao chép phần .data từ bộ nhớ bất biến vào RAM
  5. 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-cc2538src/CMakeLists.txt

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