Build Environment را تنظیم کنید

مشاهده منبع در GitHub

برای ترویج توسعه آزاد و باز، OpenThread از CMake در زنجیره ابزار ساخت استفاده می کند. در حال حاضر، این زنجیره ابزار برای انتقال OpenThread به یک پلت فرم سخت افزاری جدید مورد نیاز است.

دیگر زنجیره‌های ابزار ساخت ممکن است در آینده پشتیبانی شوند، اما آنها در محدوده این راهنمای انتقال نیستند.

یک مخزن جدید ایجاد کنید

اولین قدم این است که یک خانه جدید برای پلتفرم سخت افزاری خود راه اندازی کنید. در این راهنما، ما یک مخزن جدید به نام 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.

برای این مثال، ما یک نسخه ساده از 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

این اسکریپت باید تمام ابزارها و بسته های مورد نیاز پلتفرم سخت افزاری شما را نصب کند. همچنین باید اسکریپت بوت استرپ openthread را اجرا کند تا اطمینان حاصل شود که کاربر همه چیز مورد نیاز برای ساخت پشته OpenThread را دارد.

برای مثال به اسکریپت بوت استرپ در ot-efr32 مراجعه کنید.

build

اسکریپت ساخت CMake باید به کاربران اجازه دهد تا پشته OpenThread را برای پلتفرم شما بسازند. اگر مخزن شما نمونه‌ای از برنامه‌های کاربردی را تعریف می‌کند، این اسکریپت باید آن‌ها را نیز بسازد. این اسکریپت باید شامل گزینه های اصلی پیکربندی سیستم، از جمله هر گونه تعاریف ماکرو مخصوص پلتفرم باشد.

برای مثال اسکریپت ساخت را در ot-efr32 ببینید.

test

یک اسکریپت تست ممکن است برای کاربران مفید باشد تا تغییرات را با استفاده از هر تستی که شما تعریف کرده اید آزمایش کنند. این می تواند هر چیزی به سادگی اجرای ساخت های بررسی سلامت عقل یا به پیچیدگی راه اندازی یک مجموعه تست واحد باشد.

در ot-efr32 ، اسکریپت به سادگی اسکریپت build را برای هر برد پشتیبانی شده در هر یک از پلتفرم های efr32 اجرا می کند.

برای نمونه به اسکریپت تست در ot-efr32 مراجعه کنید.

make-pretty

برای حفظ یک ظاهر ثابت، این اسکریپت باید کد، اسکریپت ها و فایل های علامت گذاری را قالب بندی کند.

ممکن است خودتان این اسکریپت را تعریف کنید، اما استفاده از اسکریپت make-pretty که مخازن پلتفرم موجود از آن استفاده می‌کنند، راحت‌تر است. این اسکریپت اسکریپت‌های سبک openthread را فراخوانی می‌کند و به اطمینان از یکنواختی سبک در تمام مخازن OpenThread کمک می‌کند.

پیکربندی اسکریپت لینکر

اسکریپت GNU Linker نحوه نگاشت تمام بخش‌ها در فایل‌های ورودی ( .o فایل‌های "شیء" تولید شده توسط مجموعه کامپایلر گنو (GCC)) را به فایل خروجی نهایی (به عنوان مثال، .elf ) توضیح می‌دهد. همچنین مکان ذخیره سازی هر بخش از یک برنامه اجرایی و همچنین آدرس ورودی را تعیین می کند. اسکریپت پیوند دهنده مخصوص پلتفرم اغلب با BSP پلتفرم ارائه می شود.

ابزار ld را پیکربندی کنید تا با استفاده از target_link_libraries در CMake target پلتفرم خود در 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

کد راه اندازی زنجیره ابزار اغلب همراه با BSP پلتفرم ارائه می شود. این کد معمولا:

  1. تابع ورودی ( Reset_Handler ) برنامه اجرایی را پیاده سازی می کند
  2. جدول برداری وقفه را تعریف می کند
  3. Heap and Stack را راه اندازی می کند
  4. بخش .data از حافظه غیر فرار در RAM کپی می کند
  5. برای اجرای منطق برنامه به تابع اصلی برنامه می پرد

کد راه‌اندازی (کد منبع 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
    $
)