הגדרת סביבת Build

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

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

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

בהמשך מפורטות כמה דוגמאות לסקריפטים סטנדרטיים עבור רוב המאגרים הקיימים של הפלטפורמות.

bootstrap

הסקריפט הזה אמור להתקין את כל הכלים והחבילות שנדרשים על ידי פלטפורמת החומרה. כמו כן, יש להפעיל את הסקריפט bootstrap של openthread, כדי לוודא שלמשתמש יש את כל מה שצריך כדי ליצור את סטאק ה-OpenThread.

כדי לראות דוגמה, אפשר לעיין בסקריפט 'מגפיים' בot-efr32.

build

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

כדי לקבל דוגמה, אפשר לעיין בסקריפט של build ב-ot-efr32.

test

סקריפט בדיקה יכול לעזור למשתמשים לבדוק שינויים באמצעות כל בדיקה שהגדרתם. פעולה זו יכולה להיות פעולה פשוטה כמו הפעלת גרסאות build של בדיקת שפיות או משימה מורכבת כמו הפעלת חבילה של בדיקת יחידה.

ב-ot-efr32, הסקריפט פשוט מפעיל את הסקריפט build לכל לוח נתמך בכל אחת מפלטפורמות ה-efr32.

כדי לקבל דוגמה, אפשר לעיין בסקריפט הבדיקה ב-ot-efr32.

make-pretty

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

אתם יכולים להגדיר את הסקריפט בעצמכם, אבל יכול להיות שהכי קל להשתמש בסקריפט make-pretty שהפלטפורמה הקיימת משתמשת בו. הסקריפט יוצר סקריפטים של openthread בסגנון, ועוזר להבטיח סגנון עקבי בכל מאגרי OpenThread.

הגדרת סקריפט של מקשר

הסקריפט GNU Linker מתאר איך למפות את כל הקטעים בקובצי הקלט (.o קובצי "אובייקט" שנוצרו על ידי GNU מהדר האיסוף) (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
)

קוד ההפעלה של Toolchain

לעיתים קרובות, קוד ההפעלה של Toolchain מופיע לצד ה-BSP של הפלטפורמה. הקוד הזה בדרך כלל:

  1. מטמיעה את פונקציית הכניסה (Reset_Handler) של תוכנית ההפעלה
  2. מגדירה את הטבלה הווקטורית של ההפרעה
  3. להפעיל את הערימה (Stack) ואת הערימה
  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
    $
)