OpenThread ใช้ CMake ในการส่งเสริมการพัฒนาฟรีและการพัฒนาแบบเปิด เชนเครื่องมือสร้าง ปัจจุบันเครื่องมือเชนนี้จำเป็นสำหรับการโอน OpenThread จะใช้แพลตฟอร์มฮาร์ดแวร์ใหม่
อาจมีการรองรับ Toolchain ของบิลด์อื่นๆ ในอนาคต แต่จะไม่มีการรองรับภายใน ขอบเขตของคู่มือการย้ายนี้
สร้างที่เก็บใหม่
ขั้นตอนแรกคือตั้งค่าบ้านหลังใหม่สำหรับแพลตฟอร์มฮาร์ดแวร์ ในคู่มือนี้ เราจะสร้างที่เก็บใหม่ชื่อ ot-efr32 ซึ่งมีเลเยอร์ Abstraction ของแพลตฟอร์ม, SDK ของแพลตฟอร์มฮาร์ดแวร์ และสคริปต์ที่เป็นประโยชน์ 2-3 รายการ
ในตัวอย่างนี้ เราได้สร้างที่เก็บ SiliconLabs/ot-efr32 ใน GitHub และโคลนเป็น ~/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
โครงสร้างที่เก็บ
เพื่อให้สอดคล้องกับที่เก็บแพลตฟอร์มที่มีอยู่ในองค์กร OpenThread GitHub คุณอาจต้องวางโครงสร้างที่เก็บในลักษณะต่อไปนี้
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_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.
สคริปต์
คุณอาจต้องการสร้างสคริปต์ในโฟลเดอร์ script เพื่อให้งานทั่วไปง่ายขึ้น ซึ่งอาจรวมถึงสคริปต์สำหรับงานต่างๆ เช่น Bootstraping, การสร้าง, การเรียกใช้โค้ดวิเคราะห์โค้ด และสคริปต์ทดสอบสำหรับการตรวจสอบ CI ของ GitHub
ด้านล่างคือตัวอย่างของสคริปต์ที่เป็นมาตรฐานสำหรับที่เก็บแพลตฟอร์มที่มีอยู่ส่วนใหญ่
bootstrap
สคริปต์นี้ควรติดตั้งเครื่องมือและแพ็กเกจทั้งหมดที่แพลตฟอร์มฮาร์ดแวร์ต้องการ นอกจากนี้ยังควรเรียกใช้สคริปต์ Bootstrap ของ openthread ด้วยเพื่อให้แน่ใจว่าผู้ใช้มีทุกอย่างที่จำเป็นในการสร้างสแต็ก OpenThread
ดูตัวอย่างจากสคริปต์ bootstrap ใน ot-efr32
build
สคริปต์บิลด์ CMake ช่วยให้ผู้ใช้สร้างสแต็ก OpenThread สำหรับแพลตฟอร์มได้ หากที่เก็บของคุณกำหนดแอปพลิเคชันตัวอย่าง สคริปต์นี้ควรสร้างแอปพลิเคชันเหล่านั้นด้วย สคริปต์นี้ควรมีตัวเลือกการกำหนดค่าระบบพื้นฐาน ซึ่งรวมถึงการกำหนดมาโครเฉพาะแพลตฟอร์ม
ดูตัวอย่างจากสคริปต์บิลด์ใน ot-efr32
test
สคริปต์ทดสอบอาจเป็นประโยชน์สำหรับผู้ใช้ในการทดสอบการเปลี่ยนแปลงโดยใช้การทดสอบที่คุณกำหนดไว้ ซึ่งอาจเป็นเรื่องง่ายๆ อย่างการเรียกใช้บิลด์การตรวจสอบความถูกต้องหรือซับซ้อนอย่างการเปิดตัวชุดทดสอบ 1 หน่วย
ใน ot-efr32 สคริปต์จะเรียกใช้สคริปต์ build สําหรับทุกบอร์ดที่รองรับในแพลตฟอร์ม efr32 แต่ละแพลตฟอร์ม
ดูตัวอย่างจากสคริปต์การทดสอบใน ot-efr32
make-pretty
สคริปต์นี้ควรจัดรูปแบบโค้ด สคริปต์ และไฟล์มาร์กดาวน์เพื่อให้การจัดรูปแบบสอดคล้องกัน
คุณอาจกำหนดสคริปต์นี้ด้วยตัวเอง แต่การใช้สคริปต์ make-pretty ที่ที่เก็บของแพลตฟอร์มปัจจุบันใช้อยู่จะสะดวกที่สุด สคริปต์นี้จะเรียกใช้สคริปต์สไตล์ของ openthread และช่วยให้มั่นใจว่าสไตล์ในที่เก็บ OpenThread ทั้งหมดสอดคล้องกัน
การกำหนดค่าสคริปต์ Linker
สคริปต์ 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 ของแพลตฟอร์ม ช่วงเวลานี้ โดยทั่วไป:
- ใช้ฟังก์ชันเข้า (
Reset_Handler) ของโปรแกรมปฏิบัติการ - กำหนดตารางเวกเตอร์ของการรบกวน
- เริ่มต้นฮีปและสแต็ก
- คัดลอกส่วน
.dataจากหน่วยความจำที่ไม่ผันผวนไปยัง RAM - ข้ามไปยังฟังก์ชันหลักของแอปพลิเคชันเพื่อเรียกใช้ตรรกะแอปพลิเคชัน
รหัสการเริ่มต้น (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
$
)