הגדרת סביבת ה-build

הצגת המקור ב-GitHub

כדי לקדם פיתוח חינמי ופתוח, OpenThread משתמשת ב-CMake במערכת הכלים של ה-build. כרגע צריך את ה-toolchain הזה לניוד OpenThread לפלטפורמת חומרה חדשה.

יכול להיות שבעתיד תהיה תמיכה ב-builders אחרים של build, אבל הם לא נתמכים את ההיקף של מדריך הניוד הזה.

יצירת מאגר חדש

השלב הראשון הוא הגדרת בית חדש לפלטפורמת החומרה שלך. במדריך הזה ניצור מאגר חדש בשם ot-efr32 שמכיל את שכבת ההפשטה של הפלטפורמה, את ה-SDK של פלטפורמת החומרה וכמה סקריפטים שימושיים.

בדוגמה הזו, יצרנו את המאגר 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

מבנה המאגר

כדי לשמור על עקביות עם מאגרי הפלטפורמה הקיימים בארגון 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_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. זה יכול לכלול סקריפטים למשימות כמו אתחול אתחול, בנייה, הרצה של איתור קוד (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 של הפלטפורמה. הזה בדרך כלל:

  1. מטמיע את פונקציית הכניסה (Reset_Handler) של תוכנת ההפעלה
  2. מגדיר את טבלת וקטורי ההתערבות
  3. הפעלת הערימה והמקבץ
  4. הקטע .data מעתיק מזיכרון לא נדיף ל-RAM
  5. מעבר לפונקציה הראשית של האפליקציה כדי להפעיל את לוגיקת האפליקציה

קוד ההפעלה (C או קוד המקור של ההרכבה) חייב להיות כלול הספרייה openthread-platform-name, אחרת נעשה שימוש בכמה משתני מפתח בקישור אי אפשר לצטט את הסקריפט כמו שצריך:

  • src/CMakeLists.txt

לדוגמה: startup-gcc.c ב-ot-cc2538src/CMakeLists.txt

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