ตั้งค่าสภาพแวดล้อมของบิลด์

ดูซอร์สโค้ดใน GitHub

OpenThread ใช้ CMake ในเครื่องมือสร้างเพื่อส่งเสริมการพัฒนาแบบเสรีและเปิด ปัจจุบันจำเป็นต้องใช้ชุดเครื่องมือนี้ในการพอร์ต OpenThread ไปยังแพลตฟอร์มฮาร์ดแวร์ใหม่

ในอนาคตเราอาจรองรับเครื่องมือสร้างอื่นๆ แต่เครื่องมือเหล่านั้นไม่อยู่ในขอบเขตของคู่มือการพอร์ตนี้

สร้างที่เก็บใหม่

ขั้นตอนแรกคือตั้งค่าบ้านหลังใหม่สำหรับแพลตฟอร์มฮาร์ดแวร์ ในคู่มือนี้ เราจะสร้างที่เก็บข้อมูลใหม่ชื่อ ot-efr32 ซึ่งมีเลเยอร์การแยกแยะแพลตฟอร์ม, SDK ของแพลตฟอร์มฮาร์ดแวร์ และสคริปต์ที่มีประโยชน์ 2-3 รายการ

ในตัวอย่างนี้ เราได้สร้างที่เก็บ SiliconLabs/ot-efr32 ใน GitHub และโคลนไปยัง ~/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

โครงสร้างที่เก็บ

คุณอาจต้องจัดโครงสร้างที่เก็บดังนี้เพื่อช่วยรักษาความสอดคล้องกับที่เก็บแพลตฟอร์มที่มีอยู่ในองค์กร GitHub ของ OpenThread

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.

ในตัวอย่างนี้ เราจะเพิ่ม Silicon Labs Gecko SDK เวอร์ชัน Lite เป็นโมดูลย่อยใน 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.

สคริปต์

คุณอาจต้องการสร้างสคริปต์บางรายการในโฟลเดอร์ script เพื่อให้ทำงานทั่วไปได้ง่ายขึ้น ซึ่งอาจรวมถึงสคริปต์สำหรับงานต่างๆ เช่น การเริ่มต้นใช้งาน การสร้าง การรันโปรแกรมตรวจสอบโค้ด และสคริปต์ทดสอบสำหรับการตรวจสอบ GitHub CI

ด้านล่างนี้คือตัวอย่างสคริปต์ที่เป็นมาตรฐานสำหรับที่เก็บข้อมูลแพลตฟอร์มที่มีอยู่ส่วนใหญ่

bootstrap

สคริปต์นี้ควรติดตั้งเครื่องมือและแพ็กเกจทั้งหมดที่แพลตฟอร์มฮาร์ดแวร์ของคุณกำหนด นอกจากนี้ ยังควรเรียกใช้สคริปต์บูตสแตปของ openthread เพื่อให้แน่ใจว่าผู้ใช้มีทุกอย่างที่จำเป็นในการสร้างสแต็ก OpenThread

ดูตัวอย่างได้ที่สคริปต์ Bootstrap ใน ot-efr32

build

สคริปต์บิลด์ CMake ควรอนุญาตให้ผู้ใช้สร้างสแต็ก OpenThread สำหรับแพลตฟอร์มของคุณได้ หากที่เก็บข้อมูลของคุณกำหนดแอปพลิเคชันตัวอย่างไว้ สคริปต์นี้จะสร้างแอปพลิเคชันเหล่านั้นด้วย สคริปต์นี้ควรมีตัวเลือกการกําหนดค่าระบบพื้นฐาน รวมถึงคําจํากัดความมาโครเฉพาะแพลตฟอร์ม

ดูตัวอย่างได้ที่สคริปต์บิลด์ใน ot-efr32

test

สคริปต์ทดสอบอาจมีประโยชน์สําหรับผู้ใช้ในการทดสอบการเปลี่ยนแปลงโดยใช้การทดสอบที่คุณกําหนดไว้ ซึ่งอาจเป็นการดำเนินการง่ายๆ เช่น เรียกใช้บิลด์เพื่อตรวจสอบความถูกต้อง หรือซับซ้อนอย่างการเปิดชุดทดสอบหน่วย

ใน ot-efr32 สคริปต์จะเรียกใช้สคริปต์ build สำหรับบอร์ดทุกรุ่นที่รองรับในแพลตฟอร์ม efr32 แต่ละแพลตฟอร์ม

ดูตัวอย่างได้ที่สคริปต์ทดสอบใน ot-efr32

make-pretty

สคริปต์นี้ควรจัดรูปแบบโค้ด สคริปต์ และไฟล์ Markdown เพื่อให้มีสไตล์ที่สอดคล้องกัน

คุณกำหนดสคริปต์นี้ด้วยตนเองได้ แต่การใช้สคริปต์ make-pretty ที่ใช้อยู่ในที่เก็บแพลตฟอร์มที่มีอยู่อาจง่ายที่สุด สคริปต์จะเรียกใช้สคริปต์สไตล์ของ openthread และช่วยให้มั่นใจได้ว่ารูปแบบจะสอดคล้องกันในทุกที่เก็บ OpenThread

การกําหนดค่าสคริปต์โปรแกรมเชื่อมโยง

สคริปต์ GNU Linker จะอธิบายวิธีแมปส่วนต่างๆ ทั้งหมดในไฟล์อินพุต (ไฟล์ "ออบเจ็กต์" .o ที่สร้างขึ้นโดย GNU Compiler Collection (GCC)) ไปยังไฟล์เอาต์พุตสุดท้าย (เช่น .elf) และยังกำหนดตำแหน่งการจัดเก็บของแต่ละส่วนของโปรแกรมที่ปฏิบัติการได้ รวมถึงที่อยู่แรกด้วย โดยทั่วไปแล้ว แพลตฟอร์มจะจัดเตรียมสคริปต์ linker สำหรับแพลตฟอร์มนั้นๆ ไว้ให้ใน BSP ของแพลตฟอร์ม

กำหนดค่าเครื่องมือ ld ให้ชี้ไปยังสคริปต์ linker สำหรับแพลตฟอร์มที่เฉพาะเจาะจงโดยใช้ target_link_libraries ในเป้าหมาย CMake ของแพลตฟอร์มใน 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
)

โค้ดเริ่มต้นของ Toolchain

โค้ดเริ่มต้นของ Toolchain มักจะมาพร้อมกับ BSP ของแพลตฟอร์ม โดยทั่วไปแล้ว โค้ดนี้จะทำสิ่งต่อไปนี้

  1. ใช้ฟังก์ชันรายการแรก (Reset_Handler) ของโปรแกรมที่เรียกใช้ได้
  2. กำหนดตารางเวกเตอร์การขัดจังหวะ
  3. เริ่มต้นฮีปและสแต็ก
  4. คัดลอกส่วน .data จากหน่วยความจำแบบไม่ลบเลือนไปยัง RAM
  5. ข้ามไปยังฟังก์ชันหลักของแอปพลิเคชันเพื่อเรียกใช้ตรรกะของแอปพลิเคชัน

โค้ดเริ่มต้น (ซอร์สโค้ด C หรือแอสเซมบลี) ต้องรวมอยู่ในopenthread-platform-nameไลบรารีของแพลตฟอร์ม มิฉะนั้นระบบจะยกข้อความของตัวแปรหลักบางรายการที่ใช้ในสคริปต์ linker อย่างไม่ถูกต้อง

  • src/CMakeLists.txt

ตัวอย่าง: startup-gcc.c ใน ot-cc2538 - src/CMakeLists.txt

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