כדי לקדם פיתוח חינמי ופתוח, OpenThread משתמשת ב-CMake במערכת הכלים של ה-build. כרגע צריך את ה-toolchain הזה לניוד OpenThread לפלטפורמת חומרה חדשה.
יכול להיות שבעתיד תהיה תמיכה ב-builders אחרים של build, אבל הם לא נתמכים את ההיקף של מדריך הניוד הזה.
יצירת מאגר חדש
השלב הראשון הוא הגדרת בית חדש לפלטפורמת החומרה שלך. במדריך הזה ניצור מאגר חדש בשם ot-efr32 שמכיל את שכבת ההפשטה של הפלטפורמה, את ה-SDK של פלטפורמת החומרה וכמה סקריפטים שימושיים.
בדוגמה הזו, יצרנו את המאגר 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 |
סקריפטים לפיתוח, בדיקה, איתור שגיאות בקוד (linting) |
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.
לצורך הדוגמה הזו, נוסיף גרסת Lite של Silicon Labs Gecko SDK כמודול משנה ב-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. זה יכול לכלול סקריפטים למשימות כמו אתחול אתחול, בנייה, הרצה של איתור קוד (code-linter), וסקריפט לבדיקה של בדיקות GitHub CI.
לפניכם כמה דוגמאות לסקריפטים שהם סטנדרטיים ברוב המאגרים הקיימים של הפלטפורמה.
bootstrap
הסקריפט הזה צריך להתקין את כל החבילות והכלים הנדרשים על ידי פלטפורמת החומרה. הוא צריך גם להריץ את סקריפט האתחול של openthread כדי לוודא שיש למשתמש את כל מה שצריך כדי לבנות את מקבץ OpenThread.
לדוגמה, אפשר לעיין בסקריפט אתחול ב-ot-efr32.
build
סקריפט ה-build של CMake צריך לאפשר למשתמשים ליצור סטאק של OpenThread לפלטפורמה שלכם. אם במאגר מוגדרות אפליקציות לדוגמה, הסקריפט צריך גם ליצור אותן. הסקריפט צריך להכיל את האפשרויות הבסיסיות של הגדרת המערכת, כולל הגדרות מאקרו ספציפיות לפלטפורמה.
לדוגמה, אפשר לעיין בסקריפט build ב-ot-efr32.
test
סקריפט בדיקה יכול להועיל למשתמשים לבדיקת שינויים באמצעות בדיקות שהגדרתם. התהליך הזה יכול להיות פשוט כמו להריץ גרסאות build של בדיקות ש חשבון או מסובך, כמו להשיק חבילה לבדיקת יחידה.
ב-ot-efr32, הסקריפט פשוט מריצים את הסקריפט build עבור כל לוח נתמך בכל אחת מפלטפורמות efr32.
לדוגמה, אפשר לעיין בסקריפט הבדיקה ב-ot-efr32.
make-pretty
כדי לשמור על עיצוב עקבי, הסקריפט צריך לעצב קוד, סקריפטים וקובצי Markdown וקוד.
אתם יכולים להגדיר את הסקריפט הזה בעצמכם, אבל יכול להיות שיהיה הכי קל להשתמש בסקריפט make-pretty של המאגרים הקיימים של הפלטפורמה. הסקריפט מבצע קריאה לסקריפטים של הסגנון של openthread ועוזר להבטיח סגנון עקבי בכל מאגרי OpenThread.
הגדרה של סקריפט מקשר
הסקריפט GNU Linker
מתאר איך למפות את כל הקטעים בקובצי הקלט (.o קובצי "object"
שנוצר על ידי GNU Compiler Collection (GCC) לקובץ הפלט הסופי (בשביל
לדוגמה, .elf). הוא גם קובע את מיקום האחסון של כל קטע
וכן את כתובת הרשומה. המנגנון לקישור ספציפי לפלטפורמה
לעיתים קרובות מסופק עם ה-BSP של הפלטפורמה.
מגדירים את הכלי ld כך שיצביע על סקריפט הקישור הספציפי לפלטפורמה באמצעות
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
)
קוד הפעלה של 'צרור כלים'
לרוב, קוד ההפעלה של 'צרור כלים' מסופק יחד עם ה-BSP של הפלטפורמה. הזה בדרך כלל:
- מטמיע את פונקציית הכניסה (
Reset_Handler) של תוכנת ההפעלה - מגדיר את טבלת וקטורי ההתערבות
- הפעלת הערימה והמקבץ
- הקטע
.dataמעתיק מזיכרון לא נדיף ל-RAM - מעבר לפונקציה הראשית של האפליקציה כדי להפעיל את לוגיקת האפליקציה
קוד ההפעלה (C או קוד המקור של ההרכבה) חייב להיות כלול
הספרייה openthread-platform-name, אחרת נעשה שימוש בכמה משתני מפתח בקישור
אי אפשר לצטט את הסקריפט כמו שצריך:
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
$
)